From 14324390e8df33df232cca20556b39c0ae4e1c1f Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Thu, 22 Dec 2022 21:42:57 -0500 Subject: [PATCH 001/134] fix(boards): replace nRF3840 with nRF5340 --- .../nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml index c8472428..444de996 100644 --- a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml +++ b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" id: nrf5340dk_nrf5340_cpuapp -name: Nordic nRF3840 DK +name: Nordic nRF5340 DK type: board arch: arm outputs: From 77d60182bf1b4704601ccb9c1207f108cbf08b90 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:21:42 -0700 Subject: [PATCH 002/134] feat(docs): Recommend USB testing and warn about BT pairing in user setup --- docs/docs/user-setup.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 06c168b3..3becf5fd 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -193,13 +193,14 @@ To flash the firmware, first put your board into bootloader mode by double click or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass -storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. +storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is +recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. ## Wirelessly Connecting Your Keyboard -ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your laptop or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues. +ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your computer or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues with bluetooth receivers. -ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations on how to use them. +ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations on how to use them. If you don't make use of the mentioned behaviors you will have issues pairing your keyboard to other devices. ### Connecting Split Keyboard Halves From 080c47825f9985c6cbddad501a3af1b4e721736b Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:22:18 -0700 Subject: [PATCH 003/134] feat(docs): Add caution note about split peripheral sides to user setup --- docs/docs/user-setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 3becf5fd..961d1079 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -196,6 +196,14 @@ Once this happens, copy the correct UF2 file (e.g. left or right if working on a storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. +:::caution Split keyboards + +For split keyboards, only the central half (typically the left side) will send keyboard outputs over USB or advertise to other devices +over bluetooth. Peripheral half will only send keystrokes to the central once they are paired and connected. For this reason it is +recommended to test the left half of a split keyboard first. + +::: + ## Wirelessly Connecting Your Keyboard ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your computer or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues with bluetooth receivers. From d993b0343304c1d7f67837e1d5a42e70bf05a8f2 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:53:55 -0700 Subject: [PATCH 004/134] feat(docs): Refer to troubleshooting in connecting split halves --- docs/docs/user-setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 961d1079..a2e491b8 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -213,3 +213,11 @@ ZMK supports multiple BLE “profiles”, which allows you to connect to and swi ### Connecting Split Keyboard Halves For split keyboards, after flashing each half individually you can connect them together by resetting them at the same time. Within a few seconds of resetting, both halves should automatically connect to each other. + +:::note + +If you have issues connecting the halves, make sure that both sides are getting powered properly through USB or batteries, then follow the +[recommended troubleshooting procedure](troubleshooting.md#split-keyboard-halves-unable-to-pair). This is typically necessary if you +swapped firmware sides between controllers, like flashing left side firmware to the same controller after flashing the right, or vice versa. + +::: From c23443a086b62833ba0b88dd3a271993d3bc9cea Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 23 Dec 2022 05:02:18 +0000 Subject: [PATCH 005/134] feat(docs): Generate new shield interconnect docs. * Add to metadata schema for interconnects. * New conventional location for pinout diagrams/pics. * New component to generate the tabs for the new shield doc section on interconnects. * Add XIAO and arduino uno pinout diagram. Co-authored-by: Cem Aksoylar --- .../arduino_uno/arduino_uno.zmk.yml | 10 +++ .../interconnects/blackpill/blackpill.zmk.yml | 7 ++ .../interconnects/pro_micro/pro_micro.zmk.yml | 7 ++ .../seeed_xiao/seeed_xiao.zmk.yml | 7 ++ .../interconnects/arduino_uno/pinout.png | Bin 0 -> 118303 bytes .../blackpill/pinout.png} | Bin .../assets/interconnects/pro_micro/pinout.png | Bin 0 -> 492581 bytes .../interconnects/seeed_xiao/pinout.png | Bin 0 -> 495415 bytes .../pro-micro/pro-micro-pins-labelled.jpg | Bin 490463 -> 0 bytes .../development/boards-shields-keymaps.md | 2 +- docs/docs/development/new-shield.md | 31 +------- docs/src/components/interconnect-tabs.tsx | 74 ++++++++++++++++++ docs/src/data/interconnects/.gitignore | 1 + .../index.js | 16 ++++ schema/hardware-metadata.schema.json | 22 ++++++ 15 files changed, 149 insertions(+), 28 deletions(-) create mode 100644 docs/docs/assets/interconnects/arduino_uno/pinout.png rename docs/docs/assets/{blackpill/blackpill-pins-labelled.png => interconnects/blackpill/pinout.png} (100%) create mode 100644 docs/docs/assets/interconnects/pro_micro/pinout.png create mode 100644 docs/docs/assets/interconnects/seeed_xiao/pinout.png delete mode 100644 docs/docs/assets/pro-micro/pro-micro-pins-labelled.jpg create mode 100644 docs/src/components/interconnect-tabs.tsx create mode 100644 docs/src/data/interconnects/.gitignore diff --git a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml index 8ec164eb..d6eb89a3 100644 --- a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml +++ b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml @@ -13,3 +13,13 @@ description: | Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only supports 32-bit and 64-bit platforms. As a result, boards like the original Arduino Uno Rev3 itself are *not* supported by ZMK. +node_labels: + gpio: arduino_header + i2c: arduino_i2c + spi: arduino_spi + uart: arduino_serial + adc: arduino_adc +design_guideline: | + The GPIO pin references for the Uno format are a bit odd. The `&arduino_header` label is used, but the numbering + starts at the `A0` pin and increments as you go counter clockwise around the board. That means the `D6` pin + can be referenced by `&arduino_header 12` in your overlay files. diff --git a/app/boards/interconnects/blackpill/blackpill.zmk.yml b/app/boards/interconnects/blackpill/blackpill.zmk.yml index d3fcdc88..0d91e96c 100644 --- a/app/boards/interconnects/blackpill/blackpill.zmk.yml +++ b/app/boards/interconnects/blackpill/blackpill.zmk.yml @@ -6,3 +6,10 @@ url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 manufacturer: WeAct Studio description: | The WeAct Studio BlackPill has grown in popularity due to its low price, availability, and utilization of the powerful STM32F4x1CEU6 microcontroller. The BlackPill features more GPIO than most other boards, but also has a comparatively larger footprint as a result. Many clones and variations of the original BlackPill are available on the market as an affordable and more powerful alternative to many popular boards. The official WeAct variations of the WeAct Studio BlackPill are powered by the STM32F411CEU6 and STM32F401CEU6 microcontrollers. +node_labels: + gpio: blackpill + i2c: blackpill_i2c + spi: blackpill_spi + uart: blackpill_serial +design_guideline: | + ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the pin labeled `17` in the diagram, use `&blackpill 17` in the devicetree files. diff --git a/app/boards/interconnects/pro_micro/pro_micro.zmk.yml b/app/boards/interconnects/pro_micro/pro_micro.zmk.yml index 78aa14a1..83aa31c7 100644 --- a/app/boards/interconnects/pro_micro/pro_micro.zmk.yml +++ b/app/boards/interconnects/pro_micro/pro_micro.zmk.yml @@ -12,3 +12,10 @@ description: | Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only supports 32-bit and 64-bit platforms. As a result, controllers like the SparkFun Pro Micro and the Elite-C are *not* supported by ZMK. +node_labels: + gpio: pro_micro + i2c: pro_micro_i2c + spi: pro_micro_spi + uart: pro_micro_serial +design_guideline: | + ZMK uses the blue color coded "Arduino" pin names to generate devicetree node references. For example, to refer to the pin labeled `0` in the diagram, use `&pro_micro 0` in the devicetree files. diff --git a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml index cb9f6b56..48080c7f 100644 --- a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml +++ b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml @@ -8,3 +8,10 @@ description: | The Seeed(uino) XIAO is a popular smaller format micro-controller, that has gained popularity as an alterative to the SparkFun Pro Micro. Since its creation, several pin compatible controllers, such as the Seeeduino XIAO BLE, Adafruit QT Py and Adafruit QT Py RP2040, have become available. +node_labels: + gpio: xiao_d + i2c: xiao_i2c + spi: xiao_spi + uart: xiao_serial +design_guideline: | + ZMK uses the "D"-prefixed, green color coded pin names, e.g. `D2`, to generate devicetree node references. For example, to refer to the pin labeled `D0` in the diagram, use `&xiao_d 0` in the devicetree files. diff --git a/docs/docs/assets/interconnects/arduino_uno/pinout.png b/docs/docs/assets/interconnects/arduino_uno/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..b796070063248fba51053a609c1e73e16584efff GIT binary patch literal 118303 zcmd43c{El1A3v(6wuVD0X&Y0KA|0nPMm$nV8Imy$j?!R0W*K|72g#5jLn$g{o-&?e zY$wT-Df4t9^Grg9?q?tLeb&1F+_ipp-F5#+?DHAk^ZWIFe?I&8T~ocpyo+-e0|NuI z(&Y=+85nlqz(1xPTfvj^#LPS3zl+zDH7`!g&dz?^)1=AJ<1Rb*Vy}O2NJ;r82K#@0 z|Naezyoh^q=rEuE{kw-^e5;z8^xmeXzssEY{uSlj`Lq7u?L**MY~6AYr;U;JrmLPj~;tFl`^2 z$}v$`NOR#iYk8n<07*Ci2dFmh9Fi^|JxO;t74yVFr~c|Yin@@(^!8m0?>~NL8u?lQ z*`3xcZ5Di10i8LbKY}EvX8k&VZ>y{La-r_5P2xH2hp#jD@%+U=5HvLmaG{b~W}k^i zS3<3Uc=mkW2^AvwVX&A|yPfJv(=zw@ho28IFob2*xi*wM#@%sG@4pjPKr2BZoo?d% zya72e_?(3oU#v5mx7MQIkrS+283;!c@*3;{uOD#e6t3w<@~e}`==kc&Q_J|z$({*toM1l5(|*-L=>e{; zf_I+#_l@(G_IH*x4h%O+Bo1dcO!cVC+$Ttu;uIg7*gdun39#uy^w%h~3_hWKfQG}% zuW^&+288ssW9ejc%>RB1V^a^l&El~b-kF)P8cz{C7OT{+c{XDh88KsG{AyBm{8-Se z{u4e2br)5$FxCnSvs~wqZbtgtoUQ{m|U91u#;)e{q&&o&^(p7Zp=X=l8WQOX##z)Sk=atucAzJM7R0xq<~hCWk# z6#D35!XPz1wjb$jH#Z}rQww&e-;-3Ws`#@RCVLnjQ2CFT-!Q#@bGV4`B69Vz_(}8n zbJb9GcHjP5k)mvzYCKZwAACV0rnOgqfx#|VQ=(U(8Lx{Dx=P`lYutzCFzxXoPF_7XsUx>tWwHefQff{q5I^U6z;;-!+R~3 zzim?hbDU30Xh^?EG7L@A5NbQy`on_}Ug@zXqoYgEv8AOiH00Z1)^YyZTG|J+Q!3Ty zyF?|*&iJ3DkPa`J+Mr3TFPG1mcho^;)rF)VnZfQXe#0Mj2(-B@C4U6O*OUzX{r;0~ zW+QY$Ph7wOoei~bozQFHlPylf1%;=)#VkvrF=OW1+66%W6OCe=_8r#*$)J7*g9zvBB@^=8NA_*~jA3Q2Pav1yhMjpr*xa6WspsMT+MCN+uz^g04H{Qx5eRKm(Hutk^O zPcq{bi4trVV7r?}C`i_`{ z6+OD>fRZk5b57Y6q25eU_*gmklPlRDej7K`I;Rit|sbI#LW7%_IU_vxMed-5-x4uXNi!gd(OuM*D{=As;R{IYo{Dk$yYh3zBdm%?nJq5X08WH?H)9Mu+o?H+l3f(#Rz z1GX`pNuj;Lv#aE3U&#LYkX9CbYEGKsa92GiGrJC7gVYy zW^h>j;#0|(>ANy-Km9vWWBPze)maZCP9wObCJhchnQ=Z^mF?sQtq{_63FnhS=`6NF zDr2(`aPhf3A5suzt42Z3&l&}^Cw*Ua7|SG`M0La286LDhw9=SoGc*rtln}~ent3tR zcjxX;OBJS+&i(%;)Rx@rr1<^tcrvz>wLE!M$7$i?_p`AzrrEJBr-yg4oJ*3pcnkP> z*`87@entic5uvUop0mmg3NqIi<0d1|epeL)8HE9_OB%H`W6!XDQ;74hlV@Of4;6CX zpEWaMPxGeu;utU9WM~Q=4`cC^Sma#X26NBvkE<1EDuYU?haUJ5r~BJo_b^xwAjZFL znu)epoOUM?j_=z_L&6Th+j^>@q0e=VAp!@+`;ooyw)fBg!T@s*BDZ4s1G0NA^TI3Q zWrrB>pP?=IHW%9czHCQ$JmpE*O49>*2I93qb{fLbct1dp^Y#eU5Fe#_*767g{y4mC zdN*ED$K}Amj6DnX@>?0Vkmd0^$f$gfc)1__8ETE+@c@^+cPo+n0H=-9*xzAFsj(+{ zOS&$0UCc{Y;iiC1!8#PuneMV|eD=2Zb7|RLub8dncXRq}thR<{XLdy6s{?!{K0)A_ z*iDA)0@B$wi0f*maaXb4!s9=Sc*4&G;8bhgrI=5U2DY=U`~%#V5oBaf8jh9v5g5HzaVH1ls~;gK>X3hxCLPYfGq4J;Y{w$0S8VngZbG z?y4Ncd<+yIPznt^lx?;DI;WgnCpN(W)}W8$S7u3NBVj^KwZp#q{OmuEhIK?>%=~tU@vjUNfuZG@3K(`Wh zD53hsFMT}`m}!$Bi(6t95723vC^qo+6%IPxL~?Na#WT-uJz)B2gI*rnv93?anx;>y z3R9=g7$4g*(U1JIPC~W7$AqR|zD$~>#Vh>_NTT;o=Em*%$^Dn)@Ef1? zk*j{KI;SNftP8udzUVb1-Rzy?Z8Cjv>&*1KT)fTM@|1X2^?0{j@9N@ikE-tHR<^!= zy`Q0qm8&cU2816{jW5G6sZJaJJh+XR*$k;o;MrAg^Z9QtzScTyu#edWT~?H8ekkOS zK|8Y2 z^BE1W)_VIee8Kp1dsH`6mgCDSZjxDuW5l#y1-?BL$sT37 zo8-pPK@;tkmq>2ejxzg%`FtkKqH6|_v78=gYBFESI{c1B=E9hR;fc9B_X{6&6-$OE zRtcw6q4zabPrYwSc4iTHc87c&W@0VB$1KEtkyXG;UYPEX{q1;4k^|~~(IP*|baA*J zX+0!j9$`~me6JvzZB=9meV{&QwxGen{`@Nx*UUe=UrhBNt3Vi<*(miFU9c8#k)rKw zxJ&bmV?#l7l7kIOoNnucnjXFKcbM;8jh{JfSOJ+&2)?)sdFEOOaWI{DM~^QvZm>)< zl{9d#q?R`0$hJ>AT*lD>eYA&Q&ru^;^tpH&93T*!m6ImN|1AC={?v~M1LY;>sRJ|w z78IhA=Iy`CVAFh4lsO6uNcYL4u2&w#ywA2iXukB@?swFMkhrALck(*?{so1*=EJ0kk7P?O*cNxft1c-PUA3Xp90`*YDH{@>X z2`Z_p4{^U6&d~`?=@g0dToXBz;2Y7P{{Sa0`E`$=d5m_ZzO&@zo)1?xBwC4gj&2^% z6uh30ywhm(fG5`=GNJ&=0B(Y1VV3<|$JpNdcKzSW`wLVBy2k^G)wsRGb?M>7xd1nr zt?-+ZIPEF~E4OsF2Aqg=Snz%k7C&oU@aT+2+w*u_tboo_g5G&}URUSMMaBy0ci2>J zTwNmOQ>ED`$r>K-bW^uFTba5WW&tSoJeitQbIRXoaN%#(U7bJPwdi^+JX1jXUcGL< z*Fbs+#Ciz+c$!EKf0r7HOHZ&xld16w3dHFr`PCWn= zRUMAQE`9d17lXE7R)}wFfTkYpuN_7bBvt$PW#GtKCl%lP)~3gVb1ezlxH- z)7V^gwpqYYYl%1}+tA-Sc^`)b%BW`O3`%pux81zoZ9wQ1&a!@X;g{y~OLtG-j^=AK zOPS1DnZJ~#tutZ5PRC$nGiH(6$%SqdN;t8=5>~#)Z=N?rZo6Jf<*X7fNceXBhVXgW!;^Cx+h=(uRot`W2)IaZL zw=m)o>9BrQGwV&v3}cG%CaA>id8>X|LD!)>X|1UH@!k&uAJvCgHR$=|rU$Hi)vRS4 zX&A=qau>i0I}WO`De!Uy9yt?Od-lcmNJ3cso0Q6XZj(EjUP#Qt>s~&E^hP_vHL_8P zx{sZ^i76m-&#dn24|>F@#?ADF&B{9=kv8`QM;8ny956~GnBI8oEDQ(ml2LamOTm1W zs)ASTZ7NOkddshxkn8KD%;24W&-;qQ!t-WNWK!;YiY!ryT`DWjMM=DHO;_X>9P=@S zXrlvzNYiJMZ}sCuy3f8-{>he|!9TD+m3&pRA2A*H{Jx14R#iyS$C3qb|I-kHkcij0wJjWphaQx(ddj%6AS~ZCiE+1##A59#y+h65 z8f6JP^`sv;2M;E*rRCt+YmVRZ`&3ADx-qoXsR{yXZ-}n(vrH zLf3h&gee!e2B(#KcQv_9;fxsUq~e+(uXEeQrp(OIdw4p>ufH})>b#p2%&o#$7N*L* zF0)fHzNv+&1NuMX-*n_R2A$Z!Vuy~`_@tnCcD;zCl&HUL8u!hN<0Vzk!>^CM&~<00 z`-L!jDr@YcPSxfTHYa^~=a;yaZCGd55r;P3 zfxB84TjI~%=AJ~vP?8!Ppr2KuQTs}qb(JwD#O|W;&ui0_#~3kZXt>0v_N}lTDjj=v zUOX;|KW$)KrfTHhc)CtR#9!TVvH@++%bRQ z_00sU)6)e)GQw%I%`sFGz93b~;reIBu$|r$rp7v=e^-4HY~1}${wdwqPQ79q@2_4F zNpNPGxY4~k->(V&9r9dtCTA{FPQ%vaO1pE}e2n8w`bN4@4zdeB4$D+loE;;P=spXO znLQlrb8JL+I}iWnlOM1;FN@C}6)C-}rJ92WHxQgMyzlMd6L-E<{1vw#dxj3c$np&D z>$vyv)>V07UD@}L+yPeVUjTGrnD0GAk9=4s^#8>_Bd)H@jGqHoZO1zHyb1@TfAxr~ zUXVUW1@3lfh_B09wdwc;L0?8JIlYHm_h{?vN>J9hc>c5H^<)`g% z!F%e`TQ9|Cr<=LE>^Gq6_!Y(1yL7G%+`G|`{L8TeM4@XilL|gcoX8)cT5#V^+oJ-* zyt-L9#aul5GvTyP&|J^~vy18ZxE>ZRv#<}N{tU1i-tYnyh#>PGT=PiNmq-}9VcE-j z1}@^|`&xOJ<2zz2zYhH`5ec4O?3<6cf{*QrXsd~@2FLz7C{MhG-?3g?cs%QpEL5e^ zEVK1OqL08uJYx1|uAhmsm8Tw}<7!fdZswkNZ`b8%mVsK^-i+DIpEJne{kuJiUwwd@ zuD~_poEO#iF#Q=%y9Ngc*`bZ`>OD}Ce`~X%b1s$U+9m~^H`2q~AAK-81s7EtCkB1La!}kB zPe~@D*MxR%zjza?SLk4W{L{tfuM=NiCWa;_eu7Ti;Z8kMG#!ld$-=eNU9{BW_%qPL zSc{C-Kf$$tF3phfts$h;x0XuMEb)2xpI!6Ax-2qYXFhXG+k0ui0EBb*8b~1xr#Rq# zo#hBv>f>>K-p5|+=;)A&*4GAXr3_JWV)gM43lx|F1bs>9`Y(o|&Zlw9U907!h^AmtM6K<;YL zc3}X4Un9L~cFTcJaS>lNF+$c&gT{{6%@(j3a7Kfv=~=$sm7j1C5vu7g%+HFoiUN(S zS5`b<>bp3uuda@>o-g}l-P=EeT$Hd(+Y3n8+-Ug|;^bT4>t^~y`^iJD7QWr#W{Yjk z=uN`Cb2tACItJ9u)Mm@&n}v&i%ct6psC(lgoQPV&3ETgS!R4s%M(ID6G#lpedn8S? z77QFrN$YjAMT?3Rn+0FC?EN#c@HwgZv?s|U;^`w2!Re}_ap?6d=To`IWd;%TcF2EJ zXCM`$o^Gbog{q~mPeA@vI?hv};dzk%0LKoUl;C*NFkx-p*KKC|s*Y81izd&i1CM)n z$xrTJwb@qd5hU#eueyT<`F?lEFT?(V!+s-w!vR%z_S~i8m|xKiR+zW6>!$j>`O9-g z5niY^TWaT<`yJ01;hL)3Ux%Y_{!c<&iR`c7W~TDx^qq{ITA7MJJ0irBoX|wK;6$5R z6U@^AXIt>P@)u9$*8A=qbx}$;Yk4cqC1%yw37t9L!T&_wI||tLdQ6Bf)1m6C-u3bCUvZc%6|EvM{s{-XLYzc46GVV z<3w2Cu42^M=2+J@c-!F3(utXs8fa!8p5623^5jX6$NJ(s@H=Yc+kUz@4kEg;r+U6i zBxy3?cPOj%t~|hj$c8SpxrQ>r+v453tV-7u$mUMB4N3Nld=MxKPkW>C@m4od5)YCug!}?U}*)@{4`gr?x0e8e8Hd?ukM+#wYLF zO577$wdN0O0Las5tH?VV^8PxoFwAfuF9!G{SLUyc$vUW=IOPyQTpD}?gzd(Wv(F3n z*R8p7?62?0qmN*8g)9mC$S73pSWj{H)YqKTV7<@d^Z`@V%hZ=!yyy?;%uQAQT=hs| zWCB72)FC(zD?DW(2M`=k6|qi`*kh2yG0NrfiHbEq=R3qO&j$ey%M;iqrv*VACH9Fl zHv!tPyh{OD1Rw%H5Dg?dOoQ0cRoGm*KVVI)Lxjh;l90pK1;E@V8w;%`miP1+*W<&! zITh?opMfn6*8I=ows1@CDYIVl!Y5A5t`k1v`>VlR%qmf6$O-L!`Q=Ic3o{YHNpYzl zKq;UJ{3PcQ$@Syj{e@VnTYq$oo(C|$*aj0X<0a$hA%A@xI0E-YmoEa)zsbb_;A)+> zPZ-_wMX&LmTDNz(EM|A?vgB>eoHqA*~5o#rQhSRWe5NpqJ@b6tDWn&1;>sYV3z zHdds4&?GngJ;gg8&w*e3;{Fi}UZBoJVUub|t`n+=HUeYmkL0N&zGHYw5$C%ZAT!J# zh|{<2Q1-eBzPy{{6PtGd#0}SpyA~LQE6G~76d;fRL`0u29#Q*(wIAsO5@iZ&hO;Dt zoR$`xzYsIYv;6J9iC<+i{vwjK;gt@<9@{OG^PlowWWAgHnQ}WJC?Rx1aY189O0&>P zNrtwP(ou2H6OCClbD*X-Kf=jYLm5mb2IUGg$_+OeX)u_s`pbY^4n=-L5)vq+a>|xX z)&ubDAU)FU5!lNU;1*QcX*y)Xgnt}x$Qz1_!7LxM5xVI<*`T2cbDB*xVIw!~0DM4W z8Vk}qx2GU>t>K0E!1Cb@e!==^ox`TwUlKD@a00Pwd0`udH+{<8O*An@FhalBME4X|)1#+;qF?8+eLdZWZkwK1%w=2PjgPujHOy z*W=pTktNIFKe2#;Ioy{qWcfL6GQk1uqH4z#kXG8K3PTL0O)(e89CXM5Es9A4=Vu=( zLmP;MPawQ)7&;lW40qw9lt+*yCfnR0{h`@>DZ!kl{4xbGz0p=o80wQK>7Y|Hm#Rx{y6@)SSjiB#0s*UyzdlU zj_b~G7c|Lan}0ksuUE;L+`&eVc|f-0DBPzsA<5S`tN0s_qjqg7OtK!b#vibbcS2RJ zAK$ZXada}>l5wAAJYq$MI}`DXP3NX}lw?Ah~W$~af;KV~b*S7(cwc>XLs&fG9Cp@XxlmEZ6VpjY_$ zlL?K3A1g;&w`K@L8OnZ%&DgiDZMlz-lTsG%>d6pbxwip&521B$Y3fz0n~IFy2uO0k zKr}E5yXuJYTO+M?wnlGOv;SC&22fO@Vwb)M!^9PK5A{z?}j@| zMEy8W`oGC15j4&Poqx7zDcD?hZ~|@l*Hh7j(qQd1 ziSGX{Yha58D?u4z-{ywVP92DgSh-HEd zJ=amUtuqd`XbQ)H3pPjp2-y~Gt%EY$533*7^vW2ke=8+l)Sa^#k}$7NDWqBIp;to| zW#dQ!tiofY4(dM_=xd`o_Ne4jnhL({1^XO@R+4;%U#?Vnt#D*Deq(@>13GcUs7p=| zeuIF65ZjDBa0I8)lmg@2S?5AQ=FM0(P=IA>N2|m5RMG2E2Jte6)3d#s$z%E{K8k;N zOrLwIZ>6FJA0;)9@0pm=`2@k^$np>TKg}9fFC7)D@sJDI@JHD?NI$9xx>V{cB=5mPbkg}e=}fflOXhN!}X>G@y^d0AT{FjQ3G=L;2>M-S2VFe&u!`S<}&!NP(Dys zTcc!X&)dna!_OleGUN5!RyW-qi#Hh~$g*f*@@IE#)PL%B0#{ACY^X-rI`iwEDKdgk z!!Pd2-WkETFMgpm>u5ig!LdZ92{LvGxO38U9?ehRP3$&u`-0Qhj7R6~&`)lM6$>qa%S@zq}{&m*t(k_X^mFUz|LPot%exzy9iJts2B01JD`rkP_m7&?v z*}u`kLxy*Fl{ftiC`NS(abU7Xn^hJXpKt4#ExlGmb@`{SctesHV2rdwmA5Qfd9zVT z>E3TdpAjq#p6G7a-)G1*%uS{<$sqH|&WMPkCE;Fkp}O3cv8o#r14y@I3rE&MQmCT$ zr{F~P)$YDhgkN!K?dFCoup!xlNOXn4v`it%$_f=-`2AtehuIu2om2m%@=FxXN)a4l z-;|-9w z0#810V*a7WEOqh~nWRd+r)UdynmO-}~# zhx;VlW%1~=;hOHHG$^7F|u8%d&|9b?7UzWs>YoG|* z?f-B;_Z^AeYd{bhCRyDh+3YcH{w*TC>H1ipI|?=uG9mvKCCpg@NC&oV?S%$J;!KH#sZ+pR*r2=AF@80 zddQF*|LG$VovDJG@D#X|WE#$jll?nl!&${)lzxUkTi8Z#(bJyo^YJ$+|Faqpd8oA8 z-$G`S%UazC(&q_sdyTE4zHNpz0PktlRGLunTTkjM@votMA5^>05)wV3y^o_pPQp@BdWED zI59vt4^CDhDt5%1=DqqZQAAFI=?=V4FjYR%$c$e)ak@pjt4Hb&<8O%sGU{DG`n_Fs zJG^ouOtR_NJ~nMw5HA%vai+xNU!_gfzDj?9jG7>v`QtZFho`iU1=-$$a82qNo4!Zu zq>^YzY#&m2?)wSxy_X>AfU1)MJkK6(<};Cg#8{n5njNt&lp;=N?J*E%uMrjr9US7Q zal4;%cx4NE?_fTxD<3U(?R)I0@yzk|b zT>f4q?q4khn>+bCpoid<8X`filJqQA{p^`0lGUDXOMHHt1FUuVb`z()Y*AhgW%C2v zf?vd549=qbf3)z8(;fiTD#-KKrN$LKK2yijXyT9GbH|p~R_iw{p_q?IHl@wb_h@I7ie%ZVSBfhB$pTTiJN#o7+L%%exj729-8}43^=Gh=enD z2-1(0_3*4l)=G@EPfudeE@BkvjD?wjxlw5egGi}H^@`)pUY(fg?}(|#He*i4^jNwI zBZiUuRvdj;#UK*y#b|v{_cOGh(ApS=rMPN4w1!n23!Kw-cBq}G?iqh&!#!b=bWW}N z5b7}t{2~=dx{wxx^LPTV*k~4GrKNFS*LA*g5r^o*M7|+~Q82G+97EL}w3a;fdiMyIkxa4_Z48+@_7vG(XHppEE*qHiX&LF(OIPFSO7Yg}z zs$Fh=x@m{MfG~~&6(`Zo8<6=nQYlu6oihJ;lp_GR-Fk}x7B!r{Ws6>UM=!@P;mW&z zj19rvaX1mQSvCNs7S*Y=?)*LweCZvn&!CuH$s|q-5p6)E*kI<@LpeMw!=UIGQ zrrVU9FmOOj!Wf5C+A#sY!YtgH$)o7r3pU7aD@<(fXAP$PaUOZNHBsby*{j}+6QY@v z?x{$9pLrJ(&$PK0$;nb(8|@)lwgKVBYVcC|l&AG^nBCJ_^)%O7Pv$LckqJ<2$Ix?- z@CU%mA-JZ1^Z_XE%z9C$>jTV)UUQ>KYPsQ{3e05oaVqLhn+oTI&ZT^Etfred=CqVU)35N9 zYZ84(7?m_U0jgI{k$XkpF=iCe14wN#-_hHkjtRw$f(u`mcYT#^6aznw01IDl%uIs| za!=ww-zX4R#JVYr@(31^2!_)ybUbWTw%usWY3cQO&Z*uSiweky0H@x3 z&1u7iNdjvyfd-(g2zVwDOP2xG0H7W^06KKT|HB&(y@A2B{7It3J?kRC8e#Ci^ez-V zd^p?U6CZ=Cdi3_jc`R&gxFW%DGbn-EO;XgCvNzZJ!j6}?`jE~o%O8uN^}fxt5{RAc zn!gizAah40aU})3uIEAOp@4OFi~WvN@Oq`Js1@S|#aFt2IL+PC2wZG)Jx0nR(z}I# z8CsgNYk)-a?<704|1pzQI+uWFpX8by{^!AdA7j7vxVuiFxbs-pcz}~NEuvA`-BQ=o zECVHFtwO8CE2r)%t(@=;Ear>mS504D8E?pAooa*|h0(Xs3K$*G?X3cNE?OfrW3 zXm3We>!mNft32ZDzguGK3fV;-vT&lqrd(JYss`ONcka8=oy7BnS4VaFk?2_KSnrvk z?ASWbxDPIAg%<)VdS_>+e1D#p`T6#Om^eQ|=ChD+gS{#(&mM2pDzh)1p2`9)1)#JdNNR$s+;}3@WwmQ;|c3Y z4)dN^@zx)SV|!U_RPk-I8a<#F1|DKYX;ckKM86}F!{qh@T>yW<8a*R;N+nmFl8^RPa+_j&{ih{FxWbl~dBPFV8XJW8HK9&EjEE5X|80BEelxcF&(JJ0$nb z2_!+x$N*Ds3#oz}UDv>8ELxtwy3;d-lv?#2vCy)SYbrnu)J|h8pvCuHb2z4^Eyq8g ze|o5=xht!8(@B9}aF+vmvpz7}p~-yBRNCm34E>*P^|3ZSo%CRwEDecnAd)riCqAng z8N6TUYxN(5zxV)L`eU|wh_gy&Y2JtHIZ_gnZ-Iqu8nSo~CO-aRTCXocq0NH%mgKGA zr(NQxMr3Mw^~oD>mknKLGYxpj8@%#rCDVEnB9fMx-7$Ea+CN~=T0qOb@^v%NEC|GuL-}s*&!AcdR2ltI{rKA-Com&^@eG|KZl*)2hAws7nwNLacbs^ldt-a zt2NN}+)EX!PF-IH5w%4PI=ti^M5K@2#4n2XLqoQxvpDSbq4yak9)%6N3QWr4kOV|iG-L2Xz2GX`r6>K*Mt?@ z6_%yUPJ9hCvL7az&;b`n<&lo)1pce+xK82G%0n;u5dYM@EYatq*AvM_3aNO9;lZWl ziR;8`@QitOx=wJ3`6Y?e8><;+%bp3+L)E$q#cxqaP0T47yeD!WWfgQxI*vo?Ozx`jURg=3eBA)iMmGkw1sMDi0) z7hlusTb^R8RuA)pU_r%t4C%c0!RxU!nS5y*m39@})t?`ZNX$C-eVT(sjy_hlmIZ%va7wZm26q4(PoL(5R$61Nf3yF9~ zwE45=-Y&*f$ux7Rd6}>AF`kwO=BE|{e!KM8f|rt1YG0T+pc-{N@E}t7Ma2I_79Had za)IPyx3C{4N6+kTHd8ONY8R)Fh<1W$;3mYam3?^1gqXgmuW2G(-XG(|f3c=Xf$gJ- z1P^n#Yu-)8LWF*P_>Z3fA;4o-Hy~~C$DIXw=+{{Q$ihQs5C1@ z*rMpCF)rFS4Rc}V*ErQ_YpaVl$*2ps{!AhD^1xY>pRH(P#&$30m{S=XLhbzW>M|34 zaSQdsfvXanOZ20+zM&Y(jnEYu{c*#mRDl_{9-n{w0TAe8JMAtWzw|O13`+@o6dc@2_4%m@l zM}}zyFr_MW_w`j}@rx?f_2A|)Gk$Uc$!(I(FQld0SLc>mXm1lIv;e?!;+xhXl9kyycT8@wzX4aX;H<`~qe#?4xUk zl}LEj&;NHcZnqgFts$|BubDzy6L47W(04p)B-}gu4Nr-l^;5varkre={e0U!2lOy= zz5}P0!y8VxE8?$`czws*e78JYkT?&jjg2ev!wIY~x*HIBeppe`niBz;{)>*qR_%Ey zv}07-Jp~m6Q(`c#@0I~!Qo{F2oMQN6&CYFwtEY;)9qUgPih!5*QYSF-Kmo=(h7=z& zGObT+4Cx!{PRn;f_ZmTbn6AK0;h_Q&aUTU-UW6Zumf~VY!zV?*LTc6raoVy@bgTtX zY&q2b`aQD~x;TPgJQeWk2s^#!2tH_o`in}>^&vKEmqGjdCYpSV9#_C^11WrzQEdNV zxaMRV3K{VoNZrLqcjq_H?sV@Ju7-HW!tb%04GpdAdq*nI_NAMoJly5t?dIy)c~mK@ zcWOcI>g=SWK7KJNU~PXET`SoIG*Pu|!$ZCLTNjqKCMOm^2k7v3BxB`X)Ec;vjR`IW z$Cwd3rN3ACXNs0QG$p|=jZeHFGi&z*+ac=beMjkXDQ&~Uy`o#MJn|z60AN4giZ(gV zjo6@(B6}la<>)HS`8^nPM{;`)-A-oaOYSzo?x zj<8w#`99b;b5HFMJ-Fz>&uLVd*(07`F|f>yjceIrpd^>-{$KOLTipPK^p1D1K>52hS+=I59Nwvo(t|@9x0Y?DoS3D zvj*fJM`n6(Z?0VvUA)lJKWps>uh3gMKup702UWICU6{L!t`2xH;UAXXYC7b_YD&-E zQLWG=kF)v1pSj+3OWY%Eap;rKLIpUwYG;J$he05wg?P!!*DtfMrFt=yyxk@KnI^p6 zDiLr()nn_*5$iWditG{H3@?vRk#uDKG`%3{DT6LCGX@@T<6|4QM4H7fGa4B{=C|qa z4j6P$+ZBtLk$hE1`nq0vo0{Fh7SFp8>v&24znIHAQHNH~6lU^RAV)bw?@Tvqpn3qJ zfXp$~hZr@yxm1Bmrfn6_eIn1yZ~YQ!J}nu7v!a_6xNF-8TD~Fq-%ha!xBBU?g=eNM zy}zlMd7Ux8N#?3My~b@fAaiqQ9`@j4Bc6*#j&fN9qn1P*FEMDBb`_0#ox3|WsJe?^ zF}V~chpRi6jFg)M<4Ov4X;;$tMIOl0!yaHU`1PP|=H^`hc`vBKMQ%B*yGO2MC?3ZNd~2=b1E&o zGWyaZjr9h=5{PeH@sgvL@f6vk^PExh^0w2Y{?8slaF-JqWrn%I3*HG$gE>;ngz~1k zm|W>WwGz(XQfBl6rA?_^1G{bzqe6+U z^1g^YIL94~`L|h%szAXoh>WddRv$ba)oTN0$H9IJd@IZQ0l2s|*fJLT&6t+rpaaVs zW#-h?IaA`}CHn1M1Hu<_&IFuJh-;nx3~i^<3fjDyZZJwrNUK_!>C@AkJv`oUejoGh zUhw)si6m&cUr*(&W?T+U{S=9g@69KIBYl~0&Max)>5DCvcuB_)$$(Q<5ZKfUzc`;e zX5!VbHMzMQYE=q{43$MR_V3P(XKy1-?VDMol72=Ng3MqcbUPTg+ZLVuE|YMWt#4Fl z=3{c6YwEQvpg+S8uOzYMoy#dxcs8FgC5hI*6(Z*HaE&)ho&IOnr2YY3P^JUL4I&Ak zo01;Y_pTYLU}lUH!AQ^C16%Ce9=Gb1(U^vJPR=T;gI;8LC# zxGh#;hdO8C()A6<5;Lsy0P6e_%`&T@zUmxrk{50BH8}!zNjUDa?yoHfWrd$h zz}(t=2Ps5#ws5=MbeDQ;ht4Oboui}?xgRaPs$`6nB4(zAIlKN0bokbPNrghYOr_nq z4s)km;nw<%E63V=)5dt`QDJw3+ouv)|_b za90F-y0TcC6NPp`s7;0xj0>7T%35EJUDHo5dAQey$)~{cwQ~o!$R}F~EwGjM)(?8T zvPwsM zPYPVzZYm@hG8U$g)EQHD8`!aRZa2ck{d$Fq$phdJ)Qau~i*U!4GGncVv(NpvdpY)L z$NNLsR8kF;;Dn|&y;%Ec>~7XRW4@0gVAQjj&Wjz9Y}8WNarmEC?$e}TCOr6x2yxvO z8@yx*Zf(`|S9pPn9BWZ0ZBWy$D?`vEQy%mwfw>QX`vA+N_wn_Fq8wPIp|%!#yhKmC;xPR ze6?gVf^~8hnc#pEcBS>EIi!mh+BA)|om1`58=%#(Saq6W#c_x5UCFf9O_}bd9C&9l zo^g1Vwfx@*$;_QU39g{l>Q!KDO=Ef8BjTstX%|Z0d;FBAo5wZk z9B9vbZ08{68&&1qeIc3i=?7g5tVD8m<8E%wJE0tz!hVNAQE^%_aM#ZO#<<;{k2XdS zMnt{s6Gu3A=brnN%X19etnG(tMHY{orcAn=S`NzaS5GKapwqVnc%Ytqx@B@yz37nr zSkQOlL1N}BaCgxN(AX_6`%H-hi&1 zx8r6{)=4ziygErR2e(;PI!;p#+F$JKPX6v?oIAE)P6yLdlgL=dmIo)R{q30{h52JU zoxtr;R7q=E=-*|m*3Y`?Sh%HBozBxFJ}O7$0BeET5d%(>Hqj-fI)Y&^lWGRSLO-DB z>4MaFe3!g`)nsZYC`qY)l|6kI+xNq1ipOMsBi$u?@Dw8lZhV`EdE#!!+^JqR>j`oC zM?crVf*4Hvmq}J<-MFF)X-W8%6ay>%A9}8ocO(Bw37Zs=ijw#Tk*mSzd^T?+-QM#Z zQFj$)N-H~BFC%FDmdht{C!^DHvqz-b)a0Wa6{lOw44G)n8xS6)dhV zM%lm1XY{_wvxFBrML3uyXXnS=)2D7nm+}_+n)TYE3$*U_=6F#qZZf*RxIVLsSSah` za)~M9%uPZ@TH#8TpwgO$Ov~Zbq8X&Wfc8^)EMYZ&{jMp316TbLl56nxhIi6EdY)#E z5;}ie&Dm!?=Mnk6ncyjx_gJi4CgU+hkFnnvzi3C{^^h%fD=7Bl9FkiV^3-cP;wrh( z4W?1>QTBO7^=%SeHYUdRy#}^>6|RJf7tkC!ou`vx!v7q1$u>Z(wGgdd)Pj)1EX2fI z%b#CsNSX;LS}9-pd+z!zHO1t;a+XD;aHda0@}9AG%MX9k`+s=JaNH-cVxHB6z!9S6 zZjsh=q2Db;dWJ$v=hVo&L-_`M&S(Uu%?(Cy_{YTNR=`9@sS=K;KqoFYg~j)aB_9YZ z2Jt3K7r{%gQwxJHFS^ggB{Oq z_{x<(J!cmkT)QaX*LtDk(4RICNqHxpV#q zT=3<1o38Ed4AFAh_5tMf*`BcHdBlN4}%_>4O-h<>M0S3*KNB=0f({p-#tsPdY8?zJ=?f| z7j-;`kyf`MmQQbf+g3WL zu>v5mX`pjFk#I2CK394&CLNhr=b8duGz^foe_;RYbo^@cD=E&E+|p**1#sQLjY>=E zfz(8v;aYm*oTur#Xwg;20E2HWP~xTH0yP+Y;@|x<;eHgxb>00f0)rP#OY?>vS1m-= zK>e?-v{L#fM}*o0ysX1<@gv`&zFiyCMH8dNEW2K>1?%nils-ac`9lw<4 zK`wvqr5c~?UzJ^6GZ%jR^>?3dMX9?ke(?^Tokgplg~v%v2ff4L7Dk+&zN=TkRnqQB zBp>j&t^;%@>5Gf;NtGr}7xI=T64m&B2+1C+EFpO^bxYztms9qqGzu-}4aj9=&^vUv_3OO8+VtA& z`KRO3ZMPEZw(F#f8UK8G+GeQrSM0pqnC;V*j)K@1I1lAO%1gUQ*VvpB2J+h$!d)j_ zJ|biDBleu39O6@pgH)2kyPs_;J)gQ$ZBF1N9g?EJ*%|mg86}0g)^-V>rS{d7SU3vv zw9X$lGPJZqNtXa@?I04Y!R-sDIw-|E{k#1+$FBTJ(tO!e#Ff}z&uF>&@rv7f&%(;) zspEeZrexm3DyH2Is4DAcO+^>)sM|(o^p*3&l|nmlRc ziPP82Z&z5&icj7N)VD#sD?#66nM%uR7R-C0qhx7=UXyOVst}(ql5hRvMZnp@2HEA& zZqTY9MYyQ6?SshCxat8{71zmV;jA#6mCqVUmCaI}Hw+g)ukAQ4VBK%kLSci6QQ+OT zqG;TtiOQDcPDsSA9c(rj#nOWSJ7E=FmP3o9Wt zaDo;c?<(sUmTx0r-t`EFPmPYkfeV0{?uywlCsJDqNr}-~1sAuUNcg5AG#IzD+pK(f z1?Sx9@)3NS1s}YULnQZVj65?SjPxU86t70D>odOdr>L}7N>xGKU6x&#uaVK)T7J|+ zJylR=WEK1EQ-S(;_KqR1ofC0Tia^B97bUyBw;K9?taCs;$GCpuT@9@Y4i3+DkG=h# zf9|%Ugduj+2@as-#*qa4mDaQi#F;bhO+7A4cc;}(o;u5YqILVyxt|xu zcb8tQ_z~PW?o^rmV{xe9#;?Nvi>dE`YHHcufA?zeNf0k82`EJcsUbv=BK0C7B2^J- z0YXRV9jVuYQj{Vfz1l!}=)D|i(ov9JLhl5m6Uu*b?|c9ETUp3*kuzsz&&-~^zy0k! ze;5|wWLBWv`elcX@nbJ-r!w>9Pm7xd>+4>#f%3lRCJ$|8Ww*)Cvl{^xG6Su)XM`2E zt!c-mOeFmDzk(;){Z=_Qjix!2l||z;05*#gUL!{6a59LtHB?Z(nazXw>ISk|xwsDk73>MN}zVcB?@a#GO}#kqGz!8$GFb3E3pNOM(eb_0A1>sctU(0;bo zr?=2FA*!XC_PCAE%5z?fF^BegcvJ5To>&?pl?4(|qibA)v2j&P%b^b!OBtNuJPsN# z=id<70@fpyO*+#EdD9Ycu-0W7&I17M0oF=-3f+z1e`jY}O%V2Lt98wjNa2qZYf;{m zo6>6cZL6(2dDEuc3fFYgtVgy=ADuz5#~ISi8M!J#dS>AH$BUP<(G3?4hmOCB?3v+5e|Jfkz9_CyeE>>mOChRRoOm9o$J+c zPxktMA_VE(L5O}o;KV6Z{2Vj(?^_$sQkJxyp_9r+2y?$z1(HrmbeDF(P~kH8LW(}fKmJve)X(QHE_ zNt-y1IO&*!;*~6X6{nB7;)~KQJAP&_9Ti{v8~oebogkoX+R1!ge!B)HaL)zN@w)L? zQ&(8b!NP^sPJ}iNd-__qnP2DYhY^ICuZpd;ZrAN(k#X z$`9jvXv2~|uio?lc1L3*40rS^$^mDr;=;z~iM_YZ)wg7i2>pme?hkCei2PJGenlFK zE6L#}`hSw|CnV|-g?^WEk|TX~g6XwJHP-mlvb1pcjE`%zrH*O>QAISaod|oOK>$?% zPFx-XNaNLUs$BEh87?^Z9$E3jS3o4AG<6=FYKn;1j#S!-r6p*$JpUbX?m?qpUT@#s z-3mlLb}s{PLSjUe(id1W-QXlz)>NsCj#-mJ31B1}4kDrw)WUn7UYj(lPv9uI6E|b{ z!fOU%HNXKbS!yJ*zn$=-a5`@!Y$Pu{X8UQ-Sqt0sK6{Debns3ZqejH$Yxgipg28(C zPjXl9*TdG>pt_>p-4l~=M^VnOY%+em8x+)t(@cjENat=0A#c$iM66DsLnv+@eS$KP z#i$_pX@)4utzKy=5mB^?%Ab?9s3vSgMm~6-y%IchZmeL(@T7Qw-m5Q1ec5#)lW~Fr zjd|%Ye=i(`?x^~jI()%#oJJUoG75RjJb@q|=7ZVat&?|Li=WSv(QOKURa`GY*g9XdJ^hc%+r!@HdbLG$un@`&y0 zkfxTVrVHTkgsMH;FhN|U=8$;VFO|yJK$cpo-6W{@}KXY z21j|>?xB!tfi-<)c7$reM&!#x z-;fkTy7X^6!0ydk*4E3`jj;YoWX*bvb8eJZ1cMF+T0$bgr~x6|ORJWGOfUl0s|5OR zM30f)faXx^G}O7KU9$i43E=*YjAicCj-`~2^sXJ~9Z`Pn@E;G`s#i^%Bu&&+Vn+|- zeHs&wt#@p@@u4P87xj#~U2bpu!EAHLNH@AMas4sTcr3#7!h8&CMUJEsWlz`W)0%0i zt0HZwt2=y)>|u_^sQlqPl#}&F{0j5^3gic30#o?jMe}0PB!Eq&%slVW z>!LATBDP};BrSmLUD}hfR9li$T)f)!u z8Y#}WDwd7j79^XHrs{lu8h@U$rL+lnuY;y!FkxZPh^123NdMZwlAnPy3_NYiFf^v^ zYxWL9**C(npfPD3@5f(b?>^Mr$xX~t7%~rd)2pF6czRu4k` z$h3O+hrQL>J-Y`eZTFKXq)b70xeYQu3EAI92%Pv@ACZ2Nk`ICZvmHOKByD&|dHY#P zD6ZvR*JV6(9$R@kl+$zFyY*jn=Ub*LqV^nwo5>3fPeY}Xw~cyKEl@n*hEV1JfNVIx#@KSZt&*?v?>*I)4#p$bRJmFQ ze(hD`i4V|*x6wHfuv%Tf3&~@zO4?c{kf6Q_?GEA+duE+r{noNH$ggd3vH*9t;Fjd% zq>RkXBI9UUwHfH7J*CWKGU7}|f^W4u=kCYb@7|O@H8LpM^X}r~!spx-roL{yT)Z|AK1za4R2QKWN$slhEx&9R zH~hNY;pIMP@x8ZxI+IiiwQ?c#_3Mu%Cym-88)p%7cf@q*7_}CT&}eVqu<~KcnJ;a1 zHrLH(k(B45SC3ZwPD*mlj8^Ivgh{PfmFTl7-d~)vY+M_UzYkzSQZaU~Ebq?fEf<^% zE1F3nJ@6md$s4R&Qz*U$>*fc*;z&}j5kIDmLK5AfiU7oJ3+2X(UqGr$V1pQS5rPP` zgx7Lq-~9z4A42UT{A(HzdHKz!(cfUbpk?*$a#(dL-SL%QULFN_ocP#?6JuHF(ZIrF|T}qjCv2H0EvdIHO27Q;az7! zDIgX3QuQ`~+@f~nm!D;i(#0iOY>MQ>JxpEZt{KMBrw3+M5H zK;>GkWelvXA%`u;ffth?e-I{lR6bB(#QFH$Tfpr7{UGQ}73l*dXhMNTGMkh=522X> z7VXcEN>4nONuSND-fkbU1&uU-*oWkScH_r-5Jkk3{xYs0?LL<-ul_%8%9!$C+KT(rnxZ z&WP@1j=Z|M+*k}c$y6;~y&WMa6PF%1yA*Bcu!Z~qZoi@03x}hD z%?~JnDZ}!$8c9s){x?KLQZce9D(C$-^r)@hZG$*pUwApbYyOCiaRuvd{||j0U@Xpv zR7$;!3AP-dex82R5D8$C{`$bU`;?77+b&8;O#O!Qv3EO=8hI8vN%0Q+?^m))@_trm zWIJlfpOSAmp2U5P-?STHyOA-f7#=u~#>)K| zwmZ*B#pUY}XKpZM#L(p{#+O&#VY!#8&ef|_nY;2dcl0s)hT=9ui@C%x8_n7tdGX;F zYET5sO_pwJ+WznIeySaICDYIxI?2fw7H8w}uL8<6@u2HJX$#RHO8DgLS%Ij3i=MlX zqZh#`r2~?l^xQvfYhP|TW$qy6(9-%pWKrDV9VJuqVVUS6EooOT4k-~&C2_p?kRIK#xeYBS4wO^0Bb)E_TGe_fa9n%Yv ze}4uEUaUz%31z6ToPP(8)w9k&f=kV)Ik-I1z&qa0hh)v~0Sqj=Vb}ejjtV$ZPEcLf z-Wyfb{Fe(rohOin+}vtIVg##S%bjxxs z*oIRsRB#K>b2hENyXG>XF@i4fAr>!70A+u=KWJK21h^E>pDRaBNTzbGs%dM$Ym)u4 zdj0b3_m=~tCjf=|r1~YT6P&3;RmZ|0k!jZD%bTq`Zr_abQr}lS=$@0AZ;iB_5)VnGF8z{ zmlJ%CB6^(Z?c|Bu=#b;; z*Pu_I0mcS2S1W=n#FW4l`qZ#SJm)fhCq4lnaiES0eqEbJ{>|>I19kZ~0%4y(?{xwFZWT|Q3hc4% zF1%}DPHg}9*~(?Cz43F`EKvNS<%O@ee|Ltp9|28YEOe7Pf^LNUSmU*k8yB*&8*{H2 z$K3}T+jJl(+YA>5PUak3<-O0=@4orS0_>c}fO{af@LN|mdxq+%jM-VJW{ zCMlHzjeinNHCVzHp;*TI!!)M@(q9Gf$FdCh0nR8e8QTemQx(+s5r986(Vv%v^oYMK z5ArHV1*z4nDcR5ofIJbv1H(H!MjuvR(>N&5F$ce^Z}?HtH{IaA5cJDhRhx)ygJH?Y=19_STW-KMNZQoN~*HEK=$mrH)fp zJVsVLW0ntE%7l+>Jieft0}a+?Vt-A>)f{HR!A zv!*e=h0_LMc$gZ9Pmpk25DvqsXtBp2)#jlahJaDkh1hk1hZK<(bw~5*P+&I3{1F`T zi9AClluws8+}=|G&O_1$6c}lL)Hb-`p+Xkg zo9|Ag@cXK@`#!4KjA{8%2+KxHOD|DmSh`)OlrKEbb7%XJ<1|ix;PZv`q4;ZLdf;+q zZ^*{csLlf#LD_WfD$)?e4((GVP=j|;J1YDt?(@%R-C?I&OrE*7V#mbyL17>J1Q0S{ z-}s32xV!?f|4_v5U4u&RUPO-hFcaP%*NFxc-EGIOq2)&o! z$XUBNM6N9-Wrv{g)yS@!pj<`MA+&6~YyW8<;THf|$oPg=brskWL>e|t9`EE>wEO$DL(lJM*d;GTgTulPHTV?l6F+H2#;Uk-~UJCEa=A9D#T_n)3A0@fNo zI;17Zx^ljfBjdfZYQE(CnZNM3+gy~Rqv`o}RbS>vgHz6+{`^kvo!9QX*H20*h6d|( zpe)_-y9bT4U8L0J>4s}$sLtm`;7Vyr+wk^jtVg+TLhv#D?M=%5b%Q@aQJsV1$Aw6& zN5{{Xe!jVjObSy}Lb6OR;^f$X`$mQJWd)sI@P;rfJUq3OMfM{Qs_T(7$n;c+y9$Lc&|;pKeQoyRcWvdQ|OU~+%1!8@61B0316t1bQCE8h}#Z3joV z2fT)55@R-)PEisJ&haeHIfGTizoW)HLDD&8!fZWu`gphKYu{AW7&dc%F!#ga?HC_^ zYr9v&PJ&C^V&$HuaZ>o z7HPqqR;$IZ$+uT!?3NN&BzQN_lo#ERx{kkotjTxbL@XFN?x_fh`W=lqovk4KY%i1m zfTsMtqpt0#o3H9p@D52_DIlF~pZ`H+ zHlZQxHsh$PYJ`2Pr{4MM@Wkzjy6G9HE_(83BoI|Lj0i`d56LrsSGu2#-#xT4L{0=>$(l zh=3KU2(Rq7zah?xsPeqJu#x}u^ZvQ;rUzTAy<0!joN^2^Jw_|i>rS-EP|KTB*z4#V zBA}N`%|wC3uxha1YX59PJhXNrd2DXF(^T% zqY*0TLbeTcq~jBsY=d=*Qx^GVY|S*#CF<_*oAX@T-Se7WB=P=hXm5Ko=C;9ZSR9DW zBFiZ!G@)oIF3RD^*Mp#N^NGrCk>sa4xi0X8+r-K7yRtXOsWo24>X*(m;5zOX(DOwq z4W686?oM4j{qH}n66)uByWF0BdM4@Fov4}dW>4B*r!`%6$O^7Jd7^w-Fi}?{E0qD+ z_KZ6cB0hR>9ur4V>H8+!#hNLm!LTeDTyXUjLb`}B=Kpia>B00~$*EH{#H-T?zz=c0 zwHs(s4H(#56yn57dzfMBu*&cMKy<+M~n$Q6J_NR zljcZdo3H(PXMLHk{jU~*FS+cdc+K?LvgqW-9Krj>a3{v2?>c%bD}1o7f}=Ox3mbaL zh>fsU$LuFr_=MeYeri^)7Y#_Q*?(G}`c2RlnKhUF;b+E3vI3r>{^~spb?WtIk^9=& zP%C*N0^UVwD|zhV<^3)c8B@8}U!gO_B)`r%{E5~dU+8O`;ic^DknSh?wto31af;Q; z2|~TCB^i%2`U3Ki&L7A%J2`)Pi6=})6R(bD z&#(wCfM|h9Wqh`!{v!u&x?{0rdqq(Txaw%)wMRJm-p|b^s?}d@U&thu2^$jW$)7CX zXEh7TmX(egdKz08oh`vP<3IY#`sum#^)-INX_ea+ulEYiB(p4WpvvCwb7o_{5W&P1 zkhFEz9X5lcI}w3V@X-0zNT`aiUiW-=QllbmrF*v~y6AjkE+f+L0EIy>cnS7ti!FCv z#|Hj3ckwbL#-4pkBf3Z_>o1Meo7d?~=_iOT_OR0(CF@Q&_=-2-e5L1;P*L~0)!{)Y z%(IJEzdj$O{smx}R@=e=S2 zTb7YXA;TUnW^e3sjhIWLEdD2*HD?0b5ZMu)7D(EkhR*3gW_TUqX*qeA==|e@v-m>T z?|pU33UL3IhPD2dO8zn;p{Or}SPf_Fus%KGx9a#JmoZ&CkB@`8+6%5$T=i*ecarm8 zOlfC})*ARV2iC$4tN3H=;Q5JXpJ%JiWcMcs3m^kJU%$9xl#nj@M!fGbYMxGiLg5wJ zVwKURLv5@Jcw?5?kDIUT5&KD}R}b>00^Wy^*%k)s7apu)o(6rNLUV-GJ~ zk$ximo$bUe?*r+*Gt5@5cLkX^uy@6_f9<-VQ|b37*#dhJPUW>EwHyEKp|z^yJ}(=q z|B1lfPD>l2ii4)1c07F}UBud*K~Q4EiXT(1KKAz-0K=g$u(v{W?4L;h8QpOiBj$@C ztDkn>`TV$i&E{h+k%YbR-){nw8nZ`HqIDAxf8tluj?k}ZG&Zsq^>7}sDP}}%Wd;6s z225aK)AhR5y0Y^XX#p^3k-xgaR&U--^2u*6usr|SE15+zP~Q0NsY@HuP3jR} zAtYvR!bj^U_DK7#m?KL|{=o8fBNT$>1fNelnEMaU6q2Uwqs$0QCh?`wY*zT(+LI_ zw>(6n8o_8Tp+M8(124$0jS}ldp0;X9h0d*nq;H z{4=@6RCTIX8AD$$I27+s(I;{`9QGRyA5Z++xVKswn51~q%Wv&3Bmml zd(UZ*wZpYuvdp%JpI1x2KSKICRFfKl{?C`~;6Q^6Vnq|p~bc@Eh6lDxm~Ti-HhM_&cOb2NQm4`b~-gV}_`&go8&V zLIHdKp$>S?OOLq7s@BXM%1O5NDQA}5lc+=(tp-Lc@ft^;PCsQEE^N3y`2)ICaa92b zM8Y3IUi|AMQa8CdSpVFbJv^c9scMva@{>|K9djgMdtNx43G94;!FbC~^@Klqw!u{a zWdB88A6Hm!XyQI-uDEdqQ?4I@d^7_!ja1SJ)<#EGdx4e@gpfP^7gcN?)vvw%+IaN4 z@O&vLqZw%-ug(T$uxcKDgV)iES4#nXf zRvfZGyt`cp|2xooq3t%B5Bm51C2sqqH1e~0D^0;w1)osFas*^CuA0wh`fQ5lay4KB zfqHDMh=MfsiZmWho-(m<3@wVKV;cU$kpQ|ykF@A-R$k!>FP{jyduqJ5Hj_-ANxdR? z9~*=?`i3xH%aslhON1(DoHK;poJKzC6Vq8Yb}}-FKJE4-T4}gUxqx)WS?(aHAnl}r zFn*Cgcf)O@TDL6vLn=@-ecC#>+OY1+H_0+KjOWs+GkG1&@{z#fql#Fz`h(5{NW2O$ zT@V4?n<+7l3mIPtMudYJ3rMyRXgA^)sJo(YLafUq_zs*NYt(uBq03IL;oygGX;M)T zZK}>Xpf~$88d<_CHy_3ORiwo!z^n<(`m;wrsM`GGq<*9f=&45TKo z=VgR@9daG*qWA12Bwe%GgJEi;XRP_VKi07C8Ap?!=aM>>Zq%B<;WH425BLLqeX}Bs z$x!9q)|T7I=b=BdrRryr>3}?x1me1MZaJ8=#;?h6<}%;-Mlp8(qcokq>3wEIRvbU98}0^|2dWwI<jWBZTQ{i z-1uA>G0;Axw=x3J;JLMaE(_HD*_JUCP8ZZVT*|7P9QZ*>^xI`_NT6NB-pCJ|Iecnl_>2Mx!AMT>NX`RH@<$8~Wm zTDk<2cnr-^%|P&X0iBNRRUHjkeRKHprH<|}pm!CL+o4_EsFzXibLT>EEcl3nUl~xL|2QueyYqO zciLuhau~Fdfb!crF|5_)-Wa@Pg7G-OVD$-ymCNu4iYe3Cia>XL`X1qDR6Mii7s&QE|ad(Mw$>`dO zKEGQ;LLz;Q0A!6tuh=o$5aRhHUw-aalBywpv%*>>(t-#TI8wNa2z^a@LTraOlz-KK zs^fa^zpALFy+L0=%7>xwssbU5M+{!0DS0C3OU)>0VKjn3SqeiZsUh02Q)2(3pmMr1 z{Axr1+1*l)_of(QM;(LY1>jalM1X|~Dc|#Y8R(WNtl;l2|L+&~)XfKMabHq@n!(?y z*&JUYx`hmhJ%rK6OG5`x^7BUN=&=J#_AdQXRGhE+Mc#f^x&Q&4IjAhta4|x9BTkXJ zV;`ebY>R5mo>_cb5jk^~W_O8`ZS{IHl+lgY6hSzj%_^?+D61uSZOr|tLsTh|d})n* z{mfoM#6-@RND6tZLA-Vo$X*l3erZV+oTFyL0l~)dRcP`!MTL!7-{22q3IKIKEHFq< zDGFyCN0bDfl1lBKwLKiJE1U4G+Q_@Nm`He%Dz^cBJGr>q3CF&ku+S$ zVV~YKw%Bid3}80q3kaeaeq~}W9V~7Q+W#i9v%py!X8WhM9!^LT^o;|3t8Z)^+F%n5 zQ3W@R^o$jMHhVmz#4`E}DGC#=R-)+aXpmhG5SyApuGE$K9K#eIsiwYtq1^_@eEdmv z;VpxI&91>Yy8#0W22)UO6%+-kj2gtI@khyKlCNJFy@hA*{z1eEzPTcN@dP#6FX-xZQr4f#pzJ|Pa515foa59L>zY=bLOdQ+PCrgj! z;Bwnkl{}Xp#3omsr$r+G&>IPy&qwcKQHS>N z2;l}%j#ff>EIwBvFzWm4nW!%Jt4u6woNhvXGZM_mT7fUt>prKEk;pZ`wUR+Lh0Lbx z+NPKM=r2eoUR7X~MXLnf+q%)KsTc|SJh0)4=fv;}>)6Fc$Fm50(Irl$?bLx2$sr$) zQ~&kOoUfc0!L9d70l72EG z&ZIsCwouJC#2a4L_vB2%za_vBeZE5ZwipkwKXLJNTam#v_vcQ(I-A^xf=NFa5Jo_f zp2^5@J2^XnMO!|d6<6ps^_fPfyA@TZjEU>K%o(S%c2ml0TKz&Oq zLYXe+dzxQnT2Aau;QJ`pK85E$ZL#R#64|67fd*F3Em(B_#zy8>YmSSLi-dm-AG+h) z^IupWojxZbu8}|A`!)vq>1wYtkpw%zFWf1=epF&@EuISnQLW{RC>w77?pFdBj8($* z$gQg2DkC+U=8IkO776|GQ%mn1gaZl6VjHcQX((b4q_ZCPx5d9?Eiic6uX|R2 zOTfdZfQRs0D)b}I>uHx}dd|5MUUgw^w9U`yh;u6)yB<{M!%2 ztJ?}F%r#P4lO8e*#@YQ99foC&qN7)`N#z5)H5s<>79Y|%?8)%-H|tMK&2(W_M7+1f z9GwX**rJbsk$PB6YTh;yabB;aU2 zx`bjWNb}KNBk92J%^dK5tyU8Y2uWScf_r;3$OM{m!-oIH>xZ7NT;U+k-u})Fy?DC-R84sb|~iYtP^s4 zCTqC9A%I#5zs&i+Zw7;#OjR&*e z;LHGDBL9iC0=KEK;*y%l8@Bnzb&(^C7I0z*to}G_0)yLg7CEXYk9FUz&rz+kB$P@s z3Sv%TmNJ*yRC6_bVVs>^K}S=NHYq*ilyvn%BNW($XqsL#Re*K{sRv6J!qWD-lnHE> zWi5WQB_LPE#0idYpM7`#t;BOI&*6j9WIvH}Q|G8(Eg=Z?6(!QSFzN3woL3BO)xm!A zfX~u5b3%Q=&hWyT^XKYUR1-NBaj^kcd$Z(*CQ2ossM*YlU^2YM!G$hfCxpM)SPp(g zBz<>=uU1hE&VPHchztq&FBbsx|C3Lna4AcCf}&KvfK>6eqn9ePlU$W&t>HhgL-6mJ z&NEQ!7^Mw&=5ITqCu#DW;O#g%d&v*^f>u(iRw{#rMh+mu2lRq>$)?V^itqXl61E8>6x11jESlMh4Kz#aT!(?P@Dka{wFSa{SK-P(CM_4&g7{|5ho0 zn+si#W{ceupfG6mT}O_ybGYsbqPKi=NRrIn>oP#OFX2%vNuok}8|zlE8Mr;#?B6e+ zS{J8nd%!gQU_*GKI+`(Y`>{y2m(VUH*6G>y^K63`arqj=a()Yi$HU>}cYQWacCB=kWw(t{Y3~-n{ z$_lifh9eMI+VO=WY*z8cKxlLk)SePpkGXU zcBN^zlIN;`!>826Tx$XG;+Ii6V3?ku{NT+GB=|H9a z(AMWX9P&tDnS&|>kdIq%+2Y~jt&7^0d}^0>1>){LocW-h5DFp!3dvs~UBTijDN2!p zIrpS1>|04a4bLk`MLs`|P3=DV+Rz}q{MSMMQTsh zYkfa>hI!j~nbxtjwK&1Iup&$uKX0f>7m*U4*F^AY=X6nU`a~wn!F!JWx6MA$`&~BMIY<<&U&7+K+a$mZxD0kfRAxUHGD^7I;S z{RQAeT>)CG7$K`a)HXh>vs{uZ5XTOt^lt#r0=9bW(!k%!+1pOf)qjf4l(@CO;XSmR z>2p}?Yt+56- z1`k*~HQUct=Ep5N15e@o#1fhO)}7f8;pO(QccJ}Ds+(#IGXOS$5Wzv{5{rQ|(NCFY z?vAtDD@5HbK%{y+`#o*P@x${*`zh%x0fk%0du95>@1qQJz@mRG5sctyAG;GNcZnV= zX(~CDq|+l;vy!qr7>r0&(01DKKAKDZcF=MWd60-KjX{TKc^8V9=MBGOIEwmHwx(Ca z{K9w#RY5dByReQR^I1d&8l{r%cGb?I6*Kiw*Fkipb`LV?EwcGP(`Hh!XjYx!(cvokrj7HX^%K95 z9aAS9~Gz8@=2Q_+se;*kQSz>juoRn z-E_5{uil+XD`Fj^MD>}$k9#?kRe`_`+>pm5cl3ppYRvAwZtYudAg{C;xXlD3Y;SI_ zNLzM~*U8v~fk=D|GCf9a^G)UZ!_!9<#*yT$d$& zA5^}UMboX}8v*F7_rAW-(`AT0nv;EhY@-Vb7vcDq<>8-E$Bj{f`j&d~_151btgMlu zkB9|nTFVDClil5^uhsYcPF^}=bmWN=@D&1TG5IJWwnWO-6qbSP#gM(kwF-hdlrvhnvf!L#?cW;cv53sH!XCvk;o=F3Yo#-SPM zcl40~vH_ks#U$$j#2NPXz2xUxt18&RtQnq60*xf`YDv!Bv;Sh))6}|OvHRm+$GSM- zT&AcH6~Pq4Ck|%HQ!`#=smt!^T~dX)h$K@J=o3>}LUns8U48viClg8u;@;Eir%)_j7!LR5`|}@l)=NgRr*GoEsex6fhdP?4 zUoW5c9H7j-N02osZ8tb1RBS%TO`lEG>ES>oR5An#SWO)4?rsP_2@mGB-D;j3N8x|z z1T3mxJ?_&11N^?gXTlUYoOh7fpG|Mw-mK_e$JdP%CHvv~Li86g9$2J>>~yq12C2Kd zyB3At(xFKabdobQsA1>7e+KMNl;&H>g%X5UO=D}l%A}cD=i;Zj;akhCEX~l|K0+Rq z^xgBd`ZQBgwPSe(B33%){rnqzkIwbY1c+g(9_oAa^y~?F%9m*icwA@eZyX zZURYLXMNrhK_g&yIM@vh6}C8eBWrhjq<6|w#Z3*Uy>@%z@KUnk3XP=>?n-u*GV=1= zg^|i0>?M_2ua*dM2`OCl2zxnM41#SjvIaBIDf^|AXE^2O@-0x`*ZPTF`l+!d zi54g<=1dWhG%?ttJZe53dF|yXF=f93l9*1<17~^7KMPYoM~*f^lV4kewp^sYAruWG zI3_Az7sb7xF7CtL+cXFyoo^X}oT)YMAXGSeUx=@MM>S=_3RZk#l$Dy&6yfE3wOzD` zU_tYB4CppnYvs;!TNm`l2d^p}-S#>$c!r%#t_f$;#q=JV-mXPVpRalTDMB#%hgb+A z)AWyJoYi(8lzYv;HR&+_RdwTXy2zPJNpyG(lcgMgg6;4Jub*?l5Vt6vfEG* z^u^50FCXu!Q3E&Y`X+LdQ=DYB(V48>*(dx8Rr}`#b7Kd!k);82VGrz{F~Vj}`-=mD zs6!es(X#xI-13z`FR9*k_IA?d-?5){WfM8H@koi`Z@BL}A;=|nak0AJy%7H6dh4NZ zW0v-y(+WW-kW**f3{|YQqXH93r<$)w^-h{3uuc3EQS0AtgTuM4>N94c7dxnVGZnJo z*wC@wI@xqiPpGwrb25e{YK`fupemxS2a>hMh@XlKXH8k04Sz*-4N0*rkeY{Uu0PC$ z&iRYyclTD3T5=Dh*JV|Eh5LLl-z%pUhsO`y0Qe}OvmL$`F=y#D=^AF zMYOO0p@=yP1M{BVsq^LtW4F=6ohl$q;8O{GybRIwihgf)Q?QGrL;cDhVT zpk4ZJR?CIlPDT#vPg?n|@2iDfio53}~qcaaM?{5dS+aLah z%zKXMz9uP~dWOmgc!kImk<*`=yY-Xvu>e{H-^pgDk7H0GZqHtBS#0+Xp6)W)U41<* zt|nGSDC!~zZ3RBROZZ`K{9{?j_s9e$7m#}2e%69h-W$0(#V^TzJ{4M1IN9G_yjbwq zy?Lr2Xa6a1>MxJ$A4DML*4o5ie#P`|-S?bKXb| zz>u;JTBkmwJIk5=!5#gMy&&y2`rV^=&m7x8LAK_9)}V|X?38k!fzA$O?OTGZb(f1| z0$k@eUC>&uB)DDVJ>?6wyt_VbUeh;K#dHPZ1RpfZ=ny?IKjr|l49jf7sl{Zd$GEd> z!jsV%pr1LSddQMzS2n_)s(c*r2-u?HaY)p4DOGHF&T9t$Dji}OLP@PNnw3qaq_`ImJeqF9#_(ieYv*SJ}{ zo(cSAy&VBAp5#U!da*BYt94wVyJ8XHlK!qbjZ~()?*0U8CG2hnD*V=uMik)JZBQXT zZ`15AH9{jX^$_<`tvk59wf&n-0@71Fy!?f6QZpYrt~?yEi4e4jNhl3{1a26S3Pot= z3WCnN)wP?dVfS8$m^VAY6H&ULk^@d-k^%4l%DQMyVLaH7mHI}wp4gb%TM0soKeiFb z^XXN(>(Z}2$!6ZDP}{lcZYRf6UVu0nbvFb3GKFD~vtq3pJ`2TkqnD8h4+6$D)`b8q z!V`7QL@rfe!Db@Dsp4yPE%_UbwJLcdXJ+ILoq-c_JTcs9B4X;}v5hS9S#~?!)|vA& zFAeyG9<3`2?8QYOcXl|s=0Kf$+1_wwDxV{tM&>EvW2 zjUKkViOpq2QR>ITYH!1HV-3gp>&#=TE@I$73BeOB;R%o&Q+_0z+)3q=%FSO|S+)(g z05p&^OAx@zNR|54Z1`ga(&H{DTASiW-Ez64m@W|Hb@6V1SMVa+u_5xf3*-<_%o(R5 zW!yZ{Edl?}vWT?2d1+E1in^bD`yM;k!&MLjQ77O`FTXuz_+F zBPz-6h}eZ_I4)~lafYQ+76Vr>ejVErR$a|{hyB{prp4(W!En_ zft+|En`i~0G#25P>m=8k{G3kOXa@4ch+ppE<)_WMrWcUq!TzJGfA0bI14*H>h~S+5 zKXZsGEepWR<9%!I+wsPmvbB{4dB3!!tt}f34@! zR1oQx^^|vFTNfF#n_b&`8KJPOV+)r^H}1e!QK$95#n2%5(DbgOW$^LRIwbCNxDBtbq$cNsrSK2Uu+rohd%-#j>{f7e9 zm-boAe|8~0zgv<<+&!7=zvS{1POX&JDXn^=aAZCij3}Wu+Bkk(eDO}EzQ!m^#}gRh z{z{ly?&iJkmd*#>eWrkL%SMjUzklxQB&bz<*+^qz5LC(kP$RH+C3FV*zMgzj6Zn9* z)d3FcpVpstm{bI~xi`_eT}m8PLaF0arSHFGhT{x{9U? zOnrM!VDLHSksrnx!=&If2R&uUK1`@Rxk#~)6S*0$t@}_z1ob#~pT~Ft`iXvd+-a%d z;EWVC!hUE!r^;3*Smn zA#^&-rNEV1qIrJ}yw?6l#5?f2CFPGR;69!(6=!z3aRx=Tn_@ut8W0dRsH;ZGo%= zxW5!5O}4=F1^cW@SrfA5?|_-W@P3eGs12&rk(m6nVXRYP2Q?C-kpUmQSA5EdJ=(T# z%ihJpG2t;EsvthPH~$HPH11n92l&axN^IL}sLe*smgl`&DRD$v`VBPF$+`&tKf2xn zD2lB89$wdNPzFH}XHW!G41hxr1eEBYh@wcwAqWGAArpYhUYxzJm)I+_Zr$Qj24eKjvhXoO$N}9I2$2d zq2HzeE8>@PuusF?`6XCvt&s@)m!U5+@tknGljR0oLh$)3Kew*;mfH=T3xSR=urnKu zw|O+a<^ZU=()MfId?1AsR;iGQstEUkV^(aQL1ovB3H!jB;bK|)tMjJy*t@)W!xZ!L zAsDTozcFflPAa>UjgSlfM6a|Vuz@9EDssle=X;xEW&$KBYKV-r^UG>>X@m)+Q`g$f z!zy24v)!;c+~!-_5xL}V8Q1-Sg9cfqOn}?9+i{G*NAedqg}1W1>+@pKfkN9u1vw;j zV@sv2Y8&t6F6mK;Lx=N#mI%a~8Dwpq4Q}N%?g4WopECD1MutCdT_@fn5-Q9YkQ%%Q z%GBe?HSnH33rw!-0Rj5cjj^QsE>0&PY9723Dn02B4HPopWQ(YVI+W2oESMaCkIquq z6V6@Qa^Wa$QmY%YJlOxDqx!`NFFt+*=9^CDZF$=$Ea7^*vqTQZTEvF$)OJsI&9(4C zy1+yvB>al>Uzi$|5Py+$^NqbR(rem4`ecYv6z2w+dQ>8O7vvjeOze+O?f<#bhE4WO zaRQaM-_DCj1#EDq)tIi5DJ0Rm#M3?_`_jl{8^l8CV5Ch5Bso$OBuFN=+%1;{RF2$* zAbdRk>2qd;xvGZiAT4f)Wa-Ry1!HdSMui}Wgrpuk9yhR zxbOn-0rrXG*CwZQS}b|o#!^K4dR~5z&@G90dIy16d;8&-C_TLyxpjMtVoKA^aqMBD zWp{&7OR}gE`UDj&6(1)|W7wYNrNK<@r??3B0`a>anZqz)OXQZ*1C} zj0Iu^su?ZJ5o;gYpb*TVaht8be|8T&`~pEaySWJ&I#2DB23;+9!kVzO`9B0ztdY%u zjqDzrK~`Jg2(k%!uG3*LkWroH}IqF%GVqKpCC~UO&MGm1Pb$z zoeWy$WVPYHvIP3Vysp%amEEl)hjVqS*YbXd-A6cF@4GU=7@W;%=~%qKfkxNH!YN4_^dw;AstUyjvne zYc=OfF5a@eMzkxW8^K5ij>9&B83O<*tOb99M{576W4p2XtA#~Vg%{+q!Knc6L5jU3 zL2=c+_;p`F=YiW_p5?jYGfufyMPT}~zSSAbI3PC!Ge*D-ycYnxxyZO5kKGEEIh3RS zniW-agD9L2Q{cYiu`Smp@(j2v3bcpw9=u|}^KCA&a2Ks9;8E*V0)TY&05oY6KpMEO9dEn&|swR*>1TyrK`PSXf!Tz-hQju2PZwz?Q}7l8WM54|DTk>`vu$wH)5C8=+%utS`-0GJYcL9qZ3 zj-nZrVCUA8A$%RdYKp}-54dmnygT1T6tYzlV`9hfB_t*Z9nP9q?=yF0rM*2mrqIVK z;pP}`)m%$b&@OpZdc>-v`NRFh&1^e^5xtMbV&A^&V?CMld}fwPyBF?ncP>q*?bgeZ z<$g;N%Q#VT>&ve66?}Y)oGCVVEm=IW^e&^8$N4dyDI6GbXsVdjID%s1Phu6U(_~jB zXMN6av==st-r<{e9{bd|O|NBL7QJlle;0$#hNZ)9Ach_Av?J0ZlT`b`5g)oUo$}p> z1jZq%cB3W2gs>4=&DjWyq(deiMO2U1k93TYSr&b-)U$zTQe(UG9zx9O-*hnjbo}uW z^N%J94hHhBtxe=W0XASMr;UW0-{H?HnXU)I#YOTM=%(Kd3~vFhlnCSkLlc;&E_m$i z>Z9oM5&9KXyuc3p-6iEuRc@da^aq0`tqvypx$G&i>a@xZxh*^R%;K9L(1~5+H|qz^ zT)@XNMz486w`=<0WHso&JcfTXnN2M2nS|3uTi$olJ?NmInJLoTn(2I9(|1?O)(d+| zJZbGvq~uq9IUyUtQ?Hb{Z-6lkdUCd&LdsY(10!%x|MqB=ZUIBP6Fxn%k9{Pt$dzOF zNBp_9&1sP!xArjM6{i;kH*!8QqCb5OFj$G9%G=Dc@E#PyQri!e!=?$M0LrKG?jMyd zRnRrC1HZ{ooVa!!5Hz=oz$|hV;E~I!#n1i7?LzAatFYB8KkPv}9&g z*3VkkaQ1>;-4Nw#=O#FveoxZ=>whS;E^>4B`QBiri`2I3*LWj} z&GzDLx={q4L~Gn^K3Ggj41xYgnj}QDAgnOa`KGVPd3Yh85}*p1GIUaJUpR_h=)B(; z+3&;pk24O%j(136}K75VdyrB4EjxBX(dWK-}7MoglCVvaTosRBOt zFB@DC20H24D`*oMPFBLFcF`$elTQZcU<0Nn#g1|4*rkE@H$oq^R0DAo-^~mdT^FKMIt%7aA0OE#GwW7`J>JW+7q>&KW%E+w>uPwu|+8401cIEoR^esrfyxI zSc<*CA49%|5i_+Y-gEV$$I4Mmt-#t->{-qh8+_7aQyWdlW#gZ+RFD z@8Dr`Geg#h8x^!WA)r>Iwt|R!h7~o9>jx?^I^2yp_QQ!fzE-;-!5es<55ch-@_R}K zi3Z-4$##O6*8^)_X?%m4TL!%bDUmKq>^5vUdXPQ<(Ko(Ud45ada zz+|Q#ioDLgJEI)0-^# z>7J<4OWVUK-&P>BlCM3@+>lVL&z<8B#lEVz-H&A~JLVmKk5}`2QCbE$5le}eyO?ti z1xTm(L&f(-*Fw%^&vaDY46dn9RsPJCdJU3a@ecb`xBT|hrb|9S3pKz%Z30}V{h_$w zoc#E63;pmlt-q7;MCHRa%rlk^+}_bCk(kEiC|%w3HiZbTnZ-jsm9SUrTSw$I6ua+b zAU&fIa`D&xBn$adybqr1>%}H+UY=QJM`>>`Ua9>QQe&xBg=*5^atPC{RJr3wC2sik zD5!{o)+Y(2{bAJYv4UwWI z=|@cH4BM`*%>^k-@A&;GJOtR*tO?>CKyT#+o@vGXEAac zGn_`sH?J^Alp)cC)yb0J#a!T!Vs2e^Ue(Ltxn8;w*z*AOBZ+4-1UpZuBXaJBW^#?- z4X-GLqENV!!VRiMr+C~BZbUKh^XL{Mt1eCp$A`q3V}t#xp@(Nh5tJ{Wg-7c|fzXeu zEWR>nyvCfp)_Fg!8zW0$!r=FHSv8uhP7*=ORU{;O={Yj3?)>y_xsM;ddi8(5z9bMI zMVWjxT#V zzD3A`4|2&y0z^tEN&yih2xCX}RGubX?@BrEcslN8@Xq>zvNZKh)LiUjj(SY5)FzBzeJq<)f;$&>5J{UX%;HNrj?jgyU`jVG?UITmZa%o**JQB zsDgxmm_rQHX=O`z=PgwOIXBhFmSHvSOt*<+Ejgb2TfUb;H3xCgXu7ls&@Q;C9rRlg z-LG*HZI|YFJ2J{GR z@t%B*3t;HXYG9of{{C6u z^|vpm-fa0(y%_)-+##&^LXleJ#Xx}mY2hEpsd%pag;tN^XSV~HQ5;lS2anTZB%0{v zOQ%4h2+Sw6kOcsXhETNDll|XXPb4jqig*tP8X^w7JJEfZg5DM2o8|sX=O!l_7=A;6 z{`w=E5*R*w{;kpnw3N3-w}vN^9Yt^cb7v!Trmoh*k3R_BTMXKvvyB zQi5x{=2Q1|#Fp;7D3(>0Xm^c~4@E3@fhrm(B*AzAhcIaIuMCR=^y0TyuT^PD6uXYV z>{|J{AZL!o+uy-|Eu2=l+M?Fn7M&|j^LJL?$P2WWX-0Xv-KrD!-@t-ZHGk~haGky@ zc6&CUp|s6F`D5smqB+H5!tD#UV4;ZGlQN5&7%`8R{^J|-lU52Evb$6p|59JDgS{_) z!7TEx`V0>rb6p|)7sE^+!sH%lJ)+D;e~j-Y?{{I0m<@Y6d3@^lWHp>u45LB&BM|P= zLU+54FL3Q6MMEjdZPEKPP1Kv@d%`r3&`#RSpxp|~W=?Eyei- zkG)v|`PrmB**`TBwcdR-x^UM~{HjSV#NPRE!L-lMuumoT%elS38pap<%o8#H#V(U- zAjdrrU3+p5>$5EzCUJ4?JID`p?zx}FnTGEiEC}W@&m1u&`b~)C>%N=`?!fneEkJ9y z(Qyqb0(EAqK-rLyc9YGD}_9O<{r^^_IDhgS6 zHFNofK*S)#0V@Gv(?!ycjfaBK8wt(9Rs-K?)1tb^7j>L;xU@2b3h z{7@TXb2{&O>GAQ-)t8lHmZK~RDT1fM~5Z_aE%p*X$Su^H81M zT1ehC^6jl9jxTuu>=`8Qktd}=$kgQgBS{vt4*56u33X*cQxJ9&4Cz!XHbSbk7LqkY zTxHlgiRod|o|4p6cr01eBpbMY2^gW66wQzP&{OfN0)q11k~lWZq3rMN=(B~yH zQD`&}cQ#wSuPKN!Q~gOnYf}8@rdxRmze0@2!oDq;iCQit?C=|3?ezSXAcaK>PE3Cp z=cP-sKA3r+bQ@bAW;C zRDyqWleOq6N(CB%fPv?*uFBgVj2*k*t$zv=HY^Xj;xk0|NA;A=(-h+H8pc2z4<^NCfK%Mna@sw?f@u~ADS%ffaB|kkHD$u7nMJ0A zndLu+1^7E7t{#%ysoA38RSkb7Q&vOSOa~Of;y!A#x(gdI`JsO*_4kWVNIu!r(Awa> z(UKdcP2twI*UU{{#YBnbKZ0%e<84>kJeq8WS%J4kFkR!Aqml=O+;0~PZIO`v((rWZ z9Y99=yS;{Hj2CcVuS9oBfYTg`(zF0e)R&#})q+t>aJr%EZ)@nWJZt?a!PGqR^Qn-& z?`xs0{qqB-KV7Bgc!1$|OPZFun|25wwBn9#bJtS2p|#YJXe)7}*#Nv-8LaEPcjkX! z4OsI;QmEx1yb&K++EWs9jfl@84@Vsb7%=>-N{*Okb4jv}K{2Rjiun=sO{D9)SH&%B z4W4e(=NJV(KD^ua+p|JgykE$q!Zz^7{yKsy8rZVv7#J9#iuSz^a5L(R%8Vhq`zrUe zX1m?J+3>~!qZoS~o81@H_zvum+zQt82uWvX>SG=Ip(LxMWRal;>!oL5m1SV62x5} zB376u_itS_9>B++^qT_2vKG~&G?~6H#8lE$gxDMghwG~R8kiaOuf){4_}F?~U+m0# z2A#l4rPCFIuhEv+Ht4sFpQP*s*pkk+UqsF+y?1$Izo#^RX=LJ%mBBZ(v-4!Hi2M|? zVwPiE!-7!UOqmdeW%a_iRMI6b9e$-;&n-r{;e_Xrq>#&D$s<36u)j)!JJ+iGw`VOV z(>HhLNI8BrbtPy0;+hC$T9tO!-hWbiKj(*I4&m7rQPgBd2jzuJ8busA!qITBvmMr9 zW6KYhgrTZcu?*@e!^M^R1Dv#V3EO)fSO5M~QqzGOj6D-+m-zcFzXabUgY$K-73AR2 zJ263J4eh~a8V`g77C^wT$iuRhgglcbrpkS{JitD&tgH5jdE*B_|7hF+3cK9!7(XwJ zKAlSxE~M@MzJ@NI#`x(HRrt!T8@7D@%B7=zhakZ7{TJ`H^UY)YG6*!Am-NzgR6drhS`ki% zJWjls&k{1OldiA+@tv+U5`e&tyrWK>8TM^#JJ-LDAN38_PR}c$iQz#Ec1FKBX%3Dg z3N5;(jM?d%TK7BhB|bfX(LR(6v;;&N9nt;P z%muQ(9?ha2thT|J{y)AfVBMZ@AYAMNOp!hij2Dne#)y%Ds$qX(CkZ9Wdf^2(f~G4r ziTN3>HQRLgx>y;MR|6gRZL|VFy`8UK^Con>f9Rp=c`_-4F44i;zGPmr6FAV)VFcb$ z{jkB2^7M7eN%CtlXM*y-N0|w-FUx547s_%|s2;`0puM#i2s*YQA{x7KO5j+TcslzR z&K~Yg%(q13Q9!4oX<3t9zrGujd+y|(s?Bw9ES#+$d*KXP1WLmuC^~7Tkh*dT17TpZ z(aGN5(Su3KrV2AmlMr{Gj5|phb1$Svb!J~}7{|1QPjtiE{z)`gx(p8b_HY^yW)Q>H zi(}7NX4%jG2T;oR%m?$iB@C)bD)M6eUHiuxM7&&5e&9B&ITwv4^+=a+a6G) z{X0qv06A>Zvr9}M>d05#jd#nu)GWK}b?o1?f6t&EbVNMFJXa=e2@q|MyQ01`rS6Y1 zsAq%;3rz#R5jHZf-Q0$`;<>hqZsQ}!XFdhJvg;jHHf`eAA9#pew-f06Oh(Bjlto%K z_!&JTddmOC%YSHi4Bbun&x}d}#@Q5H(*I_4X-0~T@uw^Ib~8XS)NlWlqBwAKv+iA3 zDY=JRo00Us(DovS!XVve0kj?r!!6M z08COb1NdRfWxbG2e;5!A=XLl{Y=p8+AQiOp(647;fYsfHuj%byFcpFNT&yn z0|7D$lhIN|Bc#j2m-StwhP#hV{P5kGlF@4!v3g{zlD?M5?;D`uC0LFO=CkZYgVQ)= z_i9wPygPU{D!fk=o^MVT>4BmN(PCi?Hbwh!%;QcnR z`g4)Ss9g>&q1M~zi_^&Fgs0B0!}N*=Hp;J++|A$le;SC`CdB&g?8(sIzb-mC@!)>U z{97U$P$eC8zuSmd|7Pifym|&f1Y{#zMO3T?riRiA@lP2_Ta}oxC*rKC~le7 zQwjS|q-?z#zuW)J5po5)?L9dujHL-dFdrRk+e8z|&pn?TAVg9;XJDXW@wtdq{c63EV4g`~)MQ4xlf-FUt1-bD)XN`~|B|$R?xH}b zZ18%}DJl)?TtrH0ga5@K0f1}BJCOfYq1Wn^8c}83&N7AP{fWmI{&T-B^iC7Ri=e)l zV$H}~BQYXVgpt)0t0g%X)JdxM8Jv4QipF!1P2Yo?lsenL#8_~YSg$&t3O)P&pE46H zsPZJunrx{>MY_puQ|L8N@ki1*RLbfH`Xh0N??=6KG5yZ4{SIS`m&Dbtm1lB}e;bhW z2O?5hWafbQ0${q@uJjaA7AK`k>ZdPT?^Ud6JnzeNu8ye8djKDyAoa8GJCiT%a(sT3 z0lDx!?s>5T!Tvaq2zvp3I7SXfA!Xem#SLhOF>7pncIuR$WZk~L5;HxAGy6qDL5xAb zOaUOk4C-!E7S|Ui!+g%UOkqPM?}lV)m#3aV87eR{j^ieScqLfDifLO6xC&2%e3TC# ze5!0Sdq8Ye09XYP&#Ih>SXFZL{T&m79~6JGv6UKo4g!fhAVTy8g1Ku-nC{(O>9+xZCae(R19FE2tkvIw3H?=Jsr+9Kudl2meBC?z7OH#Z z8*9aJntrjaZ-m7d5xH?<^MdyJ=kwdQq!H;KiFVd}@y^qaUe76B>-&}UxboRGp3$#x z!&@EOif+BgWTC~(}w}aFf)3hzd$a@K#ZO(!Vp=LW-kE_FJKV^Gv@>@ zSU}>DuHewKx$o>e-B&*(0OqM6hq|UQbtUFywD8L8Jl3kur=`T+VPKyxv3Z6;z@JR5 z`1ysEt+x&yP}mQqCy07x7N=u3Tk*m{|R{Iyc`f>o<1QY04vo}N;z~)9)JBm6G94%fXsTUbaA z6;q%PlsOm>G&4V|brudKOfcE*|6Id3*bSRZ$Dw$o8=L&TTFwB2_MWVGpO=nn#%Q?e zvJoK#M=X*J+4I+MLth?fl`)+wZ_dao8j%R*hd8Je?4_*UAq?L>^Y$e0wv0`AdP=h^ zHc49u4_y7Kd?8jR3&MF5f+q9fU$yW;t08Y8c70wZx91+18uwm;fzZ4Cs(vAoMK05OMKdYe(*m2w49ny3~&Idl+D6ffi_lhrX#N}zC6cuIF!)b&H* zQ?lK8A2v*shOZ10dr@^?^q<}W-d{uKfPfFfL;P_2B<6LSBD>&DY_h~dpkD&akPfjs z2zn@MS*x*>(}1|%B!7lmXGci~R=*Rh+fa8$bT_~2hzMhUQCh7Sw9@($!x)ZLf(TYy zh)0g_uJ5)M3#BVe*qBw19b=Q#o_+S|lw$G$~Y0;mOG-@YtWb8so z9=n*BkN<}^!jGB=#1CfQvTsd1=e6h7VA8IaDS{T$M8XSZDYfBcZf#prt9nTA4(4@V z`7_8gP+3EFif|Jcgi8E!yhy0Rdd|r79^@w4tI#0LfH9C|3F|j6&B5}*@o!A$9}V}K zbGHqiu~mWI@#3tQXC|~&#-@JU&;*Dyf$`$sJ+Bm68xRt*2T!bPDi;Svm^6n5Km`oL zwId7AaPPr#Lf7f_sLi+nM}^x}Zu}SvHBX;A;?^sJop2vnIhr$unb}Dm;m3FCxD-r@ zx6_RK1ON{r>wt{z8}1mFtq?8D8$YjBI4LPiK)#8Z{_Ho}xABn6ZnsmD%pAJHKT_8fy=n1&g82p^7Ol1KT}oHZz6e4m)4|_3w@F zZkxd0UdFoIq2aB|SAczIy~M0#aO~P2F{3fPQth~I3LbY}h zPRooTWgUDh%s5lnr(>#~8O_(7o8-p@AYU-Zril8Hx|V(EbAlYQ>lL#hJ1hM7LZ?r zU>4mU1Lo)Cp9~@nto27F{L6ec+Z%xZ<~zEH%wEBI_R07H-Y1Xu5ASmpJd!h}Rkrk6 z<6R-bUXVXPnF}D_sUUTB^c?@4B+X0Hp2-0aoZ+)i$xX8@vzHSKPqxEmu*N#oqnDoj zbE$yn{7rhRyEl-!QlAlo1gtgxps{>a@t3OqE3*JhQYGvk&#lsY=ntAfxAxw|XyU>D z1ZXM$n6@xsR&RYPH4e^X;KodbIAazB6m~yG7CH%nerx(8jFsbN!>HA;+ zZ)p1_3fp;^6iu2kQ^L@ak#K@t*H=zr^9ajUpgJM|5Et4vsOnA3c3MubtME{rc~*wj zisb!sdUt)|Zmt*nCE)(Zb?k)8Zx}?Alhw}2a=0;+@L)BHUty+t^lXx_BCLM^%yx+X zoY))*1#qw46zr)#;evXpqWY`fD2RZQeDH|Q&Tw8cqu~)Kg85%70M$?$+j{bqS6kts zPYbfnMYu>wfIPQ#U^FF|?)V_c61u!B{PfqkFN`?77JiQD3;(@6V!QI?+(FJxhE>MM zPY`vyeWGN9iM6P>k`KU;%HsdS_z)D=9l>d6T4|{*7c$(fEiGr48vtDm+7gbV7wb$_}-{xZ))#d)vABeBUs1(l1dXK}Go1yL3^J6$~rX&VVGlBC6 zlS0u?0|u$Ls=#Ppr6YZJBapTNw~G5`(p_pEAKNi{(S&?Gn* zRn##@Uz?ImQ6zpR`) z%~5a(urcynXSP8?6J+A{7Xy&K4uEp5QR|fPbbc2s@8#QO9#6AxhH6PL3f3Z42Ta`A zq9YV~UmkH(sHP2O4*{Of7gc7@Vb@n)5T8pVLk*zr%rt~mh?Pl9V$Q~k;AM|!yZ|T? zP1;0B;xy>rQD5Mf=edFX5QSxWWM9W_!_zo?f&VQlC*fIK$n9g!a&2$oWV9-%eeGvdE4bkh7yK}Y7RZ_V!G zaTCIL?*IYK)l)&C4v71k^KBnLI?Zoa<8VVjo z0^3TE*awXOh~f+Gd3~v#N?`mS;OC!3WyXGB>bWXaG#)UjyxMtN{@}>(<{-Bm2nvEn zB!}Vm0X00^H2b(47HFGSRd$bH*IiW!bBTte-fnf}b-weT{{;a|zxFc!`v9(Vvf3|T z3kV}A*Oa8$#JBH_icp&mW0(@qcC=1%`0sABIXU0qkbp(G5B9fL+k&PaOnz2=60T={ z6@P`pxt!|l{MP&I4NyGt2faY_?{`FI*3DgS$WB#lJ8S93&i{T}h~_*r{xj+1bzxxM z#+m)y5N|f0R}KM&|97;_ieUo4*Lf@~tY$Ox(gBNoZ;6+{o(}4uq(3NU9~u3GCfTC- zocA(xZ=B#glm7-P4LS*C4?q_6(5Y36kiJnFbrEfA%QQok5X%}x-o$J>8B`T^MZ0ge zs&UFWt&*b&H#$;p^8saKHPw_JGyb2qw#Us8K_yoBsG-H{EXDR6hF@YByPq^UT*AL2 zvtw#crmE*a&kS6QL2{p0DBrAV-~R2Ee~0O7q4y37jvL&Tw%#(iN~_NPd5;rNDMoEt zg0?l1-kDQkb~168QSi-rmR-p|g72J6k?8KbnSHnL{S@+ZcSi|eZPHiHHF+e}`y2ch zIx2wN8UTh2#U8G)_r-f^KrvA|IU@AayGbpdGol{4>0yE~pMSg(?zePh>9M&w_!V{l zTA7xJw*WAPo=_IDF4z7anQ>lf7W&DMA|08aZGx;Xr##uI*(I;%ypVgu zqFA!89Xr|G^ceC1)9nk_%chNTivfe9zrhO#$LEF8lgD4hOM43WNbTfG163TKA5)5I zZIsN^v%bO=xCb_b1svgc82ufPkno!Tl~ma)=osB%~qoG4ibgW4)AEB?p*;7I8TAJ~Q~Bc7k_(8<*L7_u&A z+@m?fQYnDlQDHmXZ@(@3nyJDhdj6f^GUv{T3QG<(J*hD6J_VdnUz;Xfeu887j0eyS zEs9y#`ZYBQFdDEz+fJG_D+z@DIHWP0DZJv}gw?x(M3~B#CDIdr{Rr$GKk;#1OOe+) z#hh0ALq3}f@t@7*t-{{+LiadY#NcfrKrDylg@}T}qi>;yI~gn*vJZSHtAx8*S{APM z4|oWmYOl^u@T8=iD)?mRdOUmD5piDISGwrN?W%}O(;W=~0DBae`!hVt;&rP>)9rt< z<_2#uhxoF5c068kGi1z*0ksvXmGJ7#fh0_09Q6mb7sv_04u@W?PzObe$bi?9vJp6! znOdjF;5S2|JUnoz?|OnoU4q>{NIaW7iI)H%fo9QG4g>%A_u9Z^oH+Z5LP|dXT`V@p zen*WBt7ON2pt@jNYZq401p>V}xD*B5rKfQCICrZH1g~(_gZdKK;A_13zR<&Y=}{Y0 z*teZ+Iga}!f{Qp~WqT(pFYSSq=>C-g?{6l&Xu4jbrQtCce1<-H{mG6&;Fe$q1ec${ z6(v~njDFM}?T6Po!28H(95Qi@<_ln@FZ8_bR#Mw3Kmd zTYH3V#^>RsVv1VX;K*kP5h@$dEAJA{#R~?JE5{$4^r@bykuGSf#=sTd+IW zohVVC^={h!=YxWeAlY!tcwc#xI@l{|PY8ouw1VSM0IhDk--~z1cH5 zzyY`j%Hs*bFL!TQ_mM#riW?(_kGF)59YnYV{Xy!e=8FsUV`l*Aed6qKPy%MB!q?V4 z^8V(#ga|Qq%a9pDT=1&8m)nwmu)+5W_$$nF-`v4sOQGU{Z=nl#Pp-Ro;BY0L?|GLN zeqIkrZPlKe`I0?m+PIb1i+tBvk}ch8aKF{ZQQQ>PvYo7|ggYig?LBMKXxgjxetaa@8P_@#KkC(}Yq?yc-8g7&KG@z2bRt*hz8b=SzQZ@md}zL(Qg6 zg#EyE+@wXWap27Aq^>u>Imod)7aA(Kw(`yE)EVshqF(da-9SLy05>(9-1~~w0QJW? z8RUG|N;)z7_XsQ>mr0yzYT#c!oUqt;x2TXMhZ*noORss?dA!@FIoJRVkipceJAF%1 zCw<(wF^1=>BSQKF>)aciyFT~@s-cOUk_XSW$*SSqX7y(8L(0HDv&T2Tqe+VYm% z1y)D$JVN>1nA^QuoPzZ10-=_3&xZ6KEC5Fb#F3Eoovz4mW!hV|nt9_ows)GBb{4=R zNObWavwpzX=gXLn4RILBkMb;5UX;qTvp48vx$toEY?&^M@YXg`MOJA(#!in8Hz)oBcyPiB;*yESVnULpk{KZwLgD1CT(TQ z+8C*78>yvd{;J?Psb^kyQZB{~gz{fq+>RENfLcBx%>u+_#`=!?Hj5Zn-FCKB+d1I1A2uzo4=CiFO8qXKC!|SAR0_&a9Ztb)NfR=4y?b zDZR}%Mm)&6EyH2L9?62Cjo=WqiiHrF!7||R-7CT6v(=CGC53c=Ax!hP;wEVbxcw*? z5ypK(k`3RQ>2+k0Zs$^0!O08DCOR)MmBVtrreTsld#rL_%7)=<1?jU$_HkT6*LxIy z01NVsTG~2`SKRY&=&6uN4FUt5zU~XBlQgEk0b7*X=Nq{3NcI+eCN&1{RP8|9cmh?0 zG`6z?ZSMdO@P!hZ+QuK3t6CT3Lh7%e0NK$^Dk?T_2VWv#ABPHy5Og zLBIe?Vx)X&*^6Kdoqr5<4!?{dnFOvzi3k(bF69Vk97pS$pu43vPMkiGuTG0cC^V@O zy~iVFIb^5KEIkNz6PHUYHx^{UmNsCCAXTngsL*d93iHHRb@mZ0;@2>V`aE+HQw#PD z8Um-1@cH-W`u}FhY{TPohj#rOHhHar>Xrm_6IONhHz4i?-xiO;U{sP>mfmaJL&GB! zphwq06?g2TU;EX3)E0Rq_osH`glnek)J1TJ0phFWzL(*o_!j;gX8;I^Xc!dOklVD+ zpI+toA^|xb6(EC%r$o7}GHkTzFYG^n0AaKtjx}7w*xW$#^C$oXM#g0gbUSKesx)i; zBHq-+-t$$9&3vr_YQ*Q)G@Z7zM%)KF#{2n{p0%B+(LfXF$^iZU#uk$$FKorRE)~6( zeYfWtFrpbfk-HXE`w%jDMVHtO_X#E~y%`=SseqB{=p5?{DkG4Afm5iGr0F|s-(4t` zsa1U0BB(=w($`8_$)(D-7MG82XmeM*Wi2|FO;zStu5od--;b>=0LGET+4vK}X(vLb zRwW-mrR{LCXoDL9#Mr>Cv0e0rDRH)-Y$B%HCL}a(G5c)#@^#h*cWm}XlmI`E0)OXO zR!e?xvXQ*(+{l{$Z&(D>`b2-YRu*HEMB3PJ3rifmpMh31?5`;18>~eOub&(pbwG&|wK^j9o#kjLwBB_JCL2f7_S2 ziEUXt;N?a%9q6$!P?x<1N-U3$=0R;PJ&(@*g~#(01k~c+Q%$mHDfCQ|a}a2p6v8}l zNTI)VL8MgTcfg01!$|81jM^xiH_Rp#Pm)yvct$JXkD?|8tjYM$G{cLi`Cp?Nu;8&w zyQVubcmeBqTh+^)vu;0_i!aeyVGbJskjgImB&22EzNB#jq<`Q3SQ(eDKDLD#M)RT- zs1`e>PzguFpOi9JA%#sAtu>PFFBp3l~UX>99tY0 z27QFeBY>{tX*$^FPdOk8tiYQ7*QQd#R!`So)D_PXI+-XBqEP2kxLZ!Rq0x~beSNn0 z6S=QTKvG8~l)t)!o0iuF0uyxVan(Q@13}AThEkvi;(Eg&Ovw@%qxlL`%Mz2tn{O;I zYR4=AASdlCCIWsrghDEv2Dx$6aNa>`THPgqjDk#ugQYRrA|@XqE(u2i6OnBy<48EuKW|C-@iamEC{L`0A*3yKx~f5QEl{K9Ys35B3Y(;j z%ZW;AqrU|)RiG{z-4@7{*3lyuXzg_R>#=KABeFu1(=3>J=Ied^jRU|7adSiOzb%Rt z@?zuMz*+&UvF+@HZ4-n|#I4I)ug`~Ago!E)9|Kw%P@~=A)8VDyJf5dTOFaW+e0mUK z)(bNSJVC*Mr$8vZZy87vi#$?lxUH1rBJy_V=<{#F3^q1|uCU{3zYf-E&R@O(POCz8 zhFp1HAN@oP#Mo%f(oNTW+tqf~7IglZy4New6m}ASzDEr^_Jh&A%QoH(^+)-xAwE+sRlCl>8|JyN)ZXSa`JR`7E`d^Eq zn)lj5z&5W+gkW%jXa@e5Xx9Yj2QXR+@=z-tw>;N*JC#34Vu>(x=Bja}{+f2Z1tuck z^Rn|u574Z=A*RHJ>ob~p{)d+Pbr!-zMFDnq>&bMd6j`3;dF#bHOPPnU6ab;YGBPPN79TPVNcFDG(L! z16ZNq*^V6%>O3%K|(vb9j^54IA(WNN61;&z+^~qgecS~XwUn3-4QKLqvuqyT_Ch4VBIZ&lKp=a?!%2M4W>nYG^T z#N0{Q{4q!s-72*PKG}UW!3w^_Sq}%Kh61ztjUR!RRD+%HY<)J!Wk&^g%F=22ipOpwKP&1wCn#k7 z^BF-geE^i@q2O^~@6L_&IDPe#(E>kHJq6B8pkEP9*rN4&LOF?rT4z%yfQOZ?-G)v} z4O3HXk*JAAMB+G0G#}3Mvg$8B*~aIXAIvAVhITKb9|;J=5&?J7?VD;!Gtu>(BrL5R zE^_*q8R5n(;mA=9SEG0vAjJDOh!@lEffH)r3Z%+wY6*~hxmYxo1|cs1il8j< zzGa(KAnbzL-lmu$$;L>5w!6UwKP{f4ZREgv-$89c!b)D&$Wu4{aAyZ`_Eyqmo_0sI z?c30FQ6MegbSgt8X(`NEjMtlupDpD*)%eW_D&GU${M*wYrG6|ke)3dfK>*WuT~!f( zXmT*=)FaRmG^dC52mt(92({$E)O_%tKoq<$lE#~n(7!1m-E*T9EH(e@Jr6$V>v*@m zv4ddJqJO=uiPKll{QkaAJ*4*m;hNF zdQRbXw}rEzD;O;dMxQR2-08?Lz1pNt`>XAdvuqu*+^Zb%_*OLLzklmBJk>4Sq`>`Dajo)ZBmxpz?or0~o9{`fnSjqNPC~D?pnW z+jKqA&Hy+w|1F1h`oCGdH1tcMnuBebBCS8cjc7CA&yD_n|EYoRXt3ake`r$$++g)B zhT*8mrXojJ;uc)ul{GC{J$3R!2RM9jICiJza#I?^AIcX!BaWbIIcdbRvlSd8Xvu9W zJ~!my^@<+oNEKJztbs@ zN%27Lmi7f~{GXb5)<+x@&}=wuW&$7hU&qHNhiQfR0_Oa@@_p(1 zb7gRs@rOU*QK8sYSK=n+^qnix`T|5&P~uDN zy1Bm$4#nrs1tZyP51<#A&v5z?2ZVYX8B$NbfDy(&`n=1&oX7qZON zHimQ`D|J_B7lt$6P4mhrrwudm^|S6SJ5QlC|_JNH7r6Uh9*12*vp#!T)K@SQmVC zP-fw=JO`+A6Ljw?hsQ-;RC(^^=OGa^46~q#%luNRH3Q(x(yc`uj9(zvRsTP4dkhy5 z!9S{buuAoLP75sht3lW94Ai1yx32Mh&QK10z3%tz_+zOWKjXZr>-)x#^7@>TO`vMI zh*K11{0vt^hUl%Rt$Q;JOb)+c$b5le$!HcLIvQL$9;K7yaMgxDC^NXTtan!GV^WYt zPEhJI1yy@iKUvt7q(DNxTC~03W^l3MzmkjZ^uMbK&X!E8y@y0c zr;RNQ3@}e^%=dRFt)2Sa*|?HW&)&$qCWH5K14FKXg%wZ1Q&P!qF)j@SL7i5Y@8Fji zA$6VE?$Ljaha7U>{AV%T4>B+>pbCkmb51F2g#(*J5`g(-f?;2QA;P#*!}Q8x{s6_x z=hv2n53=1Gc7_7y7LWY&dI1g0E8!wE4p#C1N_Rk}#S0`KbzNthcpV)>Qp3EoB)Iqz zY_x2R%hHeV`OI0o$+-VnMWEB~`2_#D`54~abUs+^bf2NM*))34`gAu;RNNC_l@<6s z)jil)$4oFKoI=o%Al2eM*R^8rs-+SL_V(M6~Z{XD{GZIYV zUQ{aEUz#TvrFyWcVS0WTK7{eVW8|GuyRH@zjAiA-ytGFC$p9l6jFCur&x5zC7V9r6 z3skq}YTF`Bj|H}R%1K)hNe%;U1sw~&XNR7YLHc{JtKKkqA*s6NK-joAR&K!$iR()W z<9TyOR?mPbSP}+R5sVB^J&n?P-kl^ZFL16+Rg;dcLIyjj-&6Lxt>yxqMzhUZr|;64 zyf~xZ3=i3=mamtuj6Ke7ixO7HT4|*nz7MIM(0RTl%Kc2r>G*R@F7r zw0%JPK3$gEPxo;Hm3#>a=>uG}FTJipy$IjXxuTjofsmy*R!<%Y#vU(O<-d|(3?^aD z#V?8&7j=_|(w8Qipy3t!@EO7U#obG8Mm_|}DK-bfcld zqqaW&>Co)S@Gg(q*2{RFc6Fg=P)!yt+ei8B$%@*2lY-#mmT$E)vtTBgU)1Q$`tag` z?YELE_uJJr4)J3?UW;+hdRKjVXFMf?AY&U7e}U@hik*!y;6&rKkrXfWnY;n!_a%Ra zl)*-zoBhSRu4j>jT=q{g^XV%iDg0(rqDs7C!3c#r-pc}%(Tz0WHYn6{C53Z$%O|33 z&IPeyFCp+nC`DS8q)@SKMQ$N$S>K ztkm3*Gm=HdcTx)|x%D}3F-)&E#KORVT;LnwAHiV6(9u7hFu~8CooKo6Lq5&yhPX5#m0|omUy~0T68CCOANhZzy=7QbQ5QCB9fO0Sf&)s3Vt@>xh%`8gfL64DJ)dQik51eK6dDFJ0@hV)1(DbhI#f^>)EyU(CL&vU)skMFy_KL(uGXUE#> zzSq6hKB;u|7mo<*NKUwwX01wR#J?x_Y<<+CK4Cc1Z&8k9E@b@HwlpTZGpe$=!MLXc ziED0uQQ9REavWc&DcG9ReFS$^5ezH#{gqHx{)NkcEnztTWf?ubp$24S4g0W_M^FJI^Rd9(pvxfAcZX=`+ka{T41|GxbAqK@DLi@d;NNQ0^8q@WiET5O6f{cC4T@tqV3=sLPcDHkv}c8NlIj7&|^sFF5Uzg zpr_uTy<-CECPi1t;0+L1u}^)s23$oEykhEWM&j-Rc*XyW*7%TvJHtyuLi~-B;EXe+y1(fmARwn#Ds#=eP=*i}e>9xQctv9b942U@0hnmuZq)B_Zqdwj=dvtKRu#*y z_}0g-E|Qq^uKw4{$hOoNvI1EDIhi%c`^yw^6=CClz3t_5cxdl)%(TT>;w-NFLa8mu zcj+AgCMZ~YPd-C!$*25FblO4v8jYt=D&v3O{0!F20?x6`Ln6G(ab3SE98!@pp|9HYjx}}UE{?vp2pr1FjhOXnI0I*& zs6}r4>%m0UDsV`Iw4R{ip?|-xL;mxH4@eWaRI=*d5B!or`>gN?TYZ0q^}+zcqM>!9 z`(}prF6kC!k-c-LUL5Dm?M5yem(FcsBCKXS*pIoJ>*K`>O0ZJNYQQ#Ro3!tLMph9{ z`vnZq(ae~|tL=vRQz!j*1Gf%L!S$Y334_(tfZ?&oAY4HA=$rF}HY2?WhXa^qEB1?Q z{jXLeR6`PckQ;o8iI4jgOG>D#0Q8Nhx_i%#qjCqhGR}ScUi^sd%6~T--0)3}l0){O z&MYREAA8R#@1Z4gHsT8sn^@7Sa8vg5>NbN}KnVV8_Gc2MusT!Ua>bKvc3 z@8!G(m_j>k&?`rN8}J_*Du3j6??(b}ZWeT1vsLt_8^fVv|J{YXAa)*k(74O`qRiO0 zS;3@nzn-n(N8f@`Q7e+#po-dKn8(qdK`->s7#r!*&T};z@JYaBsd^FiJ3h8XiI35aMT3 z47@c*|9oS=LZ`kTM2g;d;N)mjJgP5kH~hYQhHmoFDS-uV%wF|>fpk_KI~cyqmy8N6 zEHnHt@S(-^;N#gB-qHYI3ZtrB}v^?z#yLRrPx zi<;mk1bft02c29o#j)_62{s60Xr9yi);0bu1!8rt@e`=*$D{JNQYsHHrY_4TK7)~= z^iBJE^+wmpNl2EkaZ^YRRMs+wZ=2L#+V?^3=`P@!U}hEA6}?le zGmQ$%)4!wM8ueweJjeB2j3kh%2JgRcCf@nl(%Fo}rqz+IJstcrn%MFJbyrnmyEVtM}_GlRlO{B#P9&(my>!PFBNL zzWGo4DP##MIb>)0e>N*(;GpCG+#f`;$<2c8p2%c5W<1h-BO|&{f3);Ump1lrViZ(t zC71JER|vgf}gt{&K)pS>^T^2S$=iX-~F7YA34XhWm#ieF+n8xf*aT5Y<*UT(g#I&Z!u@# zuL%_ieNiQ&6M{-LTDDpubYqHH3NCQ8XGE;GN_(}HTBYA_NAcWpWMAPv)uTGX;GBpe znEUUB7Z40w5otU$Y-m-DC!^G>6QetEosEd&H;qq%Ju3M6%NAYGZZKQu4p>Dc#Q)(+ z3|Y6{FN}=R%mZ@7h`=}h5D$uD`{ix;@Yj=&J}byObc&Z~e@Uz#^D9{JouKM|qLxj* z;91O?VjdW%xKJ6VI-&L)O5KF3Rw4|Y$mWdfM0QPu^D-O|VzzhK_^%Hl?NK{kVko4) z!Mh3NWn22)yDh2iCR+9`CY_e8d-pEgGvg)Nw2;8$dufbL8&N>6qX8NNg(M&ih>r8d zA9r!f3p)$w{w79vY1Mmk9A?EoLdvuzX6&~{gDOSrc#s(qtq3W=Ry~kLMFwr$Bt{mS zAHb_Wzby!K=+SEwX;{yIkdUqWYtI#>JEE{`FvBifbv@L$K8HZ+s&M1IWpEIC%43WW zJ3?S?WU$zn{E0Q*tNcww==tH3m>YC9h*o$JfZ1cW13@T5b|;facksCpp^R@AP-s zq0L;+=BxVCV-|nEsuMakt(CY-D3j}oAz{}3N0m4?KcC_XiDd1>8!uR)t=mw0y~ESG zHcQtn)vF1VLZnZBDov0|{^32~a5Je#^a$lK!Y7a@8|=jVW(HJ!70zu%u6Hgn+2KuH z{f`~Yx_kWC?(iODbhclX|9-+dMN7hHs%n5x-4W>L&kGsTkFu)1=Cvwq&(^Of$}YPP z6|QVqpGt>Vt3k1PGd|PKx!XKUp_NdGXH6`QL+*vX$7j4Eh4zN18p`vzk5m8HT7tv9 zrp|oaM<73`$*7O!Xsr}Hvxj*R~D?8n> z@NLhl`8 z0K3`2Uk4Tu^m2XUPhvpy`~22q3HY(E#NqXq&hDks#w#kk+Lww`y@JOBQqGrpVmnN0 zCDdeP0P1&Ecx985@8dL_jm=P5Q4QyB^1}){a3soOB5`LN z_B(jHT|_@3(B0VX6nrP(Igc6oz4(OXwMRwuE_KhzijK=BaQ0<0;Djc| zoo?B(*-?lRIg3prR?299wNi0K~?6&+0xPU9@X>)(L?zuexCzp77&B#<47#FJ46TwmxR!^28`?G<~2gZ(qS&aa4d zFmH9H(3*@0)9*gd1v_Lx?+>cF5w6RuWey_eY6mHNyvOQ}su`7vhD|F;<1AW|9Bwi? zZFI;aO`xatjI2E%(f1b;D5+i%6?==;yGmQy1bYs2Tr*a?^$eB)$30)(Idfyl@F*0l zt?Gg|y>P!)nVTq`-hf;?U+N+LOI!7q`Zlv?P*)j`R6jBj`Q(HEZ@2?)CPI+p+;Vgf zmvZy*xN0C++mj4p{X0~Mlrc$mDOQKnwfWKEr9nAYYxvKgfCFQedRHpTL{7j(zSjA3 zo-bYtu{O$*PMweuds;BszQ^M*tLPvAhvhmH>)4%p&2i7&bu0*9IZ&i&VuV3Eu%^bO zS*w0^a;BsN{Mz2@k!J1pgN8)CQ;rh5Zn!wlzT&?R==%%KKXs_ITdc6Get;AYD;?ZM zS3&_+sKkp0PH#T!8_VT9@`Dd<_ABDso(j&haQm_#V4Cd>fmXly@!JG@ zm9Rj_EP@#F38_^vQQVS6_~BWm7{Yo0$MOl(B;ov6e~ArOAdZV&&8ZDbmdGE-=A{hl`nnkX%U)O%m+A^uc6klc-zsE_y>TROTeclRpY`LzF@bTS z0w7xN`$zwSDu!{Xhmh``4D9M2nJ z(|yQV(akQ;rJPUr1-D@9A-9deWb}MLB5lDd;&9x(U^}3-G8`Quhuc2 z>BPn_h4I^tDS_HDQ)WaEi-;K6WG8LlrG0Ao>hhv+5*)GEIGEv;AKlNG7pl|t z8szl-|-u?qH1#=LUz z3oi`-CvWk?h+wI2Hoo7%x-60~@FZMJ#=BNTKE;}$$x1@~Gs#BUTN&$>EdrIj4k$o= zSs&Sav#n)qMaEtiW&45zPIt`S<6qCu;%gjk{B6+;2PkomC}dMerwHuy9vg{78|tS8Y8zvr%O=TjXqE0(5;f<>=R`^OtQ{ zvg?o)%~RK#j(JXHJ~MXTbHi`ITjPakd(NEjk2Bw*L$7xxELV43DTr@)Wrnk0f7+z$ zrXFp%;IWQcOsb%+ML#du9(#wU9Dt%0m&drx>mz>PuGi*5Pw{GTbqZm${_(_K8`WM4)gSYH%g^(QDgRhYZ9D#V?6)axP6o$ zm-jeX14|9>b7M>JkIm$+;gU48;ug6l5$>*$yNzS1Xrc(G!MyFh3HtjsLmrN!{6U40 z@1+hQy;lP!2}p00NKw_b{MPrZes7^+ad@bA8~7f8=721u7V;xg^vX}EWN4RdG0yPh zel(oL0$}#1ML*9Jos@_&6$;rx*wojOm+%-BZ?1w(pIN6ma1zM`}!N z6sI2657wa^aC-5wJlJ@+h+O=kHI^KAU{O#ZD=Sgt#Z3yC(*%_?0q>*}XH+sT8%YJN z32z$2hZY|o+I-DEmHhaP)5+(rTKXt7t2)Up#HxE>#eg9vEcb{W`Aky^#&KZ)*(RE# z>NtBr6$F+Uz%KTOABpzVcTzi&i;C{-vLPg%w@j3u4sVVia1s%vO7C z%AK9CY&63ie6G{IFi=W<_~t!GPS!J_XVseyg4u@7Zd$3Rn6yI;wyGRr!Pg->@uAMo zU0^+&6`G)io?)G_5T$tDYb#;_B}`l10^J@01#1a60mh;zr19`yEx>!{l&aTcTbu=m zzn&x(K+#H2a;RlOgTu!C-|W}9fTLOy$9qN#1bvV=EucJmQb8WXxxYlBBDX4^{X-X2 zLJ2;PuDm82V9(*~2b5VJlrUA4t5Kg$JEMEHSvLf8z%dp(Li?=RcIZhuw-K@$hyG>0Bpc&u|0glzOE{LDc(&EITVN{-bgtAmp}j=@{%@w78W-6| zG{5}2ovERJpUP-T*}{-5@?^_7)SgJ$y%T4FW@ZssKmHbCUjK$l$S57%tUjUU18JQG zPo0nDAyOFOW8<4blQ^R&*s8(cb!~T87>FR$BGuK_4_CH*9X>034|+Jz^(?vZV2${u z5tiBF*Q=sUv2G?qJ>`?Pta)a+mPtc}?ZayfcwXyuCJL0nD9)a%iJ`+QjdwVC%Y|v% z9uLb;O10{Mq!hc}P9;KGs&chgmW*jf=o<^2t*4o5O>ABF@Bvl_ko}K7;Xh!09m20u z`+s=;{~OuUqYLzS!8$2G_e=f|2Y+xkhWo%}f7w{fZ_CPoI*h*TBE69bPs_a>?jx?$ z)XwfI_ikXgPPAi`1;hx}$pdjOqxgNC%eb2A9=TONt&hl+Rq;a3!bG#uEO1-78*X8$ zeT>a6{vUzq{S!gVGY0x|cgb32kog6_moH!DA~}l5$!;+~tBhGJUN!xL!kd30eRG{0 zEocHDgvuUthU)ux^W%BDyUD1M08!;>DMNn2`=r(R>{!~-VnA49@O3wp9J}RV)T>^} z1uPtq8_F(%BHw?|p}X>-RC~RnQzG@?UPX!{8el!A-Iq6bTa>6LczHXDg$DMUDjr=Ae|RC(GcIQ(FK0i zXVfYBADKJ+m95Z^_2bnW(w23@^GzkJ?uxfw{l^H{3o5Gf_KN4zqaw|IVFqX?%hQ$R z$-%zQc(zvzl2lqef5jgJi6Z&^NHELum3hYX7{f?;HHF;05!jG&bFe>|L&O;9HY2*+ohatpN}fG=R$!5KY0{*)M5}fFxL9Z2S{V+A0|sAkV4z zfuy=cquh4=wp^^|lr8h?d0vLkAUKlv4b`7WM=FQW`fDVgLEfB|n_3v`y+R5_Ox^l+9a2FgZk{t85+xM|G?8fH`<4&XEt82`22S;k1 z(zqfwaZ$I_+#=lKAe8rZiCr9#NcRCXH3O$@om(Gr0=0nK!)Inwcb?0sIv=)iiwsYt z9h*;8tN91mJCCyVO?;nxW>VcUw`F2(PyUOEp6xFq$yx2lkk8w(Pkn_q%$@D@+;n^( zpt`*I_}TK)*v|?Nya=CHai^m$O+Dh3KHK>T;hD-Cu8NKMmA~-`(o5x0Z+W}x(n|V! zs+(G9DhcTIlZ1O7NmZ%gu^!W8C>n;*gSx;Fh-rB*!q2E%Q-akf#q+{UU+>-{O!;iO!Uwqf_xMGf&_FTccRQz^jyLS{E^Wh` zTJKTp_1ZpaaOlwSh+L4NqoK0plnEE*XNey^G4Mu*@i)Aw8f7WUBo>qWk> za~y6ya2XyNQ8(kxKlEm{Epg!IM!aJ0!`Oziv-kU~%9C0@Aq=j)iW>%TeX9m4C)mQ9 zPij+&bG5W>Tw>1Pc@3TRR06f#Sr4{b+$BCBMF&Gf<%OXIJ!5lA1LNZl=T@g@MSib> zv!Geb_;>}t8L@s3cwQKxKUuDt5nePX!gKFlOXcNHbzcSB{PohV4e{oLGTAO$19-3B zwcd?*Ub#j+a^mrW!LwVGj0rnkr7h;)oXWL&dH6GQG<@@e?MlOBGt`sOB~*}Cj%tp! zaUHFA62GJpdRD=h`*Q`0pkQ)KeW|evkT;p`n++OD1 zHwNZED9-#tgJzr!NaV_iCB{AWs%JCT^7&1S5XpSV>m_l*)2s8KM@!f0u&vj}^`Ouv z5@lG9tG#2zRuw+>h8Cwezu}bCHeE&2E@IScS~ITT03UhDCCE(#&nBl!3D_c<@J!-L z;8UhA>9mE{wI!nhiRyuQjyx7uM_#4Vsxx=(khQe(1&6UmzaDAx)AJp_-61yVSuE$t z#aujA?lMu5w8Xj21OPNXK3~zRTUeO0^7;HXgQfg#eal`D)l$Af=t9azV_rGk)SBR9 zIF=PNK~!C$b~VsCcL>Gu)W}!u5}V5P$+mj#yYRC2NN_-ufzFJ%B9A@amBDtA>44 zvL3waT*e0AZq>-#veT|7?QYn)$GMl9C3TJ_ljLHjU9q9)N-R_{3Y`<$_Pf6DmY60c zNCI)0EA}YPyCR1y$)K!7DQ;oIxd$N~qkO&Efs0F`cIXK1$mZJ#lo+b+)r+uZt?|8C z+8K|)Tsu7RH{Mk53B%o&P^4q&tPR7-{i8#l@U4EJLThtI&ZtTc0tGz7a;4E;9)+_J-#BxB?J5!`X^Kkz*AjO9u`)bj%%)0iwd9I z9(HZ)0i7i|4du&}x#X&t;@ra#)^5NgR3L^fjNmjK$I>b3U2%o#DV&4R)_q#q1@E9y z&dvG5flDQFPyG@FV9k?D%1Xp~E%A8W&RG1f{5*S$qD%|UH0`yP+SPt3OfUsFbXUP& zrV}>9zQJnsIZk~IT(Za8J5-9_ZD|3a#RjDGMlsZMXYZrEhl#?`P>shs54SHYc}{)d z9SAzzcRw4P07)3$1(nUQ)^LFqhxT& zDBt-f?`>O4rWBK3{=?;3xXk%*To~Ro3aV}&^Y(%G zqoJ;laMGp=cc4DjU$~0>a4`MaAh+>gw$RsgFxv+Kl%XpK50_V`3*!= z+jzYp8L1K`5e7$C+oQB^mREo%rr8Nj0AJj0CtAxosn_LN8{-zwFW2K*iiN zn_h`cZv3!62m3{b2kmwjGsr(P$ea|iZd=U^Ni|?+zV(@fb4;MGOz$rPp%}O5*tut0%oPq0h3!6(jkGDxjM<$BzA^D!3$Qc8jp%cQ zO0ip7p_lbfo|2z?K@l)rJ6qN`OJvI58q|KST_Q+cB#KSDVWvp{+a_`Hhgdrgu>yll z9Cpqvw?7+61T}^6yt;(X15>~zNhn%8o%a_!GH!8xYC4?-)|07f6U!zy{Zc=3hgI`a zcFgoN3)tyTzA+!uNU|e{Dye$py-Sv=+KtH{=>o3rgda^T4%ST5IMSS`SVqiRdBhP` z77F>Mu<69rT-=fI#&dW0>yaU?LsKa{TmTZUSvJ46e+zXTOz;iuIzIII?PCGP$9Di_ z_7@G0J%bNq%r~nCj&^ukqPKx@$>EOc>FsSyqcP(w-uU?LqbZKn4lqZ}{@OiRt3wI6 z=bTA%WIOd!+U<)*$xPSeKoc71_r3Q?0P^jdMM=Pd&yEN{|kT# zFW|jPVh2++)ogTNhVX^WPl>{>p+U?1H?2Z@vPzUd-7@u;P@$Zp+dSbQWR&2T((_K^ z9~Yq_n3%Vyv^amdMsSBfXkjfUENcV=Xw{bJkQu|p4@>$z+xqg9|3bM4(&drST!{}} zDwr=T4WFUJOq=X7LWe~0Y#|JbUYgGzB98WFVIK@)0Lj54JAzSRbeF9?X)Ov16Wiig zC^5&Mdh#cJ$)P>gpzM8aax+FU2GS2WhE3h8##m&T1Y{MLrN7!LSjmNAH<{sLL4%}k z?Z#!|iSHGm2S%tRZ|L|@X8I7KLHJMs)*1Zo7bevev*VcazYkO>QlGd4zr2q&2;`pF z=YS_l(t$r6<9?)RRMgn6xM30}dRW@M8G&{(vs$5!@5pYxlXLb^@>cpZ2cbf1P|1q1 zzNy1uz5UndsF#?z1wiAN`2pr=25l<&E5Gl$&H?~v>dB>ffB#NHNwW-cGJ>y6J&W$c z;g24`wj&;ss>-bu8q~Km`#bL2Zo*x92XX75d z#;cl5r9BhkO$D0QcQRa8MG@UD4KtHNEH?=&+qaFrx))4G((3{@APis!pY<=~Ef2P9 zdQj{yWTr1T4Bdh#H$6NJu-@Nb`2Q>XyzayPi?xGM!lW_S{?WLKOR))J{0nWtj}mWW z#>C`!-`Jr*&Tl&HH!nXvdn=l~)^^)dshS~=+EJgs_lk%)9jJ>581At@EyB)XW7Iu> zyAcZ|mz>{?izvKJ^(@kIllccsV@QGG36oK8$hwt&VG!PB*AAQ|n#bOIEGO^bd#?qZ z9qqYHyD`Rs9t=Oqn!=kp8TFQ|TkZGz`ssxNs49@$h8wx~J#uQL`k2n6nxzdJ*ZYV< zI|Q;%SP5ue42Jby-*NMX?1`!$s^0nN>oF+j?CqHU8^op1Hrf#c?<0=a#Edt>%0+W7 z-cSaS67&fcc!K-(UfxIcE;bD?QlL|Y74L(L>b{L(&$tWOt5c!}aUK4(R_KY_cf}ho z_x;+;_NNn34|_C;gFz2CcJNc?8{6KJM@Xd$#fqPCDR0hPVa(pEwYUM}fI!FEYfbQ| zKCA{@2N~pdc%52!4)u`Hr^CK2u}CpU)^ryMJ0E7HQNGuSXi3$2bbcC&zoA=K- zstAtNE@p7eZVV{!l6(cdu-y`7vd?Kv%w;U?CXT~Xqf<}+7(|sj*!qg|@w?$POk%{QYMV+M%3wXsK7IM=*LxY= z(#F}=tXo`qr~ICI#T8d)@+xw0?f)YSp_Aj4W_;q^bNBtxv8Zb&=ikZ~JO+rd^^0Ns zy@HchEZI;$#~jbqB1Tw{{c!Uq*#m3mO_|^w65mT7e6l`SJDX|Dg`*sH$F^HRn1%1*De+=S%fK3>|6%G4#VF2I7yGHYR#1Q;AqUf(D;o zCOP_mKdhi={*drP9`{uHLg)9gtQf=Sv0Mq5;X-wx06?r!YOy-1g}W}@CX7C8)C=xP zH4q82I;rpx*{7r%@CE6LJ|H+^)kK{4IKXPT^3`E&$8*=r%F*w*^>ztX zL*wpV(wX}6OTFJlEY5YQ>A{QF%WdCrcTj2d?}MAFvuSn!s&P|sH=~y{b^aT$vhx%f zw#DC5VB;yegBPD{KlGE$_Eyc0_Zqmw5EY{rG4F=2WpL{lG2Yasti+1`R=?OgR6F@* z(Bu&`Zh6piU=jpy|1_coI>@=!9u>PX?|pE738hEUb2l1Fv2s{5y=Y1~H2}*JfHUnf zoAUjtu;DhiT!nRnhfrg7vv%*1UT;&lp~zgJnn^->^lYrIlwmXoU4Q3pOYozZl^}Ka6QfHtqeBNxIGP-n_mwNgPXriGmTcQtyIpQ z6{PPfvSG07r>-jJrPa~p{3Y@8HSh2)yqDa<-Mtb*bI6<$1Y0N1AKB&#BTK?Z+w^zi zNMw{?ira8QM>RKKJU8KLJ@Wj={sg?~>fOab_D}ndd`N2dgYx+v1V1UfZK+SFLW~6~ zdtXA*IeMe5xPqLvKbskt1NqOspP#pqetT-yHPu1?4(_{~aU5b?ECqC!%bZSr?B|6s z6+s)bSa2*+LWRA0-wwfc!84uDzI2P{6`smpiTm8@+iuU$Ny)o8bcZ8#Lh=hTGmh%^@DY436`UBPe;6QOrYQK- zIt-jhp^|OJe|@x34oRK;uI+5sG{ZKzz;{2-NcsvoS{w8B9aS4oaXJzW{dDEH>^9uu zzkQsw)|%kjJ(~$pFP+p<)vjM1oN<%d=_XyHswz&6F(Jo{AE|aMWetFmi-cZJR1s>0 z6(n<=N+W7La^`}~LIVB(`X9fMF2OC%)Lo;tnU1Acf9`5-5FdKGNe&n6f` zED}E>gWITYr~1Vui%w$2bHRAB(hd-fpR+grRP46`iOD*bicp1(Q_Xg52spMq?=3W1 z7=OWzVG$^Hk6Ne(asWS=cB>s}*ZXF7p3j^!P3GcAVV=FTLC7dyNx+z8JwO8J>dcGP zmQ;8CN~B$1$AcfpJSkM};div}b_6Ue9oChgH{7AHN3|t|bCO+F$B0WkF9OlgQI$IW z(pUT$WIN{DEGvs^oO>}BMVLS1wN>{nlCK>oEyW&I(QRQ!F#n_<3ix!FuIe1K1<+XEx4*fS;Czt40{1*M;CNdY4{&iDXOnBM2`SBhc183CE4h1v#a}h zvf1Fp1wjyrZhUEUJzCPg_gvS`IQ<7{j}dkq)sFTWubgrRv}zOy}r{k|0Es*?zw2GE_mbxh?O!jH?zk z@PR6HxA?p~?coRm9~xjYP`F|M>3@WN0EwBeA6hh<+^s%+R^9SMb7jXIkSLoF1{pjG zlx4$hys0;G$fkjk>F=FsP zDG%}zUX$x-VKxGa-R~aEXvRQIh?8y2O~Pv-u6SFuR7>=WWJ2gMA%#&99iam+pxK&) zZ4AnKomiZTE^d~wBk;#3>-Lo~4t_CS9DRM}M#yPCHFQ)!vAG;6dB02QOKb*tpQwDw z)<>5B3fD0`{OKX%!4{-N*7l6^nf3-`AN%n-KjVxK8JFeW5dDuWf#`GObCDPF+Nx4- zat~-L>v!%1g9swfeTZ8h(mzw!enGEsM7AwO^ZdpBJAGraH(YZlTJor+057k5&P9Ca zC&XTd@k5e9uH2hLKhtTlKZ*6VOZUZm>~+2#o!pf1&iG&3J?scF?~+5(ERv1w*;{?5 z#=cO<%W6MnaZi85%dAa|;2Z*P)TmLeZ8ZD>8LOK_|EF7n;oBlxL7^=hCt^1i`BP@w z3HN8yGTy~Z2rTR8e6)C@wHdUT!aZ~qxaN%&V9m9)0I&g^=dnFM2JpGxc_+`onnH%? zaWzzyb;fd2mK_LfhXLPQ?%eFb^;s*=TEEc_wKcQe&w{T-IzJ*|35-@Bs~Q9r+)w;U zqqRfEOKLWc{(^bw2*@ja)}OQsdXhoj48QcpvI#U!w1U&iE0AQ?(9tXZiBAg?8K5iJ zRk#53hroix38E+$Y}EkuMX1AAR|7CZEA^wYFuc4)up*-}xWJDfh#eglW8Lyj3CMqe zIvktS6i_LLW}|1bkp)i|lppuq3g^%?x>-XQYDdq8$H0~DVHopqqM3A0ACxJyN39P2 z+RIA}1aW5ytuuHRCO|Gqwy?GAfNpxBn35tfF%N=q(k6nfoY$^zfS#n$o+#QxLiy)) z!N~&xq1i#s8{J5tn8137daLy?5}=IEIUt*?s%K8@C0U}YmAU6{YBRRmvCm^kf>G@+ljq_6wiUI0?di1#ER%2Ri0KnHB-2-q|Ow!x!5a=0| z=j-Bh@K5js$NxWo^g4Zgf2}CDEf{%@Y18QloT%++;p*is;MO<%Rc7X2Je&Sld=w%% z{D0lhy)coVGWmLd>mG)>L7K)o&;Vzje(_at>pQ**f^Pt?VvrI;u4Gq7ugjivmutuu z$0BdN>_j{4%4JI!-%-btUH9OsyMDNM3+_)-157;QWQML<`)$Dqj{noJw}s0 zfOAnw4@B8mTT^J+xReJIyGk`beMkzs zeesnVr7(6qgzX{^dnyARDt6SzV~_v5@1$5i>sPYlm?}t3zvCqf^YWIKvlNg7*CX>> zb;zv4npz2Ryaswu{GU+%uW}H@a+qYthoT5SFYg_=q4PqOEeoS44}And?eDEpp$Bl% zw*(cL|Hj#`2Vn_+%1uso!|RfGKv@+_v-}ITpIMJKgX0Qo9ZyndJM0Nje^WI01&2XM zxIdmevcX|FqAW7*#$C68niglMmEmeTV=;<`c&&;olP znU{de;}K=S+|e&50U;=N4x3fd84%B6s0z_0e)Dg}Mv&S~2*;9(LDma7xxuQM5jNI6 zvk9&R3ZC>mGOV3uPx z;P8_T%ipm>7Zz8ZTNn2-JGJp7U-X@iIOR(cuDFS|H+A6G3A+iqb_;vClaC>s4&(SFemxq#(SCbL_KxoOxw><6mR_t}it?)Rylcf8jr#lZ zc@a>O9L#N(E$~HW5ioq=q(E=1A3qyUb${z&)qsbrA0+dEB*@#9nq3b*yQR+cyx+t4 zA(JLue825!fmi6V`85vOqt8N-K&=1ZyX>9^z33m|newZgiC?yL}1m_NiX! zjlE_g?R;~{j$^fsVYDf_h=X|Rcal5v^QJO->j^|<-c*!pybxEAH5QHf*7P#caVIK*f^Vc1}IZXOU^GjUP8e2Hi7(Z_j7$L5m4W;p5y zYsxpSQ$1Z=p<2J#ILaR`EuT$!O9tne^L?9Wc_wBYCcPi^bKP7)cM<+Ke(u=Vxn(6? zTeXmv`!}14hrBj1^b5iRDLj4_sD89>Hc8;b*AwEg9ftz4Uh99=oA1=A4^vdDDL8<6 zQGH0hPCe)0T@C^IgD{l_&K-U65?LusfDa@Ing()8e-2rJWnZOU-wOvlHts77seYKb zlt$!a+>6h(@Xf7CA;Bl+2K`}e;j_h@c;0A@oALKbn1jkM@a)+7NC5uwTAwT1&0wwb zdwVU!e$rI}6jS)TcK7Pb=uTaU@*-C6I~gY)LSCLl$9lZHh~Y^>>bQoJCe%Wj|AkeIIS&xoPATHSMDsLwsh;WwTgl zsj=SZ;zqbXojhN{{XT9kZFx(u|EsNfS;K5;v#)(*rV1Jrtq7tprLagcfcogY%*9R> zzKHTy=`k`)s(RD$&;ub{V@KcidhdC`47VaIn4eQT*15)vEexQxu)-?_TT{qa1;uB$ z+Lw&(fqEn#4l5G~0<0r>jwg5Rc~TVSVx^JSU5WH*tNMN0;VRYNgi)KGdE|pTZY%TH zzvOm3z6RYpK0qrRwLp_A5av|QpjuW9mRP~1|VMWCQDl)c3hwGTf*G2o zlM~)X1!RqtC7Ns!x7}b;QTe~932>0s3RJ`7YIlx1KtxOZ15b1FR%f2v$n9+zk!MFG zVwAU-%+K;y{J<;P>vXg%7kU)RajoRfhsZvib^%39GIN$Vjes!x;o?$j?5aPR;GD-@ z{FS{}rOElrd~iSVeyy7xdiS5-Vq{7b&9J|BoHw))`D8?3T9yymCQ@)4e^v1 z53A3+a49|?t=o}IbQM|jzvq}^5u4t;{A4n7cipwJ;0|T8U~o!aYg<})TjET8;m_V$ zOnbk&G;g2Zb!PE{C#yRwApqP>*AM9#{YV^9cn>6$<-{bM{et>*_>v1J7WDtY9(Cn3 z8Bj$!fsBbqt049}Qk7AsGH@iX3Ey<`EdhoP7n+FPr44RbZW?K!1so5btn4*G;TkJT zFBe!g5bROQLq)Y0dzvZ`>%$p9vg0nxYGH&P#)m#ef^pBK0v^3!>9kS_8)jEz0&?{Gtj?}Y1g7Vw`d(9Nf~nS-C$B!OBYon`KhM7*APCPeExf_o!+Q6W&V40 z^PK3D@!P{W6)Te>vrfhPXDJNBzR%$9>?~01oXgv_WsgXJRF%WpAvr~=|3WpDyXSp( zpRtt~+wz*4r9My!DEA>l(nu3a=NO}8F(lD;mlMyH^_RYI{e)O&%TMd5Mmg7ryt=^wE@03F4XG8oy4`RLqG7FTK#9}y2$18=-jvXbUKG}%DUH3 z6iQ3DnhD7qGOX77Chav=S%i!5F!hcbo{h`qHC1jIj(#}`yDL4`JdvnVpMi_LCN!gH z-rpvF_k2l>Q3eOj9pA2gv4aVu_>d@(vvc3pB+m;j*bf(nq>iqo-ues~slNJ(2&@pT z_!2!z-Mt~6dDf9T!4(ruxhoK#0OSYAOfpJ#_~=9^xDSyiem&OF&H|rS zmqneKZ!`5Qg)M-3F^93%F=UlF01dh&p;=)-?b_}Ee|Z(Q8Ox*R{|WLpSSNMW;$j~~ z`jv`)O?&7G`||>!z|R6dZKY$Ge2H^hDWGju-W%SAg@NHX{^F-7b1jb#)KYOEJKDw6&BtC!PJeXjs1=i5mF8Bc|IHnfXs`bj@bu(bC>I)xZkL- zMs=w?1{h+Z5?64m8k*0fnYhbM?|{qukYUL{H-GH%VBl=V?g}`?cx&AlxyG^pJXhh z{8qVqb61{F`EJ|8@R{j{{-NxZfpY3VwOCflQo2&dIaw^byT~lA;2tETJ=d(VYeaK* z@^GCJv<+Sa>67CZmlgI^nRgILdtD;8(P4{o4y~Be5ETMxoBfEBaBdKi_50mYPblY0 zy(vu9U>&{RL|>e7&v8)4dFP&Ff?<$U`T{Q8_jieW9M)f<2*S33d^8>tJ;XwO#>eU(N_Po=(tAf;U+ zdkxW>I2Lvt8&B5r)Mo~}fY2cuNX~})o$)^U^W486Iidk6A8BADq^U7nj8X@4Oolr!(8bFlFf@Pfh=Dg|BW@EzFkH`ZfiaY#45#lEdyuq?C;y= zBKDujhTx`cm5>zUqMMcfFzp+bU|)?T*vAkJ@kb2(%- zZ^xmv3<_-(WQ%D~+U)H~fQSI<3oV?q#|aR)&LN%M1P|dzFBl|o_&cBg(02HPQYx@N zYyM=kh)_0Se@LRZwW7XZA6auW}lo4WLxnUEadKNEV1F6qSH0%zXgg3XG>}hZ?0eG7_Kz zGGb~|MVc7yF~GY_j|oh>dP6F&;OyY79&QQ>RwpAfLEFK>NT92x+dws49c|$YmQ*{7 zhsj$&_cB)>=&VNMzIr{u;|jV)p8cqUN?JpOh-AUmaV~@TwPz25V%H1g3|=^r+l+8- z+mFMSAbdCcPfp9SV%m*kM7eYj$cjBTmgE_sFg6(=PoB;gJ4HEH75>i z@Bga+p)bIKpVd&YUKOBL=u!=O6^ei;xZAED;O6zf9=&bgVHn3`#lD_Gf&B)n9`{Cd zAe)w^VxN3j#@k=~Qd`A#kzk!7Iq`2632zTzPz8JLVOElp(XoLpolCDC=h(||Pz|I$h(_QehS(b&BibCh z?}CXlDZ4eJ3`x9lNuoC2~(IlNT& zFVcl0N5T3_|B2{>t^}%e(}&2zII?adMsG~<5&x6sqv?UwDnK{c5oXscdr1=m7^91Y z`13GI6}|D1>?q7I=N3|${q~!V&8-ur+BW&JSiuDHMrzFR!5mA$1%##49p&i*#VRO~ zIvNdFjzl%f)5s@mYpi_jh`BnU1kstJS5AN{p|zEzHd$8p!i_)d`;mji_ZG#;g2cU$ z&;#sL3Yt0&_(#)38%N-3*>uR#{$@Wc1W{=dYgQ$siK9ndE(3xpuxE2W0t~J=tOrsV zo*|SNGqmYlj4|p*7k8k0?a-oC*)#9FQguwKA?E)>-kV2L8NL0(8g8mvY0x<&5i-}JaRN{sq;T)-hH!vLqEGWhR z2j;p#5slr3pn(EHxY4Kwf|jT$rT=|g2Ce5=BxYd?=u553z}ty;%p!_z>3XtJMWD#x z%KS8XUSRw^ooANx@W!(W}c9qBz!yj}IbRlxhbysjxpUyf+w<7k=_$Gbfmp4{bcDCNu_o>7rItB;ch{A|qa z!vWS&e3%+DsMVdhV6+9sKZU$@N={oSE3T_aZ;`cPg)0O?*56Df%Tl?qr>sFn86Oc( zC^|L~H2M5Q{>w1oorPxX@}H)L`BN-5eX1w*f%|?>Zk!KC{b`GzUm}RhKd)|dt?$w0 zx1qSXTqx5@eR@Rs>V3-8^`M{LyxR|G1sV|K*q;%5%wEw$9~2@$=);yHXr?#-ExCT= zIm?-H(yPHJGs;EXg39PUk{6)GRI~?A~YgM0{fF%?*z{ zweQ0C3wH?DelZ7d1uX?0!FO;w`` zj1IsbUMSyARomUKs~u>USlZ3|QJ5|BY0k5>P0vqcCTU^k9s@w0F!##S_M4rrT@O*6 zW2dRe>+y5-f>QEYwJCT2%KbvxKrDui-)%|3x2HmxA7wVfC91B!wg~tcJ;73Bwn0bw ziRuHU*A{!u(v`KTd-f9X7DC?8y(b9Zs>t8+yHjt!9vr+)_9x&vM;tU^=VS1IMo0B#GUiaiGC9Jm%#+8q`)9(Hii?^N2Zo8BzXBc z;U}^tx<^N(Ke}D1AID@R+@kj0;SMFDlSwj*)_5fLlC^%(H)N^-T2WQEITVq;y?l}T z8}i!qF-s`?CH2G>PDI-h3Q+`TJp2>FsH1!6lU6awC7I~*=FKH3F*DGA`PEW z{C)(k_)(tWfm{$4lm!GaWRw4L`@lHWPLng>j#y~Nbqs4~h_D?#X~So^yBojbl(J8` zCFP<|`Qh3uZnXiVZ5=rXaAM1Hmt3`gw_$Lb?@OHA*C4#){Eqpwq-I?O z)PL>kGwIIuuGBV8o_TGumbI2}Jj$fzcVR7+b_8?yvGEqN7qs%yB}vYRAE&yO;A=yv z=weczZH_7;KUO*hcr1Pf2{7Js3`?TF0@pWSq% zkS;tgx$}$3kv6nZHmhq^ZH4b5PvAg$JpTtb+HYdsOf?+-j@U+L#j&}`+{2r$yJ&sh z2=n~jxx=c_5hs<52iO#|2hWC6Atx=*Z;e$CGZO|8Eg6JP;}8OOO$035@|mNt6H>sl_-dZZS+FtcGolN^T z*UO~jFMZFyP3KlPdG7MGj=;q`gpr>OKOCz%_b_B0KKeO-jJEQ;yK(L)xE%UDC#97- z#+MAhE0sv+L-EY!s#y>_!8!F>&d9GTuN~fs8fOT4E@83Izx1J|&u7F(aRqhuyg5Bn z@H<5|gy9oWePYpR3*dDQT>O*G-Q+)NPO#CxPmK{v!@T*bNd=yqKxk~^x)4sQ)x?Kw z8ssdVsFFV#MV#zOBQ;+LG?HyVI%{TJ^{?GqiXZ$_lU7Wt{XZf%s<19RAgKtOYz(Bx zItzj?uD=5vVZYWV^DD@M_c`Yyi{%-V0aihutg*b(gwBJeRTlXw{P+;oNzx&XCep8fid?INVfIrPztI9erz^GAy;Li9@GO zo)a_Z|0aucfD69Aa?!aq&N))Sb36&dS6idZjx*goy^K?RN{6dtaD#A;!2#q7H7w}~ z)_o}UDAr}bXl)7go@k_!vQVhVbV!0B^YuDIg56csvD@nW-k~$CASgrT!`E<+BPixg zFnJh&Bzi}p^H$%dGd(i#K(X)W-7_Cp;@7RtEpmPY&!4b z0D*4^X0!-e=#l6x8aF=^jEQ;}kGd0p0R&8+y6eSLwS&N8lD6j>IV0{BpQ`nn_x1qU zy05QB_D1%zXOAk@scEbruB5Lc{QB4g@ZDTtGrtT=)SLH?yDS^<{n3bF>Po}46w8V_ zNL*ZxvcZ+z|Dh_$^L6>9cpl{4dl7)Xda`MY!lz2-Z`{HQKH+*97+JBHGQNqvuL7(s zfGRpIK zQ_y7c*nY!grDR?BK8Na!mxiH(0>ZHy+YDSbFtcPnkeLKuaM(IS62own5 z1u%gmQz5HDKcg<=`#y`qwSbI}4sfyGsU=zraqhZh^Pcq9KGwI@oTQs>zWEje8>gWp zhD5ySVSE9IR+F|AEH|;yIp|>c4n&ejT`Z_W8Y{IXbGP*Dgda+BXf@*WAFiiA_u33| zv6yzL35EUHEQ6vQ0iccuR+f>L9Lh2`$tf0tMOjUWi!gb_i<(v*2vwX z=?Dtmrxznz0ZdK>0$2{!_U?XZPI1#@OKfBEnq#s2*qxduyyDRzLg!-uk^;7c1d1m} zngSP{6U?bWyi8L`@Vk`nt_*|47yr}gs-7+`yD)|nY!K}t{BX}pPbdJ;Hee-h%E(q1|&B+V8!=vHW3W?a0y>J?s@mb~dQ9lw6XRW9*nX7d5e zKY^Dx(&M_5oYG~pBda5w4souR;`GWM`2vdjRg)X1=bg`gw85aWQWTsW=(rHQ?0>TT z2PU!^s)CXyqRvPZQ}Pd_GC7A^JiWdgYI#gseZ|a-%DijSmjKE@FyLowO#FZV&&wx; zOiRWjbWHxTFivLTKr98_p7|H0@;8#=Kg16I@osFk_V-=={EqbQn1|W^jqGYKA{Fc{ z-mwGeF+uRvRcPIKgXX=#;#RdzDc0;zVM3*Rcn{vyldY(^PlY6d2B&aO_8)Zkx_F=( z#OwoNaKMMW%CRb^LUCeVFYJ5wG?kWSO}JACr$~QrSL*qXu*A;vBnCYcmO>@T_q)<18J+ki`v>3#VaG7b_JT%n z7{3Hk!)1x~C?u>>3Aid~fc?OyxRh$c8ug7v-5Gly`1929T8#%dCI7~SS#8G4{Jur* zbsGuU(fvaL_<0(?TZjj}j|+t@&Qqf3xjx<%q;1Hl5EK|Ut}YQ3@xT`#b%CI0`Dk4Z z#hrY?EpBB?-lIg3e9GzJADga~0rd(F#Y%|1@piJ`mjov1q!u{e>Gw@Y?^+gJbf_0- zue=T7Wx%H;3MDO2kNy|OH6?Mp8-QlgNZb>Vmmn{)HAUEAUlNNcg{toQ6&b975;pij zU)24eQSa$H6(m9K3ftzKzY+rz0rdVqyb!o>yVe~zQ!TR6alt4exm|ZV2)|(l7#Lcv z4Fz%!Eglp!HJqIIesb2V2D_^I`%zy7B=jGah##Hd?3k+D2<9K|ZV#`(Ps?to$MA-k zVYi@1ckgltyQaGylMv@iDOS?op9>UHUu5}qHQ%S3MBe?KU?8hbYlBFsY?AG9(?R4? zHWTe_{tlFv5+uJPck2&;e)z+-ssLFk^tEMS26m1>CHy1-524zmM3J6`Qlm z#1BP61q8wP^>(mi2ws%pANu>jBFh0_m;8qu6ML`lw%k{~>F{hO=3w*H^U2Od<<8x8 z$xX$!4zQ10$lXk+akmN`yJF$4sO4bhw?8GD)Dfiss3x@m)udc9)IONIa-Nl4xTW8v zQwi|*RHV_$&I@Cifwkzf>aF->uJV>!`r+HUD2~s&42oSGLD%j+Pj@w!3v@Ha2tAh+ z2*MSi{3Vu^&W{?3H9O_rNeCwy3w&8_>-7G`qEM*BZ%!@arFy zlb%h7M}%ve%G8`P#7kL8@1Y`W&rLotoYebjr|{U9GkNwI2N)ng&l2)+toX`0>hvY& zuid@hj2ssx4Rm*%T(xMVGCv+XkT#I-_AapC-fv^kvY356U;V!EVOXavdHbGg-}hub zy(eHlLb-t<76>yx-#D7#?e#c{+;i?Hk}=Y@@7Awam*Z(Sj+*iQe5f4mHdZFpCsS1w zSgG97Qum|PC6Hg_XSWiOD(qJ(F5IG@VSUY@zw_J02g)qyh*d-G-Xb&kEjGPe#3~B4 zn`stCdoIuT7Mc7>*gj{e@RbMLC=CK^JWfZN>*VYQgo3@$*sF)XL04$ObPA0Su`ZbB#}PZ~Bqd5!S=< zF$ITJ;5~AW3O;)?RZV$X_&qA*z$UpdfnH;I1-qH*8%8i@7IzJb?;risJBxA2T|$bv zxHj%hY^=LpDN^{tvQI6R?YMAK!<9oR_WVbhrnCL*v159ot4GyvY($f&I^_7 zMLQ~gtN%&Ws8W>GG5R{OS_t5DBC~1j8YsC%%(c6+NAH0M@UmWmd@N?U#UuP8w1!E( z0^84Q`5Ez5%=mZus`9K&KxcETa&btnQiEDjRe}<5)^q|dw!Rqlw@}Uw&jGFiS6LOp z1Q)mjxr$#TkI>_V>Ybms1@W*1XkwB>J0BBgj*iB2)jtvtcKjtQwcYcaX76m1VI)Xp z1>fhj|HiS8*(eQWdi;>d4ZiHS^Loxs zc42X8F3B7WN#$=y4I75j);BPGX42M{gu-ng|I=6NO!V?TjkZ=Zu(A!~@`G5nzjG_I z+bj3UnF~Ne?|@%|3q!+416_SrT)+fSLq$^y-M?-747rm z--0H`JpnY|$mION3UG+ql8GqCDFXzFK<|WZr8Og(#MU`}^8aOMR-^Mmb>CFN5??Vr|c3ubdfV>55tRECw5_ zEq>9l%JwpqIx*(F!7>(0osj6h`L||i%9szCET!^rP}f7k~L32Edtj-?eBkjk9Yo& z0#T!Y|KeWwa4k4|tOF(p&JsV!Bp|UJ5Jm2U{i#QA;lGf(XCFjERL7QEsZ-;!Ikf;G zlIG0ZnsO~zD^(1O{62T8lsk=Wk59TMVFL5U?!h23XHZL)bn z+vg0DBlb@RpyC86N@k8lKz6(46~BjOCerGj&Xo+8Mkj4^-px$QuL67|2llts&VtCS zSm2f*t39B)7nf$cL)w$nu=#}}#i6GT?yFY{9=CTE)0ows+=jt9a89kVO`XI^sQ{FC zrWwU8K)V6Sls<2+RTm!D(qj01hK|)qfmU?HK(4K~KrzOS9CuTgVx zY-y1d2EySJ8(VQcOUOqXLRNO-nZ7eU+Pmg4$)BR{o`K4a`I;Z9&11>%ei`n)N07IE zE5Pm1VLQN$wQ)O@R3v9qraRINyggEIjeJHZ^l`Xwt5@L)p#H8fAE z4#t(uAKNGXp7%oX4X}t#$9=>J;(Dbqzh}!INmoe6q*l&j`+hD;%+pe7!M)AvZMDk_ z8d=cBGY|Fwu;Yl2_>Ad}1Y|ecZU;OdUvir>3@JyM?gl_2p}&%;Mz_aKb1G5hLmu2i zVFa0wk_#?r?8KOy=eTeW^BJ)xuYPFYRAZu_XY~4nRAV!0_N8Un1f?*U3H@lh2%tR6 zeea(5*!8xyKe@k{ycO#ZBR*8LygaqKyexWA|HWi$Ar)X+7niTcE~c2mZpOeptdpP2BZu^2fRB-o5zvD}L(9YYS*sX#Gno)&g^LLKGo8 z6N(J~KWIdD!t?rHz9<5IOh6~1l_LMx${Y}!KJ*Xac(+smASXKIw#`Xb2u6h3$}j6* zCX{#h8IMLYU4DMjjaHZ=t|h9Wxd+BKwCPhYtI^)tr-pgN>(xd@9N+!(fF&mgCgB8c z;F9?LJ~o`^+c#Is@2*qI)Vm{HJ;(12N+~Ki6DWD_e*I@%H!A>m-+NN~DX**dS%4#= z7Cl1d)&jrmUW44Sx@7O8A<{GI z0Hw)z(A)4*eydX#Q$ zK(oc^u}spZF+N^htzqxrbVZPFMVvQpVEl$M-tpJ=LvKhgkKWM|4S?j-mrgVzYOyM- zQ#hVz5=h6zi|v@ddPIp}sKeH6J1MsCG5ToFGj@&-H#A)NPnusopaf(X>Uu2Q7!59k z0j;Q~$+t{yr$o#($CP^~gH*@O2nR86t+>%?s1S4Ns@q{k-;V~>Wvo!+FcYi_qs zZW}vK5pc+tRqxD9Gq&(k@)6J1w|qdD7GBz``5hU?2?8FJM(&g4ol7q8mG3SsD&J%z z3e%w!#UAsj^J9wklxAVzE(8eyPgRwiG5ow{1APi}8tB*hD1Y})(w)ZZ8GHLCe?$ua z6DeJbyfW+)u_3YwNb%=e1C7g+;17dEeCR>_a^6F}CrD-7`T>BW$b{`K4sTD}YL+CT3k6U8jk=PxH>w4@;54 z$F9~<%oM-t{CA?#1F$?e_+YBeQSu%^a~$;x3l0ms%j<6L(^7flKUJQ=tOic2@F_|y8m-O8p)q-lvku{k zZ+ptG5MWtLU6!eR?qrsoF1rB06v_C`4&;I{?uhG(Ua@3$d6}Qhs*)xUq&J5$?cGxTUQ3VqBgR$q}3awJZeWyT%%l6f0B#b+y=WTah}y*TU87dyQYUg?yo-=9tPlc zmO%KA%;SjvMAw8GQQkd*9JBzo=@9Br5Z`yC{@$&Cc{Y>KtzPDI-Q!@sw676!QBWYjV2&F(%N#3*RQXx1>;zkD!Xw ziLS-dJ8+JE#JWb1?Bv0h%{STLqVs||^+=3OKOmdd5fz5aP~MjS6H09V2KIx9&u$EH zLDx;B*uD$IKb1lG9OCT&I~LDJ$Br2gFaS+eY8?nzJ8`N}Nq@Qv3!g;u5bT%ay*thC z+*pQ$7h~4j&r*>0=|gT!H2V~SsQ#oBh^jLjrwrsDb-X`f9K#oX?8FQQ*BqDS`IK!G zR*=m^uN9%Hxp7U1f_NkGXI*CkpFk}CLe8p8C@B+(#rsHL=-PBSbQS1`K9u(bE2VLrt#=ic2^i}h2zbo z3;M`cgpG$TUe-fut|j$O8IuRV{UlzRNF_b_HctQ6Gy0;7Ei|2P+`v4&&N2J@AkK$Q zud89yRKxp0=kkWrSpc(jyT&)WALw&*$_U=5X_HivIcjM@Dbbl69K!C$g-;AVp^IFU z@V(u3eD7ggxB^)7k|G@>;2htT*_b{*Vvbqe+6`uzI0!`f1#Z>2IM852_39$S5A9le zpQ%V>({nLTwEVKD)OPUWn(pVq?o01dY5bga-+u6dIf&+?0^<{LmmI0NoC*w% zQQ79kL9yK*6dZNlQ37fwxroM;2Y7&zilaNJce(YfgMem-y%v|?`}q7$3ohWE zRT!EXCQQ%R@08rqX{{a5cZnau)YOej>73xhmj_Kr&uwQ3;u8D@2P z%XWHOEhfuY+~R9Yf!w7$YI}(9Yo?&==2X(??zi_jB;i9U+sw+TTfNZkCr$dc4Lqeh z`rfWx$COSLXecZ@KP8F83Z&Ck9MU78Vi2E=HoE6AAsO6lsu@!5ZhPPPS{uxI`kLR) zm{!bE$d|YT?0i@kf7rM|(wJ&RxgH=BY?&%*O<*AIrF{`AbNrscDP1&HCf|6Y zBtvVz4h|$tV8CwANoF4JMc59zRvhM1sf;_Wir?V@ZThMx7BazOq=I&D+aYoe?R%BWbBp^yUA*i}M?5WJrOvQ?0O`#ca=5=L z-X#arpZNff|3P|{xx17lvs5R#eSTu@rPbQub1ofTTPpI;y3Ixxo~+B>!5dG37VIeT z%*!8Xs*E2GT3!z83U?#vnp{ZeH->q!+rL6vKA-TE;X8E$+tCi~PSoMG&HQ3_DB|r% zS8i%qC?J*RvRBeN$VV?3!{gaq%l_!=*ch@gvGMliEu+SZ2TpZ`e|8@n<m#Q(l`X8m`phLbUwz;JgmHDAp2Z-w_x=hmc^GHEV@zzb{@s=D5Ehxofs6KOk;i*DO_)0JN)@L8!o`#{+EU|tTJ{W_zlWgr&;@he&@8=a^u?IB`&<?x_w(U?5=u`b*!i~vi^k$Xl&2FqcE3!^?J|7I2!f3j>lUu}m;H~C`3U0UbymuYp z^?d()qkXw_Y+|+eEXQmF^SD$Cpg}(FsDmviX6^y?1rcuS^$(-0T?47UX3Hn+%VBmY zTb|(lC7f3+Ee$ac1%aLM4jj{K+E5og_P+S}e!zr6xoY z>zp}Fn4=#3!vbXIlH_lR4Tr&pLXHd~)2i52*VemZoNbV$t|1uiMJ>iP%gW!ZkIAet z-kmBM84Gd5W`2Ep%0n}ME6T!a zxM(ZLP^z=P7h&kWJL$e5DZ=mYNp*k^Nww6Ty7BVO;%cgnojW&nmXDgWB7-hpu`#-1K%o$k^!hdA$%5nU0d(>%ae7L7CSJ9<^yvs(h23 zj!g_vJtoo)-*W2kg<#*33o0RfR(L^YUYRQB?ZZE2xp5ZSV)rJej1Qjy-!H|!J!i`a zXHk$v-qCt}U1Cm1{K1Ayd$3l^m$DLK>iX9{0-nw8^j4-w;_WX5l6bJDxIG!1-=oAj zAt78ni0>z@Whrd(;AE)0k@E2*UGnd0=D(#LjR5@@Ba6N4Z%gj4}-G0dQ9kK#i zZ!byYpzH;_s1;iS#Zb#U-yi%ZEChb4cq-*io5Ce7?uzLWxpW z-tZ3m4w}3SoA`EBv;p43c)^fvZr*_$-Z@jT=;~t^_OI1s@kq4qiws%+lYMEX^Md&E z%fWmbHu%FR~;))ci}zHg15cDxQ8 z(2KlI(bzzO`nA)y{Rw(EP{VCA3f_0Xhr5?R&Uzt?TwM02T_^fH+vOO3ai6V@ZE^b? z2tN#AvZCC*3VB=lPy6!BtBnmH_j^)uX=e4y3yKF_I#+J}>^wq}c=45S%K<)Yhcp{; z1PQu_I0f56c{~w(9-bN#);Dje^QWHy=faSbT++RljKy}+Q{JBYs4|%E(3Y1II?|t1 zY4ctsOWs9F_#w3^?2GQMrTne2d9 z_c$<<85rEXdhkbhM$3UzdGrvceO+AT+*NS{dq(eBRWM8vv71I011%T7X+bi4wb2a(Z=xa(=5f=FJO+kZyG=WTfg$F< zS2z&^EA!ND#3;MIDWGoH^eCh>C(Q2n`?a5JD5|ox+jOw24iAsK0eb?y`z)hiQ27Pr6t^)yoO(# z09z9SgUc^y0)%Y3yXSDDJ2e=Kq0>`i#L4dCVE=USK=)(@vL3d;5WhIOwPz%kwq^vh z27M$rZ77K!(H(Stw<<7(7^G6*E>Y|Y_Z%9y3!zpU?fhE~%nAkKq&41g=GvXVqp?s4 zDKSLsm!RCpe=p=-<36~x>|w>-S)zQD{vEtB|DZLctExhC;qJ=skukvzVFhi#y~s^L zN2LJoSWKL>6v5tjdT=hQ-{R9~H*zNdJj$~Ito~L+f4g@{p^S!b3sZ0rf z=4WtaT3kCcSMXbH1l=s-jYNImqWjDL>3EMeadWpD{{g`7dw#oY2c;PnpTJ$h!1t9GXDxBB&oiD#7BXFpfs69I zJGagK$v==2Y+;0UX-+Cy4rgyi;M{@#fpCD^jF(hv%EE8RjzS(pQqJNX2haWMREJ7v zMpsvz$@AB>+S4Pt>cYpRdkwbBmUbwTGt%6KLXE$82rqc9$&PslG1BBE zzc^SVpxwoR1*(IA_6n3-Y;T1cZ7x;IT67~>@GbK;!h7O|=?5oaddm#hf^7JMyis4s@{6<_ni&@RMva|;fq^(_GtcSJ=j3{&otQdd zmdE9_XoJO}-wz(m4cq>i52KXBJ_Qr|8{RGDau z4kI7BRg0o}KG_qNI5HfaHL*8DUM6%gJ@`?IngM8`sXlO0{Eay$^4;;nErZ~`YC+xx zD;4X`g)3`9N*98Y)NZXuQy~@IJ@+A8q`-T0Uk2;U5osTH!wa5izHvvuSeIO&yfn1! zG~>yo-N^`;ua)h0$j8$DHn6j7!J5*cE@9++R9AE<-yeQyc`52=5--}bG$irtcs~+k z@M>v-xIMQCN{HjnNr#J`TshyBl6J(Rrz;B_C(!n|m#7WC@)l)Qr&64`f;Zn)>2kE9 zROZq;SuT7g0W|_2$xSCyo&gG`8Q%TqOeIdLTN5Y4_R}XBnQ(V6_B?$OeT9O+vN?#3 zJphOTwy4NFnkr%+ALVuIT{x?l+<9ps8j>#Y| z>dFsE_1&PiW|nQB-KUlye@)Ni9gfR>uk{gB_8pTQB7CFZC!m?pb%Cm7RJ#A0U%#UA zqk4!;Al7jR?JDIpmfie1ion20o(*U2xuEHZz5;!g>Azo;((#B(2*Fwr-qIB?1Kww+ zd?Om=wh)M(snAX$_fh{Hu~4ZT;=mcnm#%`oLR=TuyMsNp# zL;Dt;hx#O7U!^}=ZdFOYG)*QLQo9D*Y|H=sG=#Z@H~sU#$?^ zEXjhcQo*xjn93xe|P+-`(L`$Q{z&QMBR!gw!qH4;qQdk zcmqhkSDnxIu(!upwOj@qlQQP>`tU5LxP{F0{b#|K);#3t zd(T&>xG-UBHYfYs-0S5RL27@lm-ZmKv0}Z^0e_`%V`p!HLI^t+3yR)7z_&E+Vg7?S z$QMZ4p*lgRvzhbhf@UD{j;DOe+td^N@ z1vM~@R)kN|!zCK-bZ@cmt5N!E=rN7Iuj}<+oxg+4^s0kT#(cOL&gUdvQD)l_M4XL@ z;PYL+>zT>Z^$S(Bdx(=I@rPlRw)s8eaXcp$ z&MMgOs)4B4^8A10@#jf}?OALTTl=8$@f4*(3k0K;X><=?_pr~Kj5!&mHs@S zXk{RWyIL954nWToRFWz1W2B$gUum<^VykU6R+NxP+K7-hj|nf@hJG%D&EbytyRn4W zsrS{|QWjR+yVmq$nT~GY@dG#I{|NS-M;Gy4S}s+!1wy4o{byjS;|8ku|L#{%1^r!6 z1zOer=YRdb{my@V^gr>PT`Tgqr#!{N=T!aS%?*s~NLpWDu%@WcZF&5TUYSYW^XetP zHV-p9JXb8I76f<6TW^*&4RTlG9b`c5Xa?+KWA8P&y&raODwK0q))%~)x64%g#7H`nE?y)Ku2x*!+RV4eXs1Z>rluf=lVTfye)r3n-dcU)%S$ zHk#s2PPk%SF-N&4+=h8`?By4-RI17y@5biFTsEx~kD1^H`NXT!oS^2PZkm zcBb-OD;DTXzrQtJz%TjWvZ*YBE?dW3ZpX>&1eia1QKDvE1 z^otcmwfZ8BZs#)K*`5Lh*oZ!!lglsmbtV+dDBirTzIOc2f-Tar{c$ck^ZI!E&7*&f zM^$`|p?<@!)D9_2-mlBCLz+!$6<3$fcS^_aHN;j~(anReSoW#jnd<}jd8Ap%{bv(K zvoWc}RplPZ5BgXMA#vTnns;<_ct>>%z6E<0n8}y|;(A5j!b0tAiAWCjm=F5c!~2Vw zeuH~Do^5S?;Fo3a#yY>J1V1o+%kV%WNbPV6hy6$34@md&)I^H;O%VrGY7K~Rpz8~@ z{=L|YOx|0&eMkB~a=71R&m0%U_6gGGR?J1W$M8I(>Fm+yQ+tvwn!eSz-EMpQKtEG1 z_Z1a%xIKRI_>&3kIlQ+icY7au8azuluNJ}8iv%aoO+QDRcMi=~wx@J5n21tN?(9(kGzn>#l%a5yWdMISqY9bR5RBJKFE;OwWvER?oO)?+#%@q(+ zDc&B?C&h$L4u)cuPvSni(1pcNcTM&RG;DYXHHsK|8KVyDqOUQJ-SXTAzDv-n2Np;OGsan_*?l}+)?;mZpsQAV> z6~7HUPPQWC&VHLGrn)wCSbxVHd{HTacA;!keJ%8s3Xd_L*TT-$OAhL68povaI9%ga zFQui&8IAn26_Cyg|cv<%YtiGffIH zc(yBM2l1AwChtOo&E2~d(c#jvrx1Ds2K9k&>ZSJWu+jaO)UZ(*)@eQuW=?RO0R_IE zFJsoQsR+-UCY{pJ7qu3OPJ|y;#MvA_z7wcchN=@U3KhfZ`;q?N#qyQV+iIxtG+qmz z%guEfJoV^&L5yC>1spmp7Zk8Bvo1qyAHYnMA;)Ex$y)j&X5z= zifb8Av%Z8M($^PlYlk4ZdKR5Peyyt8Buw`N=El9P=t<)E%AHFpH`xtdp~QS^?`0%}5k%jj&FO1U^rpX) zSi678Y#l^?31V@Qzp-!JQHAXhpi9;gPVIOFSDc=M!Wbp@h>!1xl>kq^M!~yu4($5~ z-#&AMcv#U9kM&cY+s|YvqWN59v`baq02 z-BFQpy(h(mR^g#I@LEHWMW;Kh@z=}c#gCYN_G|iDQsvI>i?Ew9W=NL zSBTDt|CN8D=XV@^de9xpH~#{MgsRTBLXL%Rre=csKOPoy)GfMb-@2fX?tY?MaT|lr zYeC%$Kky|G7sY*>+q+fCSBUNtU>4927JEv^j0oQG0+x6S*k3@yfg{-%($$wknD|Rny^;*2?f|u4r2@a;Ps(c@GpD0VO_H_uHPG##O2raZW$U=E&Eip`k3_cS&~6{>`&gYlFN=4y z4}KWhyNyV`u)X^8yEWa^yqeGY&Ky3^$DRs=iN@w3skwb`P=5HT1wP5) z>Mw;CCNe}T%3K(`-}aU{V6?HHh$!z#dC+NqABtceSji{t`#FXE{E#aruAlefyM=bk z9FRA#jtZ?jznZMla64tkQ67hrOVPTi@|WRfa7;H@Zn}qj0lT_-b@J_{kHvv|;V&b# z!^nk=&z8{I&%8L5o0K(O(UqD9!{XS(#lwelX|K@gs##83MW41FyT`APXW99q&jIjl zwo6Zi+EC77y%UJ3F;o-DR;j!1Z`t4P6~NwYj%|dP5)G_vu;!6F^Vg|OiB$mM8G9g7 zm%Ms3I=+bZ;Raa|Z%WmEWKFU2rs!UF8w9p>NJS44_FjZ-x`%eA)d*bH%E$crW;9?7 z?u^PlDPF zd?E^dr*y+@u9p3G;y*0F!+9K*HP(9vK}5U{ArI;nhrxf$jBhFj{SIa1q9HX8k)_l? zHtb>Io4MmZO=QHI-XbS#C=X4HKr$a!4>+c-5BRKlKli}+oMPBGHnEak5tF%+P$QLd zfLNQ|VZ;UEEMp&s#(Oz9P@MLyk~)HhyDDct3m?B}=RQz!*o~*6y!V@R|J6UsMgzh% zxsNU6Z{j?2<3y=1t9~n4f2w~=O#LGtAve+puJIGamI^^XU$X1})_rL1!Qh>4tJ2{E z1clSmnWN&?1r)p2Rm8&`ANy`6?8ciGu2+pRXEq2ATZ_Nfe|CP*sI>6G{LNQ|8T+q7 zapQ?<8LpBeX`K}w`R`P=Q?K_Sl{2BGJB70JoT?gHiJsch>XuI{6DobeRxp>h=91bv zLqF6HTI%Knl$S6>{%W_$`Zd)|~E z*Sp-?#s23?gM|0%+c$T1Iz?DnM!JULyAd6cr}Y_clU8dgCQiTpxy8^6G`Jij{VA#a z)YDIzG16GuvPVM$Hntmx_#9Lcy3b@R`rc~LjT-n?&xic?3V!!bofzEDI8(mIf%4~T z4MyPj;(=0V1#qyW*tSAO3rjcT@mfnR$HHSUlA=qxx}p~A7&m-)gl4t%upfu3dFW5S z!;ds%P*T;O?q3CvF{kMNU=hE1fZ?;>yNb=tAu;ML; z1_h0;Hil}(Xk#-f9x=DrS1Dktyqm(*ejeSUt!#b`=Qbx26&s&X)N>oL#Vv|Q1{Rgq zcYJZMr@XyEzK%~~aZ2k$-j1*mqv4tls{;6;x#2O(X>dNRmpD3aO);2xWj^d@v(V5R z71X=?^8q6vY}Ds^ms)}uvCe5N=!7M{vErG>j971%#LDqbF|2Iq3rzF5s{FV>uF+ru zWs*kt`sEG)jYN8l-RXAkkFX<**u^hDh50L|NM&MoGB4SZSk?4iWI6rL4*GJ)RkS|u zBk|IZ*(2jDPlJRjmnF~T5$n=^<>$wV6^r6c`;df&@7F!E2a%cM?%P7Bl2~)I)XO!Z z!_x~n?Z^7Ru{ZPSU2r)1;*z*^p~3ihtKU4CDZyr2IOwvDeEyx61M*5#Wa$|jXH^$o zT)3|y+pDMYho)L{e&r|e`2z{lR=fdTpo2dcequ%WaiX>WzWv!rNs_uKg{{)%yriZa z2lpXfR#rr7LVDX>qqRGF?_2HWY>1cC<=E6h2Y4e*?=uK@5=|r@T4IS;q3nKSYIgC( z{J9f$?I)60^I~C4H-eo~uc)SEQ`@iI4b~hNS3cvFCP)I=lw` zH^#F!-@oBBeyC_&%D&Xx>Uwt`{&P-Mm3gFd==g7c$NQ?c1XyJ*`QJQSqBXpl?7583 zrFr9roY5|BKP?hd{A4T)9%wr0vv5yE)|8sXwiPSao!c^isTXfaS|BS^K?U_WwGK|^{qaLgpi>2g@e{q6r` z%p(otDv#*axvp7_`n3|t)pH$o5fQBt3&%SJu!mPP!e00qmQdb@4`0>4yY&9ch4y4l zo0lr%%S`zsi3hWp(-q<)NS0ZQRljsW%CHMR`)G_z2P6>NlXSFpH0faP&Ym3W##aEv z(c0rzG=#{%rvV0>N~rpxS8Oh=po03f&%vJ1c_?qvim;&ERx2faFG;vJT$lNQ@@c=KL6E}T%Zk#NOUp5PR!gk=G!0fU*yhv| z{j=d)7TBmLs~>N|HLFk&KH|;3w zzW`<`2`+DDLBPhql^eGaYVrwwNhK3hCQg>7D2q8}z!h(aU@uHRRREXz{y)Th^1O_@q8U&K>_Y-Zto!?HCb9D+oIEX)siT>p+U);?I z0rCXfWzGfQgtAKw{lUc%h9-ZR8UspB$lKG0cmrFRq@zw}Ap7KN2=AK?8>?S4eF;fY zKT&{cB@=*-z~`#anni&No$KZ0q$`hyof$U#qR(&IA_J9m;Gy#q0uo7Is&N$s(Ow7=rCEj)<2gpUa0FY zpz1#^;)K_hNZ8+qx2gO6R5O=LXiJ>AYUz_qby~5cvJ?@7-))Nz?qKl28G1bHOYH<} zSdO1x2lrrJKv!2#jWx86lP-c`i!HqE<8IBBl(u#x~3UxN(n-t(bX8n5ilc(jjh~kC-m6j! zcmmfS*gcOStgYr!!;9ah&Y>>;-Z!klZW7%eb5@fUkaWTg1&%zn@GkeuQjG6{Qth3C z$p?3(;OAi6DN!7y%!@rl#^14??}E4D?9jbGlyw2(Tj_G!S@daeuo{4xxCVK=WXBF= z3SlQfV^>Xy;?|o-^^}#ZvH-K-IP?Ovr+g!>w}MG;2gPBRFQxw^#|DwcFX9sNEF+`P z305HyynY)hKLZaw5*5C)cm>z2KhfNfop+)0v!k=Me zH$~D`Sc#xn#&F-HbZr1FblDGHlWokbkIjWAkpKpd%l)Ij3WR_h= zdDhH%u$DL-hmkG1ir6y9KDXHyhhmw@roMt(Q<`cC5qCX+!=S51H+OXR*u%kg?I48z zMx#e_JR@3%kIqq$kFLa6GxkvY$x6E1G?bE>b~6^%u3UhzmA!!Jo*YQq~JD~qP2avPAFSN=~IV$Oa+Z?Dl$K3 zzYnm?m&1B#zEn`$?yBq;{0dBxKv2(>e+Sz*;jdZSTO`RD8EMl{D9-zX5U*Qwh8@Wm zY^xR-^%HiLab`a~nw;)Fv==+jX5@mn==qLR(z0pHgiPt{z$XQ(^Sof@D%+-xh0cCBNL!CJ7%^N$xoZG0qN>*3YJ6bqq zUoE3gA5xCoYDfha%7ZkQQ6pY8gB*g`w1fI3wfAst52%IDKk=#7Cieyd5H}-*7hkOu z_WS|gnz9DS83@4J-U^VaAhenNV>3FFqMK#Yg!~0~?%cDJREr?$`cVN)HPmLrg;Hqr zPv#vcu)J|Z;?V(>`tMJ(e`Gy zt;T}bN6v)K!oV6b@Q};0C6pc6)HiUeULsw`p;$=+SZ7BU8ZGf>uqFYlvEhtoWj}bp zrDvX$;_Mt0#`WNkQh27=A$<&bZ(F^zsQ)I!1@0@j&ob)Rd;5(8tZY)mzCJ@#7&=@K!de70(n-PZ$(jq2E0MiH@?Lz7O2mQW*< zNr~Nmbf5(vHo7~LnS7XWKY?h_AZ1fo`i{91KDGKP;*k&;>d{tT(mo7_gx1fMQ&TsNG?H^R#4Fzs*D|*114x(qE(L^{sx+$PSDwD zv$o_9yqCGz?+(n;t7VqMNPy%&*WlVV_$VYHLKdv6X(zNOjvX5rrS0e0>>!lBT|K-}jVq&5W%%|dzM47zRufIg?y z0IDglH}(MmOy$gix z^MO!S_lMXII&1yW`eg{Uk$Gj4*(6x`zLHiyH#KL z_SVcMa+)j^JCiEv`v)hh0A-3N#6^In!=I`3FC>6e`HLnTqrn6~(C}l^%^i<-UQ!ty zFhl{SUPbhcw50I?EJ>~%)a4ar>PH^D&xt>{+R!5$2+}$pWi(*e@0_-wys!Wf@lIQs zE*7u!S@T`BTTwCGh-tG_9y=F) zQIdrkp$DK4#IJLo%e{*|iJj-re~%pTyyZBl?@PQNz{L8H{nfYJN#L3JS1SLOtcTBK zelmya>YwH$_0=0)1VD7I5$U_YD95IjqqpRt*suH5%c~`1iO)Bg0g5C5N=<<}ixy%{(IBDYNVCWE}T+B8xSO7x$pKlpL_Scn#OU)g~KWz@c>|6fy zfj*4_bTG*>`Mvm-Q^bAX9vo`HF)2{iJH6D3j7#a?klf!owhus^>KiaoBj95!;F3AP z{QnL7elJ0M2r^hmF}{U?Vhc;@7sG&$f1JY|NZ$o!`NTY15MZOPBz?5AiZaUmZf*9Y z{%Se`U-{(<*$>*eiPnsHO__u&$@((}vRzgq7%H?3%;bfdytujw5$5YRpbHt^_CU@_ zts|T+LY=DJZE_R}wfj|YHCJ?10KW^yr71qTA8d2bfYWmkkQ=Xzc>?d-@l$UiiTZ2I z3Pc|ZV1UWG!QVP-!XGBJ;Y!e*f7-^pBmbHcx`h%4WjYrw>5}}~Yh`r8fO|-J&u)GC z2$UYVf;@%%z%iX8&o^|O3cz;T1`e$tzu0FueWz~$ol^6E+OK%D07SR}U5y}$(SxqC zx!}QpvCgpYd&CI7Z+cf!EZ|QxUGauOOlC{Dcji$`*~2beM*Se9o=cD81isRgz}sAS z1v($2z@9%*ypqu4j)3O=ZK%*R_!Trf{|FBhV7nSEZ17*i)do+++P>=+p!#3Yi_|>| ziYMY}|DPYzMS}@M)oEU!W(`Qv7KLuteYZb>SDK-}zjaW!@)J5kIdD^7wF#~}YTpiT ze`cbhQBd{y-yXR$66Vox0a^)lo&m+it~(6*p;4)=|LHIXVqjM2bKB?-E{zDda+;2S z#58&+ce)b|o=Uj=$5zKU@I-+kr{`4pPF?$NBW~BA%<$4`{mIPuewmMpguesp7YH&X zPUpC{u^B9iO{>V&=!#i@a=LV)kvQT13{T)Xl)rx_zoT5Eog;lN)^DTqq^g(F%*hs& z`7Mo~{5%yWmWYIDyGbO16bp6gc!ydYh^}l?1vvOX0=p-)eVMBCSvff7Y;8Ir&osdH z$=~s%icK@8t&v@239;O~UU?$4d^(JnO#Hs`FssV^i}L>t5+5im{`yC&xYF)N&zci1X`P0+i8ee{oE>@}j7N)UMLT(mR8 z&z>QI0lNi9cwyqhQD2D6gBigM-sXIy+d0|$BEKlRkai8!otfP(kCINJIWOpH56HA{ z>2sp_nnfjNEHV0gM3u8!@3YDTaCH3TtelU~S}UnGxw(B&gZ7_Ci>T4LhG+*fq8|{1 z!z4xhtP9L|=%+BrRC%rnv`chMW9lieXGpY4K-8FzdvbNJlFK(-%j3~V(;qE2M&x5l z13$c;)+SZGaiHx4>#H`PJv(m>z8n#GL%C}T|Ai2gY!H--q6hj6SiXP1ah_zdD);j+ z4G^A`4?dc@+7wA9el2k79#@e!iU8`!+8FQ!6mx|*&${BBdP-5&x)u>zQc9oU1b!P* zQ7mWm<6QW!t%y7531HwtTwvh<7JUOCmZwc2rU^(j2mXyd(4{2k7rEMO43uGA*yVLpX;QlQb@y`wLeA(#nbrfbXb0lrn1OyQ`RbJ&aye z{}&3n8hy3f{xXGp69h$`?cZv@r#}HSdhY?@04Mj+HgUdVG5h4rTO=M_ou+@qf%*~a zmpP?9`xJ^b8(l<&XIPvD%i>(P?W`V9-3^#6pseozUFkg7DFEK-FZCx8{q?*7#D$Z< ze-1uSX#3c-{!zj)^>(FT-0CcJkCs7pQ0~QnaRH*Q>;sn5w_yRLJ)z?0P4oi(h5-6_ zrli&UPJzp=X2TICm2`NNcRV8#)&p|ADfH%AVu|#O!r8pgnR3TG8m`njY(b9})8!IW z7-R@aKRwWD7~1+RbbFUAuv~jc715^;(yU3F*h}>s+J?68UUQ&)5>KmhY)qN?+2f$F z4J6|pF{8d6n0vjUs^9K-dgxwP!s*BEPp5{Zg|v?G3P*+mQy(_OlKB4-a>FlY-Irjh z$lT9cIrqJ+LxKZ*M{5ke4lcZb{5&QSs`@&{7t0&c9A9@)Qg!Yo1{JCc_RhPrK@lXf z)5&Z6V}8s+bfERK1OYPqZ6+tOeCu`p)CWGKJ9Lnl-iD!3y~g`O)zcfgnoL~i1|#{I zFEj=c7AGo%yt{j9KO=PHRMm50R|j!&*7NUag)igIDbDYYbfoPRvYwt5)w4m8cbQHb(DCgq zZKq>hFV4?ksVWo@mrN7}QA~Vv*V6sU4p`LJb_*8DDO1u}^G#29Uv2Q}WIOT`EW-8R z`k4Xuh2{#M0O5NIOE(l;KvVg>Sv>uxMUE?e&k=3j> zkR+g;$(~wY4bg)4#RCn%7j9PUPgUDmJFRV?235O~RHMt~7lB(01>=6#4CM1-1)H6E z)Eko<2N>bpRKq;I(gJho^_hGl_u}r%D($<|3D<*Lr$Y~b+Fq(eG#lbK5(nl)IREs2 zH<)_Pa@Y&v7$jdvup8Cr7H8{%ns%LY*0}}lsU}p9<{$)G*GF6fa-gg4K%=;{)4tY% zx@pm>IE=fsE3A_(n`PTfzrYn1cK-uM_1q7|W)0`H8Ac_%E@tjIytuU7o;A^+XkaJk z*7Nx0{Ca2`R0~;?=hT0|mF%kEw^%Q!<&ToE1uv2ZtjbA*{! zeHg#>cOF|oNHZF)!`P}MwZ)y--m*RH^?HfKletF_Y8e9yS$@KvNzncq(>>jCrzRbG zj}7yEw%vJON7cpkpT$bD-ARweP2*+SB48TTE#BLZMR$*!F%-!0T_j=+Y7bPMw4_In z9;G-hRa6AHCmY3qP+~zDnaCF=Q@hi@HhY9!%lRqPGVzFcqh4Q~1ej2^&M?b(BdOT_ zs3CjD_oRTrk5QAInnnl37B;Q5^31JjO-2>1AXf(s?`NMZS{Z%ZlL_VB z{*wlMG09Z|I0*3;i_bX@8jm&SEgZPj;lcH|8}V&`>=8Yn)s21v#JG)*XGe z(6$m{&V_8pEH)uCaFAh1Lb+zzsWf!Vm38bMw^6SCNaf?gvv_S){o)4D{knJ4X&Z@l zd%jl73IOsOUm&u5;KZI%<&O7Lb4UhP8k2+*2a35Brh-M@l^D{h`2L;!VPInSOP)^E zx01!9$@8}IZ}sV4`1D-|B*X3zU7nZR{EFpw8PNRCeq#BeuNeU_%B){HwP_{?>9$iN zGu_aq@N&O4O#N%p@l3Orb+zmn=k81OeP!sXP3#BoY4+9K^NJ|(5(loh+0h*76UV^& zT!Zee;99QMN6BhS)<=pwQ73+dY1a|==38P znvKH1i)|$0ojm^F+_!%j>zsar=Zy7T3SzI8)M{rK4^Mf2OIwPS>$IBaxgCz%Ffn+s z+FqI9w8HeS)78)%tMw1)2t}{j(<+PATTVYJa)#CMABrLopKuRjb*J%QC8 zSOjQ#3X>D}8}*Tl|Lyglk{qpUQhA;k8&fQk^ZvbCZAUq!WoUe4m8n;lfSY~et-Qz8 zb6;u#%6L`t{f(58SRs!}h^Gi-W0gCU;{IFw*xmGJrSj6S zyt00xqth+uY7}vyBYt3*uBpNqb8)gxeeidCoI^F1H9QLL*Glvi!YNlOuJ^T{pxr6~ z6mpHesIYrw?C07Hv5GUG+HXQMFLC&7Kb0ys)D#X-4ti8$&>tdBV~&h>NCaP$Pj^x% z$ap*Bjq1-`*>%`BpA9x++8CGh>|J3+Y7U{`u*v0YdC}2h(pTk-F+h|LsQu){EmE~S zhWB-Kl!`t#l0BS|S${AH@B0d~u?p z^x3q#l{IhXsYt)8zvKaqvKa;)~Va6zewJMUt701N!7BDDIHpP zg^PTF4BapAVa+zJ9857CqDdT;{9*F-6qWeUkKprs{U&#^+Jm>72tpFt7hgXffaX5l zPB{%cOF-=sE`U@EUvlA3uF6%HD(lYs;!N8I6=2UCR8|96V=!jc$Y({a?fE}d55f`b z|HB0U&`eYhgOSXh5zh+Bw86~?sV;t&y~Yw6D>(cp zv)+Ie!f$6deoX7fBN=O`dtO%%*?-#^KXN&PoE`YYBa^_AaH-+#&%J#ZO~IVC>%vvz z4_?%xZw4Xq(f|}YMlW;GFL@Hllxx)ahG`__7GImzlTxuLKwCBE24zhW>%7qy?T7x* zD00zmGhUKnn>=}U+E!Z44?g-cD+!ktl5c!y+Yf_5k0Zd+>3O|^LL$MHe>h5}B!iY| zuS>m9haN}8Ps_GVJGdw?E{s`7lrCp-CgR%`jFKSagUVeZracRQe;n?GT++OQsPV){KJ)`qJsCozl=12>lOj}yJYSNUgY;+avT3vfUz+)B7Z}Zxkv7B zoC(nfIL)k#;+-(BupMQh2kjugf^Z0lRVKguA&c3N5-0hC-a~H-@sbj~RMXb}c2LW$ z=o>B5K>+|TSUndGz3WqT*FW))LECKTafq(=x6Lwn+*}B;UJJ++;~VWR_7C9If(xHN z^(9o8mOG1q4|}MdwHsJkQ#~V3aSVSkAhw>WGwkUhZS4pHHg!RNh8`TrS|sO&F1dRX zIdI%XKWIe---$KI5;bS%u-dye)eTzt5_6V&6xH!!t0N8bL#s+6s{l?6b=V|jaNfn;3Es~8K>=+A>E{0GhZttoKmInYAo{@7grH{a+0K1Y zzJ#yk#t}nI&GztLB0z-$2@SG*(Z{taNW6#XWfYME6NJ>~y zdCtsiw&Bw%Y+SQQOi!DXx0jp32>Dz|yDPe3gfCQZoDF(<7I;?KjGc3Z_wkX{zNK`8 zvH$C!2q9%Of8^|kwtlPRA^4Cy<)#o-_}J?^nvjKw<)tBbLuFIr2zi2|%#W8Y-{;b- z*W6?Fw`A4M@gwAUT!88hu7ckvXACs>5cgpvP~T)8}1x{xB%W^>EE~-0dX;NHiEK$s|ye?TIPLOw4XvkEUCXv%;6$E#CBn5jQJNx)D)_$L^RdPhX5GpsvLIVt*lk z9o*cIC9^Ff4cB^p7mEt1U6zYyv;&zSSb~g{TIW%4M~FX|HBmoyUCgs07yy5yfc?y+ zuC>;`iDUz6=93_PYfb+bJM?%@<(sMYobRE8h#ZM3aQ^%-n3HoE2}TuijU7CFM14K18S#4Ia5S6k zcJ-V9+<`WUlIWKd#ARf`nPS-UJt-du%_qjAn?M?@nB7Q{RIP`O9~IwG}sdL4H}-5sm?B_wUc2-67wT!W$JnDf#6p z#-q7fJLWUSt5y7K=cIL7W8zs$cZ0hSO3!Hee*B1tBK(-P$IBL3a5kR-y3*s1jL zNoa+obyD#!*gESDn{`sQH-3~V=^0aMwP8WGH=c-TvfjD&RZONyceO+5McQ9BD;5iW z*Lw6ImlV=e~97^_~l_-1%Km+}T>|qoGpT3;l8Vr`Kz^HyCk~$dJ|Vfj0AJ)?27= z$aNI2+uI0aap^TUcOZl%kDWxSWgwk*z9d7Es`HI!YrNvTJrj2B^N}wHo~m#j#Q|WL zFNJhkI@6;8hfr+JiiLEI~` zH|biI8tTC+`O8{~@ekyJB3YIHQRm_!sMLVnFto#!PpOcY&qHMxcE)!$bfYMyGP6d8 zpfj>?4%ONH?BT3dPd$b_O~!R+e0c$%R)b=8{5N&3sAv+fhLt>Dg)@h8jmtwa0?fG1 z)=Ho}u~m7%MzJd4pfEbHwrTzgm~IpG@GoE28==IyVTCBB8uG)Wa-k~&1MdwCk*W_* z#B(oJpcAduQHWr0-VOP+SiOXSAMdhnfV;)c;QW^HURAF6e5 z_ci7sWju#-Q&*=ssZ4~uypnYT z#&$>pyKQI6vn}cma_|{fxy-58wH^Eu_0G(me}Wd5Rw_9jY%$0%_LX=1eWEfz zK0+Yzgh5aX)+^q{C_;AP%weeVD-S{`6KB0;Gc=ht9wY7VWm&$8vc)^_I>J;P0Ooif z#OaDYZjb?PZQOjCZ8yYjeXhc+n(0VQMFq9EVOa4i*R81T4JDi2w3}uHku`C zfZ-xsP>RI_zkJ!LVKTL#g4@}!#`y^oj<$q7DdrKx#-+j?R!6Kt^$(;` zGnCP;wkSTr&3M|QRSTX?t08C`@n|~C0}t9588oW3^viu74u6oYx`c8)db9T2x|G>{ z&1&r%G*{$QZZO10~&o$M@_6V81M)n1~zPm*n40b#Jljn&fqQ;?WMVi~HnYcykgiQ_0=!DyP&ieU71x*h4Qe8j0;SKkMmf6z8 z*!AGzHB`xldI@BP!Is6wy}*-UB-rv)4j@TZJUDM>y?9qsNbU%0GfcWC5=2vHpi-`H zN40>NUU%yT`O$siIb2WmbcgVZznEkXyfFF*{*t}wc7DjAIO6L)WqGYomTkG-K|b~4 z^CV|hsUrhV7Ls%4M&V@SNUM&phLX;R6x7y3f=if>aZ-n}=7&W6*8$@m?3@PRSwdWD zcc4%#6w(Dh%M4ibFfx|GrP-R;pSSEXD{KPgJ3{q67vj&ufcfwv3sKww;@GQ}pU!jZ z0(B=xKC_<1LxoP_00x~;_JttpU^1fbbP33@IpDdLP@|Ffb0>TkZBue1h(+TS5^q{b zyHfJL5U6}J9?Afy%dsE8%wgC}O2M;?&BdQkECYlSH^rYqTJO^jdi0vZj`P0EPt*l3 zg@e8PRfg}~8Vb3)Fl?2)6$92ll6by=GF{-n>wYaqVtjy^G=0}@Q^Z^;Y8>7{@=wub zkg||EAabuY=dfoDZM(U6_Fj3X)2cSyHTV(?5X_yE61YB9oA&^vm)W~W;B>Q`(azr@>x^HIR6qg1c#ghjeyd(JqPSSRW&*?ke_-H_ zd-B0g>hAEI&At1BEPGCPxoC}eI%Lxsjh&YDTQiTgh4XbI_tyh0C7yq4v{cqreH&M~U`xD5qpF`7%O6FTj!4%U$fcImP=A z@Zm`OAA?ML$`aR5U?%0A$%jvmO#>}H1(+doT_pxyDqtjWo6*C*aWNoKnWrU{`R-X_ ze_ONG7cD0|KjsUSo+@ffB-C);P8@(-*BF!gQYr=Y|fTQ2LMlpVD4Ui!qDm9^T z3czYsXJIRve&}g9Uac)U7j{zJeln9`ESa0_1P^SL%bDf$9 zCp*UAWd%OySY64qG~0%sE8hcU{;BI45SrSlP51r+xGI04e8?FfN}+{wSC@bZwouku zMDc1}dg*4b73)8tifX4npVdmJD{E7U3&D$5tL9!&o{>}=Y+7y}Rx&ysnFxBkuK-Jz z(_R}(EN2~9R>QD=Z{05#df8}+;6{TjG3>#vY(laE+I4|F*HA65>eOFE!S*0+|{Nd&ACs#_*P71 zlGP=2opUg@Qj6@nOp};_Gwi_0{e1YQzG#_VwdcRfr`_v=Z`Xx`b-j_|p(*qqB(8)%F^g$|iS`}p%bu%8`lzehAH2O9fJ2n=ZqX6o_1V)_Y8^BUG`DD)FzixgXvQcXUx5tFdaXPV z`YJ*8KtbwU#UJ5`{s>+l9?ELlEmrav2c1i-b5`+w>E_)0j>}6 z$mg)>h2e(jyPad#1tCMuYq}*vXKHS#vJD>(aCy9k?A1-zJPB^iLy$i&AW5!xBi5Vs zz;R#zm7D>3EDIGf-n4^+ELy2_--p}~qUP;h5E?X%ehne*S8Cl?bptlstlU!-}ByXIC@bsUyz`I2@6c1?SeG5;lRVLo5Cx+~6AWq8>m z9L%y6P!s_sXB5+0L^-iRrWR0+Mm1COD2x-{V+0f|1qmro5C<4(W#7ByVyEvRxOL`H zyjv`lID=%hy9n;?hstruEf$JFrkJDZr%ckDE4|8SJ)}!g*|k2Q{MsL zpc^{lO_niSP%JwnX}`Y=*g;i*9)7sW$17V0SE{t-%{FZ=^_mFj>H@!g;Q$k`)z41{?spv)E{1Hpo>kK3RYlW#KarFVi%MYPCX zui=DLhabAMOF@#TM04Kf>Yh`8#<~wPdF9YTH7z8bt?*)#sR&t8tx#0@uxayfNc}uY zp8)FS5?fk_bFW!Xspta>Flm7~DMFz-`_)8onfdssoKbl*H(V((PNZ%Nn%mXmfS0SH z5%kX8@yxD1bU7fZ@l6;hiP`wbeFphvYkUuIq!V1tiu@lzh7{yN(2*t1jE|mG>>Yp> zKj!Gbm7X8Bn<0wxGU6z>R(sjQZrSRkzm4_QYb^|(HhTvbbF3l>Sj&QfS@==fSdbtTD+ATa9K}7`iUubTL&BrG z*E<0TY&ZTxCqDNFb`Ii<_n5$_lr(}uR{#Y;UIV~; za%$*S(VXF!STU)QJGj1-ny#-kwUy#_Uvi-Kr~~W8Jyo1*anqc{mS(J+MuYn4f)`Et zN+)P>-{`s;;Qa`yz+KKHb@YSfu5?iSsV-BxPoT%saEJXY^VYFgxB~?@m2Hn-6#w&!&w0Tq#WH)=`ZMV(Ra|Be1$qp((a_=Ue8%P$3n8k6<5w z2Cx#FVzhkrwR={&JK$_RGu~P{-fM2&sik-bKs&%UU19Q2j{>iLpX#*tdtuXD>YdOr zX&Eag%6ZhRGk)ki%N+Y?DH0s!^*tgCQVahd*VX z+nYdV9W6sFKt`z(Ggs9Id7IONplA9}0G0vb@J}^!V2F1m;A7LgAJJoLz-b=96+|5n!so22-K;(}PaMr%#%gOpFh7RZshBt95e1 zQC7X!xxB0TodAt(4B{*_-!%&A6hm;6Xh3XEe?Z}AmdS0cx@i*Nf?RU|RSJMDe$-Pi znzvhR>XSEbC%-UpgS=hnz%*5vF8k7DdLLuwK=A+kokJ$bk<`SaN-bc(;54#3V*=M^KokdoA`-JvXE}6klqeBQS?#vUGnjef8kl(O`cuG zb*O0!<1}U^@@|ZhL~540gr_47q#HMMzOH#XjMi4-(-sZO-hK>_{3G~_G#Ca$mr5)9 z;bNZp19r9p`I1#4>uaqNWo}$1Tc<3t@GNaH!89Kk=2FjfPgW7(sVAPJM_z38y%gL3 z8^e#0XfyC;xc8&k_tS8|Vi3PRAU_0E9g~~R7Vxn zfZVTSfjqn@xSiLqR>xh3c?d;y+vYbRbKp?pO$DD7t$LJZAl-;C!RWh&Qjpq^uAY4m zl%?pARD_vSenH8Mi2CD#s={$TS=-){fZ;>6gP>8~X`8wd-NEv&fsy!3c1g#KcMu2s zr~h_u-1i;Natw10y@j!AV>%ss^jZzMdV}0Sk+L*r0A zCX}u)OfS{${NVaQkq&hpIXb2Y!DTzkka&)u&enD&%yZYS4Cro|1uajkE zO}|clADXGC9n=CErdjA|K*O%t@1VvVA_y_%c58lZ+44+HBg_@0c@Q-IVK!9j?r4@f zjA!a1+eS+lF-w=-uMbcU?bq8u!yHz358&(ZRZJ`0H6}a$mQ_Eqi>s0HWn(x4?H%ib z>_+j;e*i?|6!sUg8B-?PJB1hT(Y%h=S+Xwgdmxh$5zqo!jPNxzb8VOb)wpY%3rXg! zdMl_|GM_zZ{sPqsj^)j>D*l`YZiPblpI5poG#Q6>ObCQbdionfI46eJWP~?H8nx0= z>?d|ad0g<=Ggh6u;rram?m;&l@eiQKhby=KLTUNAzdL{#XFa%v*%aV1Nr7sC)dUw& zW+E(ikOR^8jIEny)PjcK_I01PpkrM!D<94o20!*zfEJxLQOfLHD>v=)03!NZUJO{; zwnZBLKnDVs=@4%M=*G+z<8RuO^)bvUnmX3y@=IoBY_=1@QL*5JrOsq3!k>#haV69l*2^M~Ky@!fAjT-mx*=2*8ToN}22Hb(2! zW8YEZ;Z_rQL$C8UR&?CoN%2qgG>?fG^6NX|4Ae|Z$7jEQgL>M)_jG|Z@n5N!5!$f> zC-qE)UN2V`7Mxp3E*fq1l!b7!`y-|tiFbibi_WxzE-w$av!2`0-fnWRe{)Cc#&^#3 z%gfuY8bpWdEWRmv6FRIE>(2!j3X}7_5Q{$sIBl~ZQw2LqL_Ahi*^EJPGjD`M2VCnk z8U|8(a>#n;!%|K0^cxjlI4u?*ZS?Eh2C^LuH3?O@1(&_1C%=!MY@F^|N`zIuvumre z$Z!C@)!p9; zBp-hHkmvj2-;NYb`G;}>V8$;y@{sEn7qsmFKJtGbH2l8fp3DcD!NP^2Be^G$R!AXO zwfB|}{nk19`Nc1QE=_N~!M(zzt&&|tTyR z-PbLVKD7?j@1}FS0aSr$c{cRGW*SaxG}wvOIo11wU{ef!I_KgO12%0?A_P~bVa zxXM`hu197wM?s{jvqH@4JjZokCz1FptO3`vOD^$DM$E(|lR)@zs5so0Cgi@}&0)}! zTTv+%!+>+^@>0f>ABj}51Wocz%AUl4Hdt}{WqTQfv0aZ?EmMTRyLHWuvEAd{INN*< z^3!`QheL}?C)+I};qY^w^EJ+$m@-blh(%8-#7aG({lnx!6O*+FJ9B(=ae3v;2LYMi z0+$xX<+{T@`!*_FjIR#K%jv++eEiJBIBY5?JReO6O>y1Tb}+%#{t9r78NF1p4xw^{{dPg;Atq9{@!MHXr=qZQaj38{L`&``2r~$=ITnLa4CxWd>j~c zi6U|7kciiG(jp3AbJP89h5VQEe9k zdmbM=46k4BdmxfJFSy^ANY+-isoIFC63J%|tCDGYOhk07!_KU^qeP`> z*|y^LyhqkGR^lHUV`g$ayHFP|fbKC4Jdh#}8Ll&jT?$)r;XfJDRRw4lue|L{&?&eX zD4_++A6spQ%ousA--k8*nCjBG^`*BdVFU3XFNp25c3*>B%C3=h$}F3DxG<1BsqqQn zD_dXG>%yhcox|8)zkZ%ar^MQ#}FYrMQw2F67S{ z7bG*X!Z}9Yx4x{+&4UEgF5U&DHHMm2{R!UxY^=^BN~|j!mnJ{pqWu!q2M0XV-6nqP zy#s$y=vk|2i+9TmySHTbw(Z~0=q)(h!5fiUHs@UMDtSk{xE&+D5F5Bx-K;!Ao@sYP$2z=+bF5*1GIVf>pl+}It8}g2)TCRids%NGD9cUdQMc67 z5v3xTN++}OijLlvcTnNH1`}J`BfZ|raq;QIs|wI_od+$4L2W!|zJn9SfnR=ia7Kjs(fzdG)2LH)~n|A4H zEB5y)8tO08Beh|oIYn}DgWlIT;(P5*MrL)FimtlKOR)CH*9YP@1q2(%8$&CV74|q1 zL<+Eu`6e>6t^A%oORfk;@B^R{|- zQF(b8m&)p#JE!iNJcAKSNkh-ve6(#EMg-~A z*98u}tkJPMo4c$?`$%0CIcGiR$SNbddWlQS(!-T{cCo(tntA&O&u9_3DC7BL_KHp0 zWoapAU)hc2@uJ*xOvr<>rUr%bOl_^`*4e9z@e%uM?8A5C1`oG!j+PYm-Df7k37oF2 zbhA#~Ra=O=?ppv)jIu^@mVjDIE^D>>q2RN7U>5kKTkebpGn(qO+*NUX_Vu3}@~G8L zP7fMVLndip#+zvcmpthfpBnHIl;0`ZUoILtCX1A}pQ9$_}an3tD+h4cVv2 znbI_Weh#?#3$a8F^UXDL!C*~Ge{}5KM7EQ2PnPmny{L9*r+Cz=dVa7-pgA6GDPGd> zH6dzK_he8TCC%P>xgf4;ELTHh*rq2{@vR>sUO|3OfNtANqR=kQ|o6vj%8Y%USz{`o{fI0tPz zTN~yxTxRZm0F)lGw;WV6b@7wah*-h9_)uF~y5n@#WXQd{pz96|yUl#jtuM^$n)HgZ z1maC6-3Jn7dL2K@+F#y2pSNtFuJJdAA@lWLh4;-LIqz(Wml`N$eUIdtlmpl&J~1Fu zLFv$``L<16`y<`tGDfR*kq)kb6*e$(`;FM3Mi)xpU`AU$D&~9b7ROq_dq-0|yD?qh zxiR(ZQp$B*q;4XNqIRScYl6^b}socKptRw>jWqwYmK`<2G!J zznx3JGR^O*ElYD-_^2Wu<0WI)h4OKW6B{^vD0=2PTb72X@sU`{8$O5uaAUfeGh`e< z$0M2{pnh{`J8;T)^rFJaZ;ehn4FyRlE`sQtI#CKgJ;}TZhf_sLbrtoDHFj+MntlB4 z_wMB$nUR-sW9ZHC{^jYIb?vgw%(GseUXEET%QG(%R(3L;yB@9$ z<^{>Dt*~OHnZM{BMg{Fps!`p%M)X7U)%D12?b1{eSojm$Ba)(JjGOMnyI1QpGOxgT z0TweuTCLdnNy#w*h{ts0wk+0}Xnv5a;xO)~D#w7FnVvf`9u%B!Y9QW@stBXr5??q` zvy$1_%asp^*dVWZmXOmuRssTG4w}*`IEj?y=%m+>;N9+*#@G@96!0y*H<%sxPnD&acK}w&&*g zb$jm3edBcF%l#Ou*>UL--?tyRZw@S_U0$AE`Qpw!r&ROVKu5^CrmV5syg5P4*UnED zxcpt_>h;o<$FE77m8YCx+&23)mz}%yeJOp7sMKxiU+Q=-{dG<4so0uFdmctsy>D0- z`tEI0?aJrZmNR|N`lG_VZmsjPSw^4l_FA5--uH>C`SFyQJIl{)whjOES8=JmuifSa zKMouzGIRZP_jtj{e_7RM<{bSlJkt@B9z2^h&+aX_&cAQcr=J(UP5--S=ka&H-o(zm z_CoYmXaBrYd-6>7zj$^sH|FlAe{<*sx6VsfMrwZY zTHsEA_cd=mOQwZh%eJ`JEN}ZO{dUFPpD(9Q30=DQNy(eWN!P14nTLM)He37m)myV8 z*Kdxm_;?(6cwyb{HT5r!)t@xmbN{AHICp(Ku=3SE-&CJ<>rnip$x;8V+bbbeT0@Ze jN9{i_5gz!z`ajcCyUy!-ta?C4HZpj+`njxgN@xNAsaFq& literal 0 HcmV?d00001 diff --git a/docs/docs/assets/blackpill/blackpill-pins-labelled.png b/docs/docs/assets/interconnects/blackpill/pinout.png similarity index 100% rename from docs/docs/assets/blackpill/blackpill-pins-labelled.png rename to docs/docs/assets/interconnects/blackpill/pinout.png diff --git a/docs/docs/assets/interconnects/pro_micro/pinout.png b/docs/docs/assets/interconnects/pro_micro/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..7e548da515416d061b3ee1ee2908280d4a094204 GIT binary patch literal 492581 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

o%}v_VN+$)tSdSj}^R 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%0A;xo;n=gy`dVyk?opfT51O=sxp5_ow>_PxN6P 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 xt?Vun71*z#umCY=b< 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�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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/interconnects/seeed_xiao/pinout.png b/docs/docs/assets/interconnects/seeed_xiao/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..74a1005335a7a01a36fd611a318ad69afacab9d5 GIT binary patch literal 495415 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 z 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

j?PE6oU6*SKejimJVuO^b#Wm}W?T@Jz}FXo)3 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

MVl_QC@oa^&2;C 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

P0e|P#no3X|HJ=gvOV0h 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%0D@RdDvbN6 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%0A^x)-JUaHCoE_| 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 z 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

-A*d}}yJKXn#nj^?Qc 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

#7( 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�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YUTjGtM{ty!nKgRwq-ouim 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≶?EJ>wO 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�`3f&?T=_v(0=$}(rBxvQDM>X=kWyi_PcJx6eO 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 IZ}RVd03%F@hyVZp diff --git a/docs/docs/development/boards-shields-keymaps.md b/docs/docs/development/boards-shields-keymaps.md index 4444537e..4644ee79 100644 --- a/docs/docs/development/boards-shields-keymaps.md +++ b/docs/docs/development/boards-shields-keymaps.md @@ -34,7 +34,7 @@ in the `app/boards/${arch}/${board_name}` directory, e.g. `app/boards/arm/planck ## Pro Micro Compatible Keyboard -![Labelled Pro Micro pins](../assets/pro-micro/pro-micro-pins-labelled.jpg) +![Labelled Pro Micro pins](../assets/interconnects/pro_micro/pinout.png) For keyboards that require a (usually Pro Micro compatible) add-on board to operate, the ZMK integration pieces are places in the _shield_ definition for that keyboard, allowing users to diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 2e468fe0..62d71f03 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -6,6 +6,9 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import KeymapExampleFile from '../keymap-example-file.md'; +import InterconnectTabs from "@site/src/components/interconnect-tabs"; +import Metadata from "@site/src/data/hardware-metadata.json"; + ## Overview This guide will walk through the steps necessary to add ZMK support for a keyboard the uses a (Pro Micro compatible) addon MCU board to provide the microprocessor. @@ -115,33 +118,7 @@ endif ## Shield Overlays - - - - -### Pro Micro Shields - -![Labelled Pro Micro pins](../assets/pro-micro/pro-micro-pins-labelled.jpg) - -ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `0` in the devicetree files, use `&pro_micro 0`. - - - - - -### BlackPill Shields - -![Labelled BlackPill pins](../assets/blackpill/blackpill-pins-labelled.png) - -ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `17` in the devicetree files, use `&blackpill 17`. - - - + + + + + + {interconnect.node_labels && ( + <> + The following node labels are available: +

+ + )} + + ); +} + +function mapInterconnectValue(interconnect: Interconnect) { + return { label: `${interconnect.name} Shields`, value: interconnect.id }; +} + +function InterconnectTabs({ items }: InterconnectTabsProps) { + let grouped = Object.values(groupedMetadata(items).interconnects) + .map((i) => i?.interconnect as Interconnect) + .filter((i) => i?.design_guideline) + .sort((a, b) => a.id.localeCompare(b.id)); + + return ( + + {grouped.map(mapInterconnect)} + + ); +} + +export default InterconnectTabs; diff --git a/docs/src/data/interconnects/.gitignore b/docs/src/data/interconnects/.gitignore new file mode 100644 index 00000000..0a00d701 --- /dev/null +++ b/docs/src/data/interconnects/.gitignore @@ -0,0 +1 @@ +*/ \ No newline at end of file diff --git a/docs/src/hardware-metadata-collection-plugin/index.js b/docs/src/hardware-metadata-collection-plugin/index.js index 89f057a8..f118c0ba 100644 --- a/docs/src/hardware-metadata-collection-plugin/index.js +++ b/docs/src/hardware-metadata-collection-plugin/index.js @@ -14,6 +14,22 @@ function generateHardwareMetadataAggregate() { const aggregated = files.flatMap((f) => yaml.loadAll(fs.readFileSync(f, "utf8")) ); + + aggregated + .filter((agg) => agg.type === "interconnect") + .forEach((agg) => { + let baseDir = `src/data/interconnects/${agg.id}`; + if (!fs.existsSync(baseDir)) { + fs.mkdirSync(baseDir); + } + + if (agg.design_guideline) { + fs.writeFileSync( + `${baseDir}/design_guideline.md`, + agg.design_guideline + ); + } + }); fs.writeFileSync( "src/data/hardware-metadata.json", JSON.stringify(aggregated) diff --git a/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index 49755749..8ca382c5 100644 --- a/schema/hardware-metadata.schema.json +++ b/schema/hardware-metadata.schema.json @@ -85,6 +85,21 @@ } } }, + "interconnect_node_labels": { + "title": "InterconnectNodeLabels", + "type": "object", + "additionalProperties": false, + "required": [ + "gpio" + ], + "properties": { + "gpio": { "type": "string" }, + "i2c": { "type": "string" }, + "spi": { "type": "string" }, + "uart": { "type": "string" }, + "adc": { "type": "string" } + } + }, "interconnect": { "title": "Interconnect", "type": "object", @@ -93,6 +108,7 @@ "file_format", "id", "name", + "description", "url", "type" ], @@ -117,6 +133,12 @@ "description": { "type": "string" }, + "node_labels": { + "$ref": "#/$defs/interconnect_node_labels" + }, + "design_guideline": { + "type": "string" + }, "manufacturer": { "type": "string" }, From 5b9b507de3ef6e7a3bcb1ef61fe6d12ba46b8447 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 5 Jan 2023 03:18:27 +0000 Subject: [PATCH 006/134] fix(ci): Escape ` from JSON metadata files. --- .github/workflows/build.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 92df03c3..c266cf60 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ on: - ".github/workflows/build.yml" - "app/**" schedule: - - cron: '22 4 * * *' + - cron: "22 4 * * *" jobs: build: @@ -51,7 +51,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install @actions/artifact run: npm install @actions/artifact - name: Build and upload artifacts @@ -64,7 +64,7 @@ jobs: const artifactClient = artifact.create(); const execSync = require('child_process').execSync; - + const buildShieldArgs = JSON.parse(`${{ matrix.shieldArgs }}`); let error = false; @@ -118,7 +118,7 @@ jobs: const coreCoverage = `${{ needs.core-coverage.outputs.core-include }}` || "[]"; const boardChanges = `${{ needs.board-changes.outputs.boards-include }}` || "[]"; const nightly = `${{ needs.nightly.outputs.nightly-include }}` || "[]"; - + const combined = [ ...JSON.parse(coreCoverage), ...JSON.parse(boardChanges), @@ -148,14 +148,14 @@ jobs: runs-on: ubuntu-latest needs: get-changed-files outputs: - core-include: ${{ steps.core-list.outputs.result }} + core-include: ${{ steps.core-list.outputs.result }} steps: - name: Checkout uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - uses: actions/github-script@v4 @@ -166,7 +166,7 @@ jobs: const yaml = require('js-yaml'); const coreCoverage = yaml.load(fs.readFileSync('app/core-coverage.yml', 'utf8')); - + let include = coreCoverage.board.flatMap(board => coreCoverage.shield.map(shield => ({ board, shield })) ); @@ -184,7 +184,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - uses: actions/github-script@v4 @@ -269,7 +269,7 @@ jobs: with: script: | const metadata = JSON.parse(`${{ needs.get-grouped-hardware.outputs.organized-metadata }}`); - + let includeOnboard = metadata.onboard.flatMap(b => { if (b.siblings) { return b.siblings.map(board => ({ @@ -311,7 +311,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - name: Aggregate Metadata @@ -329,7 +329,7 @@ jobs: yaml.loadAll(fs.readFileSync(f, "utf8")) ); - return JSON.stringify(aggregated).replace(/\\/g,"\\\\"); + return JSON.stringify(aggregated).replace(/\\/g,"\\\\").replace(/`/g,"\\`"); result-encoding: string - name: Organize Metadata @@ -389,7 +389,7 @@ jobs: - uses: Ana06/get-changed-files@v2.0.0 id: changed-files with: - format: 'json' + format: "json" - uses: actions/github-script@v4 id: board-changes with: From b7b563a4c3c19ddba7b5b300a08c690f149e7d32 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 5 Jan 2023 16:45:00 +0000 Subject: [PATCH 007/134] fix(ci): Fix another spot where ` needs escaping. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c266cf60..6305b741 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -376,7 +376,7 @@ jobs: }, { onboard: [], interconnects: {} }); - return JSON.stringify(grouped).replace(/\\/g,"\\\\"); + return JSON.stringify(grouped).replace(/\\/g,"\\\\").replace(/`/g,"\\`"); result-encoding: string get-changed-files: if: ${{ github.event_name != 'schedule' }} From a82a0ec4969487a0f15cd417b215360465d746d5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 25 Nov 2022 00:20:53 -0500 Subject: [PATCH 008/134] feat(shields): Add splitkb.com Aurora Lily58. --- .../splitkb_aurora_lily58/Kconfig.defconfig | 55 +++++++++++++ .../splitkb_aurora_lily58/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 31 ++++++++ .../boards/nice_nano_v2.overlay | 31 ++++++++ .../splitkb_aurora_lily58.conf | 9 +++ .../splitkb_aurora_lily58.dtsi | 78 +++++++++++++++++++ .../splitkb_aurora_lily58.keymap | 70 +++++++++++++++++ .../splitkb_aurora_lily58.zmk.yml | 12 +++ .../splitkb_aurora_lily58_left.overlay | 43 ++++++++++ .../splitkb_aurora_lily58_right.overlay | 45 +++++++++++ 10 files changed, 382 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_lily58/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig new file mode 100644 index 00000000..bbaef0ff --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -0,0 +1,55 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_LILY58_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Lily58" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT + +if SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +config ZMK_DISPLAY + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield new file mode 100644 index 00000000..35f8b2d1 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_LILY58_LEFT + def_bool $(shields_list_contains,splitkb_aurora_lily58_left) + +config SHIELD_SPLITKB_AURORA_LILY58_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_lily58_right) diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay new file mode 100644 index 00000000..eb838b24 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..eb838b24 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf new file mode 100644 index 00000000..d456100a --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi new file mode 100644 index 00000000..08e2ac9e --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; +// | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | +// | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | +// | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | +// | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | +// | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) + >; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 5 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 18 GPIO_PULL_UP>; + b-gpios = <&pro_micro 19 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap new file mode 100644 index 00000000..376bcf26 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ------------------------------------------------------------------------------------------------------------ +// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | +// | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS +&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + lower_layer { +// ------------------------------------------------------------------------------------------------------------ +// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | +// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | +// | | | | | | | | | | | _ | + | { | } | "|" | +// | | | | | | | | | | + bindings = < +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 +&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE +&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + raise_layer { +// ------------------------------------------------------------------------------------------------------------ +// | | | | | | | | | | | | | | +// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | +// | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | +// | | | | | | | | | | + bindings = < +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans +&kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml new file mode 100644 index 00000000..47d49a4c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml @@ -0,0 +1,12 @@ +file_format: "1" +id: splitkb_aurora_lily58 +name: splitkb.com Aurora Lily58 +type: shield +url: https://splitkb.com/products/aurora-lily58-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys +siblings: + - splitkb_aurora_lily58_left + - splitkb_aurora_lily58_right diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay new file mode 100644 index 00000000..1fa61286 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_lily58.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&left_encoder { + status = "okay"; +}; + + diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay new file mode 100644 index 00000000..7f281db9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_lily58.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&right_encoder { + status = "okay"; +}; + +&default_transform { + col-offset = <6>; +}; From 82ff6d8e857bf581714f2a2e23af3aa6bf4cf4e2 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 8 Jan 2023 16:21:16 -0600 Subject: [PATCH 009/134] docs: update dev env setup guide Renamed the "Basic Setup" page to "Toolchain Setup" to make it clearer that this is for setting up a development environment for local builds. Linked to the relevant Zephyr setup documentation instead of duplicating that information in our guide. This also switches Windows and macOS setup to using the Zephyr SDK, which is much easier to install. Updated the command for installing Zephyr's Python dependencies to be OS specific, as Windows and macOS don't need the --user flag. Updated the IDE integration page with instructions for determining the compiler path that work with the latest version of the Zephyr SDK. --- docs/docs/assets/env-var/env_var.png | Bin 17317 -> 0 bytes docs/docs/assets/env-var/gnuarmemb.png | Bin 7914 -> 0 bytes docs/docs/assets/env-var/new_variable.png | Bin 60899 -> 0 bytes docs/docs/assets/env-var/start_menu.png | Bin 51108 -> 0 bytes docs/docs/assets/env-var/zephyr_toolchain.png | Bin 7282 -> 0 bytes docs/docs/development/ide-integration.md | 85 +-- docs/docs/development/setup.md | 530 +++++------------- 7 files changed, 168 insertions(+), 447 deletions(-) delete mode 100644 docs/docs/assets/env-var/env_var.png delete mode 100644 docs/docs/assets/env-var/gnuarmemb.png delete mode 100644 docs/docs/assets/env-var/new_variable.png delete mode 100644 docs/docs/assets/env-var/start_menu.png delete mode 100644 docs/docs/assets/env-var/zephyr_toolchain.png diff --git a/docs/docs/assets/env-var/env_var.png b/docs/docs/assets/env-var/env_var.png deleted file mode 100644 index 77ebbc5b82a55ad02d4de83a3bcc6e233c4fc3e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17317 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 diff --git a/docs/docs/assets/env-var/gnuarmemb.png b/docs/docs/assets/env-var/gnuarmemb.png deleted file mode 100644 index 42e38ec14bd510665141cc70f5e3d54d434e9ad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7914 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 cbot+4SZ;auyKYQ*HQUCw| diff --git a/docs/docs/assets/env-var/start_menu.png b/docs/docs/assets/env-var/start_menu.png deleted file mode 100644 index fc7d9b5eac705df2d48502f51ae45a05f143ac76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51108 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 diff --git a/docs/docs/development/ide-integration.md b/docs/docs/development/ide-integration.md index 6ca43321..bfcd5def 100644 --- a/docs/docs/development/ide-integration.md +++ b/docs/docs/development/ide-integration.md @@ -59,86 +59,41 @@ click **Add Configuration**, enter a name, and click **OK**. Change these options: -| Option | Value | -| ------------------------------------- | ---------------------------------------------------- | -| Compiler path | Path to your toolchain's GCC binary (see below) | -| IntelliSense mode | gcc-arm | -| Advanced Settings > Compiler commands | `${workspaceFolder}/app/build/compile_commands.json` | +| Option | Value | +| ------------------------------------- | ------------------------------------------------------ | +| Compiler path | Path to your toolchain's GCC binary (see below) | +| IntelliSense mode | `linux-gcc-arm`, `windows-gcc-arm`, or `macos-gcc-arm` | +| Advanced Settings > Compiler commands | `${workspaceFolder}/app/build/compile_commands.json` | + +If you are developing inside a Docker container, set the IntelliSense mode to `linux-gcc-arm` regardless of the host operating system. #### Compiler Path - - - -Open VS Code's integrated terminal and run the following commands. It will print -your compiler path. - -```sh -source zephyr/zephyr-env.sh -echo ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc -``` - -:::note -You will need to update this path any time you switch to a new version of the Zephyr SDK. -::: - - - - -Your compiler path is +Open VS Code's integrated terminal and run the following command: ``` -${env:GNUARMEMB_TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc.exe +cmake -P zephyr/cmake/verify-toolchain.cmake ``` -This assumes `GNUARMEMB_TOOLCHAIN_PATH` is set in your system or user environment variables. -If not, you will need to list the full path instead of using the `${env}` placeholder. - - - - -Open VS Code's integrated terminal and run the following command. It will print -your compiler path. - -```sh -echo ${GNUARMEMB_TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc -``` - - - - -Your compiler path is +This should print something like ``` -/usr/bin/arm-none-eabi-gcc +-- ZEPHYR_TOOLCHAIN_VARIANT: zephyr +-- SDK_VERSION: 0.15.2 +-- ZEPHYR_SDK_INSTALL_DIR : /home/marvin/.local/zephyr-sdk-0.15.2 ``` - - - -Open VS Code's integrated terminal and run the following commands. It will print -your compiler path. - -```sh -source zephyr/zephyr-env.sh -echo ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc -``` - -:::note -You will need to update this path any time you switch to a new version of the Zephyr SDK. -::: - - - - -Your compiler path is +Your compiler path is the value of `ZEPHYR_SDK_INSTALL_DIR` plus `/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc`, for example: ``` -${env:ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc +/home/marvin/.local/zephyr-sdk-0.15.2/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc ``` - - +If you are building for an platform other than ARM, replace `/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc` with the path to the compiler for the appropriate architecture, for example: + +``` +/home/marvin/.local/zephyr-sdk-0.15.2/riscv64-zephyr-elf/bin/riscv64-zephyr-elf-gcc +``` #### Compiler Commands Path diff --git a/docs/docs/development/setup.md b/docs/docs/development/setup.md index bf1bd122..8ce5ffde 100644 --- a/docs/docs/development/setup.md +++ b/docs/docs/development/setup.md @@ -1,6 +1,6 @@ --- -title: Basic Setup -sidebar_label: Basic Setup +title: Toolchain Setup +sidebar_label: Toolchain Setup --- import Tabs from '@theme/Tabs'; @@ -10,287 +10,84 @@ export const OsTabs = (props) => ({props.children}); -## Prerequisites +This guide will show you how to set up a development environment for building ZMK locally. -ZMK requires the following base packages to first be installed: +## Install Dependencies -- Git -- Python 3 -- `pip` -- `wget` -- devicetree compiler -- CMake -- `dfu-util` -- Various build essentials, e.g. gcc, automake, autoconf +Click the operating system you are using. (The VS Code & Docker option can be used on any OS.) + + +This option use the same [Docker image which is used by the GitHub action](https://github.com/zmkfirmware/zmk-docker) for local development. Beyond the benefits of [dev/prod parity](https://12factor.net/dev-prod-parity), this approach is also the easiest to set up. No toolchain or dependencies are necessary when using Docker; the container image you'll be using already has the toolchain installed and set up to use. + +1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) for your operating system. +2. Install [Visual Studio Code](https://code.visualstudio.com/) +3. Install the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + +:::info +The docker container already includes `west`. Skip past the following section to [Get Source Code](#get-source-code). +::: + + -On Debian and Ubuntu, we'll use `apt` to install our base dependencies: +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -```sh -sudo apt update -``` - -With the latest package information, you can now install the base dependencies: - -```sh -sudo apt install -y \ - git \ - wget \ - autoconf \ - automake \ - build-essential \ - bzip2 \ - ccache \ - device-tree-compiler \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-dev \ - python3-pip \ - python3-setuptools \ - xz-utils -``` - -:::note -Recent LTS releases of Debian and Ubuntu may include outdated CMake versions. If the output of `cmake --version` is older than 3.20, upgrade your distribution (e.g., from Ubuntu 20.04 LTS to Ubuntu 22.04 LTS), or else install CMake version 3.20 or newer manually (e.g, from Debian backports or from PyPI with `pip install --user cmake`). -::: - - - -On Raspberry OS, we'll use `apt` to install our base dependencies: - -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: - -```sh -sudo apt update -``` - -With the latest package information, you can now install the base dependencies: - -```sh -sudo apt install -y \ - git \ - wget \ - autoconf \ - automake \ - build-essential \ - bzip2 \ - ccache \ - device-tree-compiler \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-dev \ - python3-pip \ - python3-setuptools \ - xz-utils -``` - - - - -On Fedora, we'll use `dnf` to install our base dependencies: - -#### DNF Update - -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: - -```sh -sudo dnf update -``` - -#### Install Dependencies - -With the latest package information, you can now install the base dependencies: - -```sh -sudo dnf install -y \ - git \ - wget \ - autoconf \ - automake \ - bzip2 \ - ccache \ - dtc \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-devel \ - python3-pip \ - python3-setuptools \ - xz -``` +Return to this guide once you are finished with each section. -:::note -Use `cmd.exe` with these instructions rather than PowerShell. -::: +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -Chocolatey is recommended and used for the following instructions. You can manually install each of these applications and add them to your `PATH` if you don't want to use Chocolatey. +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -1. [Install Chocolatey](https://chocolatey.org/install) -2. Open `cmd.exe` as **Administrator** -3. Run the following `choco` commands: - ```shell - choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System' - choco install ninja gperf python git - ``` +Return to this guide once you are finished with each section. -It is recommended to install `dfu-util` to avoid any later confusion while flashing devices. You can do this by running this command with chocolatey: - -```shell -choco install dfu-util -``` +`dfu-util` is required to flash devices that use DFU, but there is currently no maintained package for it on Chocolatey. [QMK Toolbox](https://github.com/qmk/qmk_toolbox) contains a working version of it though. -#### Homebrew +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -Homebrew is required to install the system dependencies. If you haven't done so, visit [Homebrew](https://brew.sh/) for instructions. Once installed, use it to install the base dependencies: +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -``` -brew install cmake ninja python3 ccache dtc git wget dfu-util -``` - - - - -This setup leverages the same [image which is used by the GitHub action](https://github.com/zmkfirmware/zmk-docker) for local development. Beyond the benefits of [dev/prod parity](https://12factor.net/dev-prod-parity), this approach is also the easiest to set up. No toolchain or dependencies are necessary when using Docker; the container image you'll be using already has the toolchain installed and set up to use. - -1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) for your operating system. -2. Install [VS Code](https://code.visualstudio.com/) -3. Install the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) - -:::info -The docker container includes `west` and the compilation toolchain. If you're using docker and VS Code, you can skip right to [Source Code](#source-code). -::: - - - - -## Setup - -### West Installation - -`west` is the [Zephyr™ meta-tool](https://docs.zephyrproject.org/2.5.0/guides/west/index.html) used to configure and build Zephyr™ applications. - -West can be installed by using the `pip` python package manager. The [Zephyr™ instructions](https://docs.zephyrproject.org/2.5.0/guides/west/install.html#installing-west) are summarized here: - - - - -```sh -pip3 install --user -U west -``` - - - - -In `cmd.exe` as **Administrator**: - -```sh -pip3 install -U west -``` - -:::note -**For Windows, do not use the `--user` argument** that Linux uses otherwise `west` will be installed in a different location and the below instructions for adding Python `pip` will no longer apply. -::: - -Once `west` is installed, close Command Prompt and open a new session as a **user** for the remainder of the instructions. - - - - -:::danger `pip` user packages -If you haven't done so yet, you may need to add the Python `pip` package directory to your `PATH` otherwise your computer will not be able to find the `west` command. -::: - - - -Run the following commands: - -```sh -echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc -source ~/.bashrc -``` - - - - -1. See the [Environment Variables](#environment-variables) section on how to get to the Environment Variables page. -2. Under "System variables" select the "Path" variable. Click "Edit..." and then "New" to add the directory where your `west.exe` is located. By default this should be `C:\Python##\Scripts` where ## is your Python version number. -3. Close Command Prompt and open a new session for the changes to take effect, or run `refreshenv`. - - - - -### Toolchain Installation - -The toolchain provides the compiler, linker, etc., necessary to build for the target -platform. - - - - -#### Zephyr™ ARM SDK - -To build firmwares for the ARM architecture (all supported MCUs/keyboards at this point), you'll need to install the Zephyr™ ARM SDK to your system: - -``` -export ZSDK_VERSION=0.13.2 -wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" && \ - sh "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ - rm "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" -``` - -The installation will prompt with several questions about installation location, and creating a default `~/.zephyrrc` for you with various variables. The defaults should normally work as expected. +Return to this guide once you are finished with each section. -Because Raspberry OS (Raspbian) runs on the same architecture (but different ABI) as the keyboard MCUs, -the operating system's installed [cross compilers](https://docs.zephyrproject.org/2.5.0/getting_started/toolchain_other_x_compilers.html) can be used to target the different ABI. +#### Install Base Dependencies + +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions for Ubuntu under these sections: + +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) + +Return to this guide once you are finished with each section. + +#### Install Cross-Compile Toolchain + +Because Raspberry OS runs on the same architecture (but different ABI) as ARM keyboard MCUs, the operating system's installed [cross compilers](https://docs.zephyrproject.org/3.2.0/develop/toolchains/other_x_compilers.html) can be used to target the different ABI. Building for non-ARM MCUs has not been tested. First, the cross compiler should be installed: @@ -298,7 +95,7 @@ First, the cross compiler should be installed: sudo apt install gcc-arm-none-eabi ``` -Next, we'll configure Zephyr™ with some extra environment variables needed to find the cross compiler by adding the following to `~/.zephyrrc`: +Next, we'll configure Zephyr with some [environment variables](https://docs.zephyrproject.org/3.2.0/develop/env_vars.html#env-vars) needed to find the cross compiler. Create a file named `~/.zephyrrc` if it doesn't exist, and add these lines to it: ```sh export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile @@ -308,50 +105,83 @@ export CROSS_COMPILE=/usr/bin/arm-none-eabi- -#### Zephyr™ ARM SDK - -To build firmwares for the ARM architecture (all supported MCUs/keyboards at this point), you'll need to install the Zephyr™ ARM SDK to your system: - -``` -export ZSDK_VERSION=0.13.2 -wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" && \ - sh "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ - rm "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" -``` - -The installation will prompt with several questions about installation location, and creating a default `~/.zephyrrc` for you with various variables. The defaults should normally work as expected. - - - - -#### GNU ARM Embedded - -Since the Zephyr™ SDK is not available for Windows, we recommending following the [Zephyr documentation](https://docs.zephyrproject.org/2.5.0/getting_started/toolchain_3rd_party_x_compilers.html#gnu-arm-embedded) to install a GNU ARM Embedded build. Note the warnings regarding installing the toolchain into a path with spaces, and make sure to follow the steps to add the environment variables which are also summarized with screenshots in the [Environment Variables](#environment-variables) section below. - - - - -#### GNU ARM Embedded - -Since the Zephyr™ SDK is not available for macOS, we recommending following the steps to install the GNU ARM Embedded toolchain: - -``` -brew install --cask gcc-arm-embedded -``` +Follow Zephyr's [Install Linux Host Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/installation_linux.html) documentation for Fedora. -:::note -If you intend to build firmware straight away, make sure to correctly setup the current shell. +### Install West -Notes on setting this up can be found in the [Environment Variables](#environment-variables) section. -The transient instructions can be used to setup the current shell, and the automatic instructions can setup any newly made shells automatically. +`west` is the [Zephyr® Project's meta-tool](https://docs.zephyrproject.org/3.2.0/develop/west/index.html) used to configure and build Zephyr OS applications. -The transient instructions must be run to build firmware using the current shell. -::: +West can be installed by using the `pip` python package manager. The [Zephyr™ instructions](https://docs.zephyrproject.org/3.2.0/develop/west/install.html) are summarized here: -### Source Code + + + +Install west: + +```sh +pip3 install --user -U west +``` + +Verify that west is installed: + +```sh +west --version +``` + +This should print a message like "West version: v0.14.0". If it prints an error instead, make sure `~/.local/bin` is on your `PATH` environment variable. You can add it with these commands: + +```sh +echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc +source ~/.bashrc +``` + + + + +Install west: + +```sh +pip3 install -U west +``` + +Verify that west is installed: + +```sh +west --version +``` + +This should print a message like "West version: v0.14.0". If it prints an error instead, make sure that the Python scripts directory is on your `PATH` environment variable. You can add it by opening a PowerShell window and running the following commands: + +```powershell +$Scripts = python -c "import sysconfig; print(sysconfig.get_path('scripts'))" +$Path = [Environment]::GetEnvironmentVariable('PATH', 'User') +[Environment]::SetEnvironmentVariable('PATH', "$Path;$Scripts", 'User') +$env:PATH += ";$Scripts" +``` + + + + +Install west: + +```sh +pip3 install -U west +``` + + + + +## Get Source Code Next, you'll need to clone the ZMK source repository if you haven't already. Navigate to the folder you would like to place your `zmk` directory in and run the following command: @@ -359,13 +189,13 @@ Next, you'll need to clone the ZMK source repository if you haven't already. Nav git clone https://github.com/zmkfirmware/zmk.git ``` -### Initialize & Update Zephyr Workspace +## Initialize & Update Zephyr Workspace Since ZMK is built as a Zephyr™ application, the next step is to use `west` to initialize and update your workspace. The ZMK Zephyr™ application is in the `app/` source directory: -#### Step into the repository +### Step into the repository @@ -421,19 +251,13 @@ All subsequent steps must be performed from the VS Code terminal _inside_ the co -#### Initialize West +### Initialize the Application ```sh west init -l app/ ``` -:::caution Command Not Found? -If you encounter errors like `command not found: west` then your `PATH` environment variable is likely -missing the Python 3 user packages directory. See the [West Build Command](#west-build-command) -section again for links to how to do this -::: - -#### Update To Fetch Modules +### Update to Fetch Modules ```sh west update @@ -449,103 +273,45 @@ If you're using Docker, you're done with setup! You must restart the container a Once your container is restarted, proceed to [Building and Flashing](development/build-flash.md). ::: -#### Export Zephyr™ Core +### Export Zephyr CMake package + +This allows CMake to load the code needed to build ZMK. ```sh west zephyr-export ``` -#### Install Zephyr Python Dependencies +### Install Zephyr Python Dependencies + +Some additional Python dependencies are listed in Zephyr's `scripts/requirements.txt` file. + + + ```sh -pip3 install --user -r zephyr/scripts/requirements-base.txt -``` - -### Environment Variables - - - - -#### For GNU ARM Embedded on Windows - -On Windows, only two environment variables need to be set for ZMK to build properly: `ZEPHYR_TOOLCHAIN_VARIANT` and `GNUARMEMB_TOOLCHAIN_PATH`. - -1. Open Start Menu and type 'env' to find the 'Edit the system environment variables' option. Open it. - -![Environment variables in Start Menu](../assets/env-var/start_menu.png) - -2. Click 'Environment Variables...'. - -![Environment variables button](../assets/env-var/env_var.png) - -3. Click "New..." under System variables to create a new system variable. - -![Environment variables menu](../assets/env-var/new_variable.png) - -4. Set the variable name to 'ZEPHYR_TOOLCHAIN_VARIANT' and value to 'gnuarmemb'. Click OK to save. - -![Adding Zephyr toolchain variable](../assets/env-var/zephyr_toolchain.png) - -5. Create another variable with variable name 'GNUARMEMB_TOOLCHAIN_PATH' and value set to wherever you installed your toolchain. **Make sure this path does not contain any spaces.** If it does, rename the folder and update here. Click OK to save. - -![Adding GNUARMEMB variable](../assets/env-var/gnuarmemb.png) - -6. Close Command Prompt and reopen, or run `refreshenv` to apply the changes. - - - - - -#### For Zephyr - -By default, the Zephyr™ SDK will create a file named `~/.zephyrrc` with the correct environment variables to build ZMK. -We suggest two main [options](https://docs.zephyrproject.org/2.5.0/guides/env_vars.html#option-3-using-zephyrrc-files) for how to load those settings. - -##### Per Shell - -To load the Zephyr environment properly for just one transient shell, run the following from your ZMK checkout directory: - -``` -source zephyr/zephyr-env.sh -``` - -##### All Shells - -To load the environment variables for your shell every time, -append the existing `~/.zephyrrc` file to your shell's RC file and then start a new shell. - - - - - -``` -cat ~/.zephyrrc >> ~/.bashrc +pip3 install --user -r zephyr/scripts/requirements.txt ``` + - - -``` -cat ~/.zephyrrc >> ~/.zshrc +```sh +pip3 install -r zephyr/scripts/requirements.txt ``` + - - - - +```sh +pip3 install -r zephyr/scripts/requirements.txt +``` + + From fbdb24c6fe56a576e288db3acfd91dd67a6ff192 Mon Sep 17 00:00:00 2001 From: zhiayang Date: Wed, 21 Dec 2022 17:45:01 +0800 Subject: [PATCH 010/134] fix(driver): Fix potentially buggy read/write routines for max7318 driver --- app/drivers/gpio/gpio_max7318.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/app/drivers/gpio/gpio_max7318.c b/app/drivers/gpio/gpio_max7318.c index 3dcc710c..ac9c5341 100644 --- a/app/drivers/gpio/gpio_max7318.c +++ b/app/drivers/gpio/gpio_max7318.c @@ -72,17 +72,19 @@ struct max7318_drv_data { static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) { const struct max7318_config *config = dev->config; - uint16_t data = 0; - int ret = i2c_burst_read_dt(&config->i2c_bus, reg, (uint8_t *)&data, sizeof(data)); + uint8_t data[2] = { 0 }; + int ret = i2c_burst_read_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); if (ret) { - LOG_DBG("i2c_write_read FAIL %d\n", ret); + LOG_DBG("i2c_burst_read FAIL %d\n", ret); return ret; } - *buf = sys_le16_to_cpu(data); + // the first register is data[0], the second one is data[1] + // since we only ever read the PORTA registers here, it's effectively little endian. + *buf = sys_get_le16(data); - LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (*buf & 0xFF), (reg + 1), - (*buf >> 8)); + LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), + data[1]); return 0; } @@ -105,9 +107,13 @@ static int write_registers(const struct device *dev, uint8_t reg, uint16_t value LOG_DBG("max7318: write: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), (value >> 8)); - uint16_t data = sys_cpu_to_le16(value); + uint8_t data[2] = { 0 }; - return i2c_burst_write_dt(&config->i2c_bus, reg, (uint8_t *)&data, sizeof(data)); + // bits 0..7 are port A, 8..15 are port B, so we should write bits 0..7 first + // -- ie. this is little endian also. + sys_put_le16(value, &data[0]); + + return i2c_burst_write_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); } /** From 41830ce19a71ac94a2e620d59c4d0a03ca6d093c Mon Sep 17 00:00:00 2001 From: zhiayang Date: Sun, 8 Jan 2023 16:52:38 +0800 Subject: [PATCH 011/134] fix formatting --- app/drivers/gpio/gpio_max7318.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/drivers/gpio/gpio_max7318.c b/app/drivers/gpio/gpio_max7318.c index ac9c5341..04424b48 100644 --- a/app/drivers/gpio/gpio_max7318.c +++ b/app/drivers/gpio/gpio_max7318.c @@ -72,7 +72,7 @@ struct max7318_drv_data { static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) { const struct max7318_config *config = dev->config; - uint8_t data[2] = { 0 }; + uint8_t data[2] = {0}; int ret = i2c_burst_read_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); if (ret) { LOG_DBG("i2c_burst_read FAIL %d\n", ret); @@ -83,8 +83,7 @@ static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) // since we only ever read the PORTA registers here, it's effectively little endian. *buf = sys_get_le16(data); - LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), - data[1]); + LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), data[1]); return 0; } @@ -107,7 +106,7 @@ static int write_registers(const struct device *dev, uint8_t reg, uint16_t value LOG_DBG("max7318: write: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), (value >> 8)); - uint8_t data[2] = { 0 }; + uint8_t data[2] = {0}; // bits 0..7 are port A, 8..15 are port B, so we should write bits 0..7 first // -- ie. this is little endian also. From 2a5e914a777e4569bfbf08921750b928323d155b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 03:40:37 +0000 Subject: [PATCH 012/134] chore(deps): bump json5 from 2.2.1 to 2.2.3 in /docs Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 69ee0fc4..c4cad7c0 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9158,9 +9158,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -22650,9 +22650,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", From 9d1070a140942f2e48dfbb811b07d3ad8a71d594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Bol=C3=ADvar?= Date: Wed, 1 Feb 2023 08:17:23 -0800 Subject: [PATCH 013/134] chore(build): update west.yml syntax MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit West has supported a 'name-blocklist' replacement for 'name-blacklist' since v0.9. Signed-off-by: Martí Bolívar --- app/west.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/west.yml b/app/west.yml index a0c56501..b0f05aed 100644 --- a/app/west.yml +++ b/app/west.yml @@ -10,8 +10,7 @@ manifest: revision: v3.0.0+zmk-fixes clone-depth: 1 import: - # TODO: Rename once upstream offers option like `exclude` or `denylist` - name-blacklist: + name-blocklist: - ci-tools - hal_altera - hal_cypress From b7d5865e40eeaf7999a73fdaff1d7043babbc73e Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Thu, 2 Feb 2023 17:07:33 +0800 Subject: [PATCH 014/134] feat(docs): additional note on bug fixed in macOS v13.1 --- docs/docs/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index a535a4ef..96f729b9 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -23,7 +23,7 @@ Variations of the warnings shown below occur when flashing the `.uf2` ### macOS Ventura error -macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. +macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. Issue is fixed in macOS version 13.1. ### CMake Error From c065d451cb82e2dceda4efdb2991aeeeef1cdbbf Mon Sep 17 00:00:00 2001 From: Omri Kaplan Date: Wed, 8 Feb 2023 03:29:38 +0200 Subject: [PATCH 015/134] fix(shields): Fix keycodes that differ from the default keymap (#1590) - Asterisk in layer 1 was mapped to 8 - Underscore in layer 1 was mapped to minus - Right GUI in layer 0 was mapped to right Alt - Space in layer 1 was mapped to Return - Plus was mapped with KP_PLUS --- app/boards/shields/reviung41/reviung41.keymap | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/boards/shields/reviung41/reviung41.keymap b/app/boards/shields/reviung41/reviung41.keymap index f0450b19..d291ca8b 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -23,26 +23,26 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RSHFT RET - &kp LALT &mo 1 &kp SPACE &mo 2 &kp RALT + &kp LALT &mo 1 &kp SPACE &mo 2 &kp RGUI >; }; lower_layer { -// ---------------------------------------------------------------------------------- -// | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | -// | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | -// | | ESC | GUI | ALT | CAPS| " | | HOME| END | PGUP| PGDN| PRSC| SHFT(RET) | +// ------------------------------------------------------------------------------------ +// | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | +// | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | +// | | ESC | GUI | ALT | CAPS| " | | HOME| END | PGUP| PGDN| PRSC| SHFT(SPACE) | // | | | RET | ADJ | | bindings = < - &trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp N8 &kp LPAR &kp RPAR &kp DEL - &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp GRAVE &kp TILDE - &trans &kp ESC &kp LGUI &kp LALT &kp CLCK &kp DQT &kp HOME &kp END &kp PG_UP &kp PG_DN &kp PSCRN &mt RSHFT RET + &trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL + &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp GRAVE &kp TILDE + &trans &kp ESC &kp LGUI &kp LALT &kp CLCK &kp DQT &kp HOME &kp END &kp PG_UP &kp PG_DN &kp PSCRN &mt RSHFT SPACE &trans &trans &kp RET &mo 3 &trans >; }; raise_layer { -// ----------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | F6 | // | | ESC | GUI | ALT | CAPS| " | | F7 | F8 | F9 | F10 | F11 | F12 | From 72624a41fa627b143124f68ac38af72d18722015 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 18 Feb 2023 22:29:03 -0800 Subject: [PATCH 016/134] fix(shields): Add missing col-offsets for extra transforms --- app/boards/shields/corne/corne_right.overlay | 4 ++++ app/boards/shields/jian/jian_right.overlay | 8 ++++++++ app/boards/shields/jiran/jiran_right.overlay | 8 ++++++++ app/boards/shields/jorne/jorne_right.overlay | 8 ++++++++ app/boards/shields/kyria/kyria_rev2_right.overlay | 4 ++++ app/boards/shields/kyria/kyria_right.overlay | 4 ++++ 6 files changed, 36 insertions(+) diff --git a/app/boards/shields/corne/corne_right.overlay b/app/boards/shields/corne/corne_right.overlay index 6e79a858..1d7ed9ec 100644 --- a/app/boards/shields/corne/corne_right.overlay +++ b/app/boards/shields/corne/corne_right.overlay @@ -10,6 +10,10 @@ col-offset = <6>; }; +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jian/jian_right.overlay b/app/boards/shields/jian/jian_right.overlay index f3b0da3d..cac83fd3 100644 --- a/app/boards/shields/jian/jian_right.overlay +++ b/app/boards/shields/jian/jian_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&crkbd_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 16 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jiran/jiran_right.overlay b/app/boards/shields/jiran/jiran_right.overlay index 75b9fb5a..c3648797 100644 --- a/app/boards/shields/jiran/jiran_right.overlay +++ b/app/boards/shields/jiran/jiran_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&jian_transform { + col-offset = <6>; +}; + +&crkbd_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 7 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jorne/jorne_right.overlay b/app/boards/shields/jorne/jorne_right.overlay index 4f138b0b..698bf9dd 100644 --- a/app/boards/shields/jorne/jorne_right.overlay +++ b/app/boards/shields/jorne/jorne_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&crkbd_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 7476bcba..08dc59d1 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -10,6 +10,10 @@ col-offset = <8>; }; +&five_column_transform { + col-offset = <7>; +}; + &kscan0 { row-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index eefd76bf..b3b3420e 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -10,6 +10,10 @@ col-offset = <8>; }; +&five_column_transform { + col-offset = <7>; +}; + &kscan0 { col-gpios = <&pro_micro 10 GPIO_ACTIVE_HIGH> From 5d22d76d726afbe67ba0e8dc908c342641ab8f58 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 18 Feb 2023 22:31:23 -0800 Subject: [PATCH 017/134] fix(shields): Fix Kyria five column transforms --- app/boards/shields/kyria/kyria.dtsi | 8 ++++---- app/boards/shields/kyria/kyria_rev2.dtsi | 10 +++++----- app/boards/shields/kyria/kyria_rev2_right.overlay | 2 +- app/boards/shields/kyria/kyria_right.overlay | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/boards/shields/kyria/kyria.dtsi b/app/boards/shields/kyria/kyria.dtsi index 1b0ca940..cffe23b0 100644 --- a/app/boards/shields/kyria/kyria.dtsi +++ b/app/boards/shields/kyria/kyria.dtsi @@ -36,10 +36,10 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) columns = <14>; rows = <4>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) +RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) >; }; }; diff --git a/app/boards/shields/kyria/kyria_rev2.dtsi b/app/boards/shields/kyria/kyria_rev2.dtsi index 7c7d9efe..b40af365 100644 --- a/app/boards/shields/kyria/kyria_rev2.dtsi +++ b/app/boards/shields/kyria/kyria_rev2.dtsi @@ -36,10 +36,10 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) columns = <14>; rows = <4>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) +RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) + RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) >; }; }; @@ -52,4 +52,4 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) &right_encoder { a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 08dc59d1..9e29c6f7 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -11,7 +11,7 @@ }; &five_column_transform { - col-offset = <7>; + col-offset = <8>; }; &kscan0 { diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index b3b3420e..00ba5b2f 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -11,7 +11,7 @@ }; &five_column_transform { - col-offset = <7>; + col-offset = <8>; }; &kscan0 { From 0c0ebda65b6f384b8bd827365cd5d23702bc04b3 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 22:17:12 -0800 Subject: [PATCH 018/134] fix(keymap): Fix default Ergodash keymap --- app/boards/shields/ergodash/ergodash.keymap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/shields/ergodash/ergodash.keymap b/app/boards/shields/ergodash/ergodash.keymap index 65cc1178..a85c58a6 100644 --- a/app/boards/shields/ergodash/ergodash.keymap +++ b/app/boards/shields/ergodash/ergodash.keymap @@ -53,7 +53,7 @@ * .----------------------------------------------------------------------------------------------------------------------. */ /* FIXME boot and reset are not yet locale aware */ bindings = < -&kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp &none &kp &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 +&kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &none &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &trans &bootloader &reset &none &none &none &none &none &none &none &none &none &none &trans From 3eee53676f793fb352d6cabe9e471106b7878fbb Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 22:06:56 -0800 Subject: [PATCH 019/134] fix(shields): Fix missing binding in eek keymap --- app/boards/shields/eek/eek.keymap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index f54dc013..439c90aa 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -48,9 +48,9 @@ bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &out OUT_USB &out OUT_BLE &none &kp EQUAL &kp MINUS &kp CAPS &kp F5 &kp F6 &kp F7 &kp F8 &kp LBKT &kp RBKT &none &kp GRAVE &kp BSLH - &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &kp RSHFT + &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &none &kp RSHFT &kp LCTRL &kp LGUI &kp LALT &reset &none &trans >; }; }; -}; \ No newline at end of file +}; From 1d65661efa3e19db59d453df6eb1139fb97df836 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 23:24:11 -0800 Subject: [PATCH 020/134] fix(keymap): Fix tidbit keymap --- app/boards/shields/tidbit/tidbit.keymap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 646a5db7..7fa98af2 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -26,7 +26,7 @@ bindings = < &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp &none + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER &none &kp KP_NUMBER_0 &kp KP_DOT &none >; From 719de801e7b39bf9a7e89e468cc9f46f824146f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 01:29:24 +0000 Subject: [PATCH 021/134] chore(deps): bump @sideway/formula from 3.0.0 to 3.0.1 in /docs Bumps [@sideway/formula](https://github.com/sideway/formula) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/sideway/formula/releases) - [Commits](https://github.com/sideway/formula/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: "@sideway/formula" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index c4cad7c0..93a980c2 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3045,9 +3045,9 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", @@ -18139,9 +18139,9 @@ } }, "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "@sideway/pinpoint": { "version": "2.0.0", From 5ef6f2f2b7fc059f4992b70752be5f79b1bca129 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Feb 2023 05:50:58 +0000 Subject: [PATCH 022/134] chore(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 in /docs Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 93a980c2..fbc859e5 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8281,9 +8281,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-deceiver": { "version": "1.2.7", @@ -22047,9 +22047,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-deceiver": { "version": "1.2.7", From 89044079839b156eeb4a3da497d1dab904290f31 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Sat, 28 Jan 2023 17:15:49 -0500 Subject: [PATCH 023/134] feat(underglow): use float for HSB to RGB calculation --- app/src/rgb_underglow.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 25d4466e..18614a4e 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -75,15 +75,15 @@ static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { } static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { - double r, g, b; + float r, g, b; uint8_t i = hsb.h / 60; - double v = hsb.b / ((float)BRT_MAX); - double s = hsb.s / ((float)SAT_MAX); - double f = hsb.h / ((float)HUE_MAX) * 6 - i; - double p = v * (1 - s); - double q = v * (1 - f * s); - double t = v * (1 - (1 - f) * s); + float v = hsb.b / ((float)BRT_MAX); + float s = hsb.s / ((float)SAT_MAX); + float f = hsb.h / ((float)HUE_MAX) * 6 - i; + float p = v * (1 - s); + float q = v * (1 - f * s); + float t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: From 6cb42a80607c8bf8a493ac2c781568462aa8ce13 Mon Sep 17 00:00:00 2001 From: Robert U <978080+urob@users.noreply.github.com> Date: Sun, 12 Mar 2023 12:24:00 -0400 Subject: [PATCH 024/134] feat(behaviors): On-release option for positional-hold-taps --- .../behaviors/zmk,behavior-hold-tap.yaml | 2 ++ app/src/behaviors/behavior_hold_tap.c | 8 ++++++-- .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ docs/docs/behaviors/hold-tap.md | 3 +++ 21 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index e4cfaeab..a2affbf2 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -37,3 +37,5 @@ properties: type: array required: false default: [] + hold-trigger-on-release: + type: boolean diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index f09006ed..a9e4d642 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -60,6 +60,7 @@ struct behavior_hold_tap_config { bool global_quick_tap; enum flavor flavor; bool retro_tap; + bool hold_trigger_on_release; int32_t hold_trigger_key_positions_len; int32_t hold_trigger_key_positions[]; }; @@ -587,9 +588,11 @@ static int position_state_changed_listener(const zmk_event_t *eh) { } // Store the position of pressed key for positional hold-tap purposes. - if ((ev->state) // i.e. key pressed (not released) + if ((undecided_hold_tap->config->hold_trigger_on_release != + ev->state) // key has been pressed and hold_trigger_on_release is not set, or key + // has been released and hold_trigger_on_release is set && (undecided_hold_tap->position_of_first_other_key_pressed == - -1) // i.e. no other key has been pressed yet + -1) // no other key has been pressed yet ) { undecided_hold_tap->position_of_first_other_key_pressed = ev->position; } @@ -703,6 +706,7 @@ static int behavior_hold_tap_init(const struct device *dev) { .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ + .hold_trigger_on_release = DT_INST_PROP(n, hold_trigger_on_release), \ .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ }; \ diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..24a8b033 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_decide: 0 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (balanced decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..942d5ae4 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_bal { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..fb5587b1 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..677a2534 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_bal { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..1df24b0c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..b48332ff --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_hold { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..e35848cd --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..77398582 --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_hold { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..d72f20d6 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_decide: 0 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..504318f7 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&tp { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..a330a93c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..7061eee7 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&tp { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 793e350d..1dfb8e5d 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -132,6 +132,9 @@ See the following example, which uses a hold-tap behavior definition, configured - The sequence `(pht_down, W_down, W_up, pht_up)` produces `W`. The normal hold behavior (LEFT_SHIFT) **is NOT** modified into a tap behavior (Q) by positional hold-tap because the first key pressed after the hold-tap key is the `W key`, which is in position 1, which **IS** included in `hold-trigger-key-positions`. - If the `LEFT_SHIFT / Q key` is held by itself for longer than `tapping-term-ms`, a hold behavior is produced. This is because positional hold-tap only modifies the behavior of a hold-tap if another key is pressed before the `tapping-term-ms` period expires. +By default, `hold-trigger-key-positions` are evaluated upon the first _key press_ after +the hold-tap. For homerow mods, this is not always ideal, because it prevents combining multiple modifiers unless they are included in `hold-trigger-key-positions`. To overwrite this behavior, one can set `hold-trigger-on-release`. If set to true, the evaluation of `hold-trigger-key-positions` gets delayed until _key release_. This allows combining multiple modifiers when the next key is _held_, while still deciding the hold-tap in favor of a tap when the next key is _tapped_. + ### Example Use-Cases Date: Wed, 22 Mar 2023 01:42:11 +0100 Subject: [PATCH 025/134] fix(boards): Disable CDC by default for CiZ The default configuration for corneish-zen enables a USB CDC endpoint by default. This is most probably a debugging left-over. Disable that endpoint. CONFIG_ZMK_USB_LOGGING depends on it anyway, so it will be enabled again with that config option set. --- .../corneish_zen/corneish_zen_v2_left_defconfig | 16 ---------------- .../corneish_zen/corneish_zen_v2_right_defconfig | 9 --------- 2 files changed, 25 deletions(-) diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index eb1e552a..4e676147 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -73,19 +73,3 @@ CONFIG_ZMK_WIDGET_LAYER_STATUS=n #CONFIG_LVGL_LOG_LEVEL_DBG=y #CONFIG_LVGL_USE_DEBUG=y #CONFIG_SENSOR_LOG_LEVEL_DBG=y - -# Turn on USB CDC ACM device -CONFIG_USB_DEVICE_STACK=y -CONFIG_USB_CDC_ACM=y -CONFIG_USB_CDC_ACM_RINGBUF_SIZE=1024 - -# Enable serial console -CONFIG_SERIAL=y -CONFIG_CONSOLE=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_UART_LINE_CTRL=y - -# Enable USB UART -CONFIG_UART_CONSOLE=y - - diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 46b40dee..02039b8d 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -72,12 +72,3 @@ CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS=n #CONFIG_LVGL_LOG_LEVEL_DBG=y #CONFIG_LVGL_USE_DEBUG=y #CONFIG_SENSOR_LOG_LEVEL_DBG=y - -# Enable serial console -CONFIG_SERIAL=y -CONFIG_CONSOLE=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_UART_LINE_CTRL=y - -# Enable USB UART -CONFIG_UART_CONSOLE=y From cd64c59b39754477533e6dd7ad1055f07de92bb0 Mon Sep 17 00:00:00 2001 From: prdktntwcklr <61001903+prdktntwcklr@users.noreply.github.com> Date: Wed, 8 Mar 2023 01:12:11 +0000 Subject: [PATCH 026/134] fix(tests): ignore line endings --- app/run-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/run-test.sh b/app/run-test.sh index 068fdbb4..94438f34 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -33,7 +33,7 @@ if [ $? -gt 0 ]; then fi ./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log -diff -au $testcase/keycode_events.snapshot build/$testcase/keycode_events.log +diff -auZ $testcase/keycode_events.snapshot build/$testcase/keycode_events.log if [ $? -gt 0 ]; then if [ -f $testcase/pending ]; then echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log From ae8299edb3d638f1332475b1da0fdf40afa43fe4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 25 Mar 2023 13:17:16 -0400 Subject: [PATCH 027/134] fix(boards): Move the CDC ACM node under the USBD. * Ferris board's CDC ACM node was accidentally nested under the wrong node, causing USB logging builds to fail with cryptic error. --- app/boards/arm/ferris/ferris_rev02.dts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index dbf3f6e2..50de9526 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -116,6 +116,10 @@ &usb { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hsi { @@ -139,10 +143,6 @@ &rtc { status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; }; &flash0 { From 168b32b8288ba36831f262f82bfa166240506676 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 16 Jan 2023 00:40:53 -0500 Subject: [PATCH 028/134] refactor: Move to Zephyr 3.2 branch. --- app/west.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/west.yml b/app/west.yml index b0f05aed..ffa36ca3 100644 --- a/app/west.yml +++ b/app/west.yml @@ -7,7 +7,7 @@ manifest: projects: - name: zephyr remote: zmkfirmware - revision: v3.0.0+zmk-fixes + revision: v3.2.0+zmk-fixes clone-depth: 1 import: name-blocklist: From 69a4c3200d8c9c92e3e3c68bbd4969f19df70133 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 23:33:42 -0500 Subject: [PATCH 029/134] refactor(display): Updates for LVGL v8.x changes. * LV_ prefix from new LVGL official Kconfig now used. * API changes for themes, container object removal, etc. * Add our own Kconfig and code for theme default small font. * Remove some hardcoded sizes. --- app/boards/arm/corneish_zen/Kconfig.defconfig | 12 +- .../corneish_zen_v2_left_defconfig | 20 ++- .../corneish_zen_v2_right_defconfig | 20 ++- .../arm/corneish_zen/custom_status_screen.c | 38 +++--- .../arm/corneish_zen/widgets/battery_status.c | 9 +- .../arm/corneish_zen/widgets/battery_status.h | 4 +- .../arm/corneish_zen/widgets/layer_status.c | 8 +- .../arm/corneish_zen/widgets/layer_status.h | 4 +- .../arm/corneish_zen/widgets/output_status.c | 10 +- .../arm/corneish_zen/widgets/output_status.h | 4 +- .../corneish_zen/widgets/peripheral_status.c | 8 +- .../corneish_zen/widgets/peripheral_status.h | 4 +- app/boards/shields/corne/Kconfig.defconfig | 10 +- .../shields/elephant42/Kconfig.defconfig | 10 +- app/boards/shields/jorne/Kconfig.defconfig | 10 +- .../shields/knob_goblin/Kconfig.defconfig | 10 +- app/boards/shields/kyria/Kconfig.defconfig | 10 +- app/boards/shields/leeloo/Kconfig.defconfig | 10 +- app/boards/shields/lily58/Kconfig.defconfig | 10 +- app/boards/shields/lotus58/Kconfig.defconfig | 10 +- app/boards/shields/microdox/Kconfig.defconfig | 10 +- app/boards/shields/murphpad/Kconfig.defconfig | 10 +- app/boards/shields/nibble/Kconfig.defconfig | 10 +- .../shields/nice_view/Kconfig.defconfig | 8 +- app/boards/shields/nice_view/nice_view.conf | 4 +- app/boards/shields/snap/Kconfig.defconfig | 10 +- app/boards/shields/sofle/Kconfig.defconfig | 10 +- .../splitkb_aurora_corne/Kconfig.defconfig | 10 +- .../splitkb_aurora_lily58/Kconfig.defconfig | 10 +- .../splitkb_aurora_sweep/Kconfig.defconfig | 10 +- app/boards/shields/tidbit/Kconfig.defconfig | 10 +- .../shields/waterfowl/Kconfig.defconfig | 10 +- app/boards/shields/zodiark/Kconfig.defconfig | 10 +- app/src/display/Kconfig | 119 +++++++++++++++--- app/src/display/main.c | 45 ++++--- app/src/display/status_screen.c | 29 ++--- app/src/display/theme.c | 73 +++++++++++ app/src/display/theme.h | 65 ++++++++++ app/src/display/widgets/Kconfig | 10 +- app/src/display/widgets/battery_status.c | 5 +- app/src/display/widgets/layer_status.c | 4 +- app/src/display/widgets/output_status.c | 4 +- app/src/display/widgets/peripheral_status.c | 4 +- app/src/display/widgets/wpm_status.c | 8 +- 44 files changed, 463 insertions(+), 246 deletions(-) create mode 100644 app/src/display/theme.c create mode 100644 app/src/display/theme.h diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index a88cc5ca..33ce1256 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -42,12 +42,12 @@ config USB_DEVICE_STACK endif # USB config ZMK_DISPLAY - select LVGL_USE_CONT - select LVGL_FONT_MONTSERRAT_26 - select LVGL_FONT_MONTSERRAT_20 - select LVGL_FONT_MONTSERRAT_16 - select LVGL_USE_LABEL - select LVGL_USE_IMG + select LV_USE_CONT + select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_20 + select LV_FONT_MONTSERRAT_16 + select LV_USE_LABEL + select LV_USE_IMG choice ZMK_DISPLAY_STATUS_SCREEN default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 4e676147..42e27037 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -39,17 +39,15 @@ CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_SSD1306=n CONFIG_IL0323=y -CONFIG_LVGL_BITS_PER_PIXEL=1 -CONFIG_LVGL_COLOR_DEPTH_1=y -CONFIG_LVGL_DPI=145 -CONFIG_LVGL_VDB_SIZE=100 -CONFIG_LVGL_USE_THEME_MONO=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y # custom status screens CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 02039b8d..e9b36f2e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -39,17 +39,15 @@ CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_SSD1306=n CONFIG_IL0323=y -CONFIG_LVGL_BITS_PER_PIXEL=1 -CONFIG_LVGL_COLOR_DEPTH_1=y -CONFIG_LVGL_DPI=145 -CONFIG_LVGL_VDB_SIZE=100 -CONFIG_LVGL_USE_THEME_MONO=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y # custom status screens CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y diff --git a/app/boards/arm/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c index 7842925e..c45a6243 100644 --- a/app/boards/arm/corneish_zen/custom_status_screen.c +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -11,7 +11,7 @@ #include "widgets/layer_status.h" #include "custom_status_screen.h" -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LV_IMG_DECLARE(zenlogo); @@ -36,50 +36,42 @@ static struct zmk_widget_layer_status layer_status_widget; lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - screen = lv_obj_create(NULL, NULL); + screen = lv_obj_create(NULL); #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); - lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), NULL, LV_ALIGN_IN_TOP_MID, - 0, 2); + lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), LV_ALIGN_TOP_MID, 0, 2); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) zmk_widget_output_status_init(&output_status_widget, screen); - lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), NULL, LV_ALIGN_IN_TOP_MID, 0, - 41); + lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), LV_ALIGN_TOP_MID, 0, 41); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) zmk_widget_peripheral_status_init(&peripheral_status_widget, screen); - lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), NULL, - LV_ALIGN_IN_TOP_MID, 0, 41); + lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), LV_ALIGN_TOP_MID, 0, + 41); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) - zmk_widget_layer_status_init(&layer_status_widget, screen); - lv_obj_set_style_local_text_font(zmk_widget_layer_status_obj(&layer_status_widget), - LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, - lv_theme_get_font_small()); - lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), NULL, LV_ALIGN_IN_BOTTOM_MID, 0, - -5); - lv_obj_t *LayersHeading; - LayersHeading = lv_img_create(screen, NULL); - lv_obj_align(LayersHeading, NULL, LV_ALIGN_IN_BOTTOM_MID, 8, 5); + LayersHeading = lv_img_create(screen); + lv_obj_align(LayersHeading, LV_ALIGN_BOTTOM_MID, 0, -30); lv_img_set_src(LayersHeading, &layers2); + + zmk_widget_layer_status_init(&layer_status_widget, screen); + lv_obj_set_style_text_font(zmk_widget_layer_status_obj(&layer_status_widget), + &lv_font_montserrat_16, LV_PART_MAIN); + lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), LV_ALIGN_BOTTOM_MID, 0, -5); #endif #if !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) lv_obj_t *zenlogo_icon; - zenlogo_icon = lv_img_create(screen, NULL); + zenlogo_icon = lv_img_create(screen); lv_img_set_src(zenlogo_icon, &zenlogo); - lv_obj_align(zenlogo_icon, NULL, LV_ALIGN_IN_BOTTOM_MID, 2, -5); + lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 2, -5); #endif - // lv_task_handler(); - lv_refr_now(NULL); - // display_blanking_off(display_dev); - return screen; } diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.c b/app/boards/arm/corneish_zen/widgets/battery_status.c index 7dfd51e8..9a2189d1 100644 --- a/app/boards/arm/corneish_zen/widgets/battery_status.c +++ b/app/boards/arm/corneish_zen/widgets/battery_status.c @@ -5,15 +5,14 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include "battery_status.h" -#include #include #include #include @@ -84,7 +83,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); widget_battery_status_init(); diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.h b/app/boards/arm/corneish_zen/widgets/battery_status.h index 21a4efb8..d493c582 100644 --- a/app/boards/arm/corneish_zen/widgets/battery_status.h +++ b/app/boards/arm/corneish_zen/widgets/battery_status.h @@ -9,7 +9,7 @@ #include -#include +#include struct zmk_widget_battery_status { sys_snode_t node; @@ -17,4 +17,4 @@ struct zmk_widget_battery_status { }; int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.c b/app/boards/arm/corneish_zen/widgets/layer_status.c index a309a787..3dc33613 100644 --- a/app/boards/arm/corneish_zen/widgets/layer_status.c +++ b/app/boards/arm/corneish_zen/widgets/layer_status.c @@ -5,8 +5,8 @@ * */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -54,7 +54,7 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, laye ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); @@ -64,4 +64,4 @@ int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_ lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget) { return widget->obj; -} \ No newline at end of file +} diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.h b/app/boards/arm/corneish_zen/widgets/layer_status.h index 04f32faa..c03433c5 100644 --- a/app/boards/arm/corneish_zen/widgets/layer_status.h +++ b/app/boards/arm/corneish_zen/widgets/layer_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_layer_status { sys_snode_t node; @@ -16,4 +16,4 @@ struct zmk_widget_layer_status { }; int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/output_status.c b/app/boards/arm/corneish_zen/widgets/output_status.c index bd69bbb1..ad0c2b1a 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.c +++ b/app/boards/arm/corneish_zen/widgets/output_status.c @@ -5,10 +5,10 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -123,9 +123,7 @@ ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/arm/corneish_zen/widgets/output_status.h b/app/boards/arm/corneish_zen/widgets/output_status.h index c171e2bb..ba92f893 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.h +++ b/app/boards/arm/corneish_zen/widgets/output_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_output_status { sys_snode_t node; @@ -16,4 +16,4 @@ struct zmk_widget_output_status { }; int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.c b/app/boards/arm/corneish_zen/widgets/peripheral_status.c index e18414be..39b62fde 100644 --- a/app/boards/arm/corneish_zen/widgets/peripheral_status.c +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.c @@ -5,10 +5,10 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -48,7 +48,7 @@ ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.h b/app/boards/arm/corneish_zen/widgets/peripheral_status.h index 59675763..82fe2105 100644 --- a/app/boards/arm/corneish_zen/widgets/peripheral_status.h +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_peripheral_status { sys_snode_t node; @@ -17,4 +17,4 @@ struct zmk_widget_peripheral_status { int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget); diff --git a/app/boards/shields/corne/Kconfig.defconfig b/app/boards/shields/corne/Kconfig.defconfig index 9160555c..acf542d7 100644 --- a/app/boards/shields/corne/Kconfig.defconfig +++ b/app/boards/shields/corne/Kconfig.defconfig @@ -28,17 +28,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index 1e93762c..e507f2c6 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 64eb32b8..4664debf 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/knob_goblin/Kconfig.defconfig b/app/boards/shields/knob_goblin/Kconfig.defconfig index 300fb4eb..d8d468ed 100644 --- a/app/boards/shields/knob_goblin/Kconfig.defconfig +++ b/app/boards/shields/knob_goblin/Kconfig.defconfig @@ -21,17 +21,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 0da8a18d..cdb57b6b 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index a4295d1e..36306757 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -32,17 +32,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index a5e6fbe8..97cecce1 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index 57ae5ef6..56eef359 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 7bf40b8b..28f8c811 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 9f491564..07e71826 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -21,17 +21,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index a1683f3a..d5e8cbeb 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -25,17 +25,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index a699a813..22c5f647 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_NICE_VIEW config ZMK_DISPLAY - select LVGL_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_26 if ZMK_DISPLAY @@ -17,11 +17,11 @@ config LS0XX config ZMK_WIDGET_WPM_STATUS default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # ZMK_DISPLAY diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf index 2c1d6c71..ff57c07c 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -1,5 +1,5 @@ # Enable nice!view CONFIG_ZMK_DISPLAY=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_26=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index 24a8e5cc..fa02421a 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 69dac3f2..1c1c5604 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 5a1eeb13..29de8d7e 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index bbaef0ff..3c8d5f58 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index 51fbc28c..4a2b8973 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/tidbit/Kconfig.defconfig b/app/boards/shields/tidbit/Kconfig.defconfig index 013a0a7c..e3655a9e 100644 --- a/app/boards/shields/tidbit/Kconfig.defconfig +++ b/app/boards/shields/tidbit/Kconfig.defconfig @@ -22,17 +22,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 897184f6..70029f0b 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index 76bfcbd4..77648afd 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index c0753358..32be2a27 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -6,8 +6,9 @@ menuconfig ZMK_DISPLAY default n select DISPLAY select LVGL - select LVGL_THEMES - select LVGL_THEME_MONO + select LV_THEMES + select LV_THEME_MONO + select LV_CONF_MINIMAL if ZMK_DISPLAY @@ -15,17 +16,26 @@ config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" default y if SSD1306 -choice LVGL_TXT_ENC - default LVGL_TXT_ENC_UTF8 +choice LV_TXT_ENC + default LV_TXT_ENC_UTF8 endchoice +config LV_MEM_CUSTOM + default y + +config LV_Z_MEM_POOL_MIN_SIZE + default 32 + +config LV_Z_MEM_POOL_MAX_SIZE + default 8192 + choice ZMK_DISPLAY_STATUS_SCREEN prompt "Default status screen for displays" config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN bool "Built in status screen" - select LVGL_OBJ_LABEL + select LV_OBJ_LABEL config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM bool "Custom status screen" @@ -57,24 +67,105 @@ endif # ZMK_DISPLAY_WORK_QUEUE_DEDICATED if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN -config LVGL_FONT_MONTSERRAT_16 +config LV_FONT_MONTSERRAT_16 default y -choice LVGL_THEME_DEFAULT_FONT_NORMAL - default LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_16 +choice LV_FONT_DEFAULT + default LV_FONT_DEFAULT_MONTSERRAT_16 endchoice -config LVGL_FONT_MONTSERRAT_12 +config LV_FONT_MONTSERRAT_12 default y - -choice LVGL_THEME_DEFAULT_FONT_SMALL - default LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_12 - -endchoice endif # ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN +choice ZMK_LV_FONT_DEFAULT_SMALL + prompt "Select theme default small font" + default ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12 + help + Select theme default small font + + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8 + bool "Montserrat 8" + select LV_FONT_MONTSERRAT_8 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12 + bool "Montserrat 12" + select LV_FONT_MONTSERRAT_12 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14 + bool "Montserrat 14" + select LV_FONT_MONTSERRAT_14 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16 + bool "Montserrat 16" + select LV_FONT_MONTSERRAT_16 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18 + bool "Montserrat 18" + select LV_FONT_MONTSERRAT_18 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20 + bool "Montserrat 20" + select LV_FONT_MONTSERRAT_20 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22 + bool "Montserrat 22" + select LV_FONT_MONTSERRAT_22 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24 + bool "Montserrat 24" + select LV_FONT_MONTSERRAT_24 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26 + bool "Montserrat 26" + select LV_FONT_MONTSERRAT_26 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28 + bool "Montserrat 28" + select LV_FONT_MONTSERRAT_28 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30 + bool "Montserrat 30" + select LV_FONT_MONTSERRAT_30 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32 + bool "Montserrat 32" + select LV_FONT_MONTSERRAT_32 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34 + bool "Montserrat 34" + select LV_FONT_MONTSERRAT_34 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36 + bool "Montserrat 36" + select LV_FONT_MONTSERRAT_36 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38 + bool "Montserrat 38" + select LV_FONT_MONTSERRAT_38 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40 + bool "Montserrat 40" + select LV_FONT_MONTSERRAT_40 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42 + bool "Montserrat 42" + select LV_FONT_MONTSERRAT_42 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44 + bool "Montserrat 44" + select LV_FONT_MONTSERRAT_44 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46 + bool "Montserrat 46" + select LV_FONT_MONTSERRAT_46 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48 + bool "Montserrat 48" + select LV_FONT_MONTSERRAT_48 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX + bool "Montserrat 12 sub-pixel" + select LV_FONT_MONTSERRAT_12_SUBPX + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED + bool "Montserrat 28 compressed" + select LV_FONT_MONTSERRAT_28_COMPRESSED + config ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW + bool "Dejavu 16 Persian, Hebrew, Arabic letters" + select LV_FONT_DEJAVU_16_PERSIAN_HEBREW + config ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK + bool "Simsun 16 CJK" + select LV_FONT_SIMSUN_16_CJK + config ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8 + bool "UNSCII 8 (Perfect monospace font)" + select LV_FONT_UNSCII_8 + config ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16 + bool "UNSCII 16 (Perfect monospace font)" + select LV_FONT_UNSCII_16 +endchoice + rsource "widgets/Kconfig" endif diff --git a/app/src/display/main.c b/app/src/display/main.c index 8a70cef2..3fb4e8f6 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -15,11 +15,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include +#include "theme.h" + #include #include #include -#define ZMK_DISPLAY_NAME CONFIG_LVGL_DISPLAY_DEV_NAME +#define ZMK_DISPLAY_NAME CONFIG_LV_Z_DISPLAY_DEV_NAME static const struct device *display; static bool initialized = false; @@ -50,16 +52,21 @@ struct k_work_q *zmk_display_work_q() { #endif } -void display_timer_cb() { - lv_tick_inc(TICK_MS); - k_work_submit_to_queue(zmk_display_work_q(), &display_tick_work); -} - -void blank_display_cb(struct k_work *work) { display_blanking_on(display); } - -void unblank_display_cb(struct k_work *work) { display_blanking_off(display); } +void display_timer_cb() { k_work_submit_to_queue(zmk_display_work_q(), &display_tick_work); } K_TIMER_DEFINE(display_timer, display_timer_cb, NULL); + +void unblank_display_cb(struct k_work *work) { + display_blanking_off(display); + k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); +} + +#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) + +void blank_display_cb(struct k_work *work) { + k_timer_stop(&display_timer); + display_blanking_on(display); +} K_WORK_DEFINE(blank_display_work, blank_display_cb); K_WORK_DEFINE(unblank_display_work, unblank_display_cb); @@ -69,26 +76,30 @@ static void start_display_updates() { } k_work_submit_to_queue(zmk_display_work_q(), &unblank_display_work); - - k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); } -#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) - static void stop_display_updates() { if (display == NULL) { return; } k_work_submit_to_queue(zmk_display_work_q(), &blank_display_work); - - k_timer_stop(&display_timer); } #endif int zmk_display_is_initialized() { return initialized; } +static void initialize_theme() { +#if IS_ENABLED(CONFIG_LV_USE_THEME_MONO) + lv_disp_t *disp = lv_disp_get_default(); + lv_theme_t *theme = lv_theme_mono_init(disp, false, CONFIG_LV_FONT_DEFAULT); + theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; + + disp->theme = theme; +#endif // CONFIG_LV_USE_THEME_MONO +} + void initialize_display(struct k_work *work) { LOG_DBG(""); @@ -100,6 +111,8 @@ void initialize_display(struct k_work *work) { initialized = true; + initialize_theme(); + screen = zmk_display_status_screen(); if (screen == NULL) { @@ -109,7 +122,7 @@ void initialize_display(struct k_work *work) { lv_scr_load(screen); - start_display_updates(); + unblank_display_cb(work); } K_WORK_DEFINE(init_work, initialize_display); diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 0fe7212d..6b58c301 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -34,42 +34,43 @@ static struct zmk_widget_layer_status layer_status_widget; static struct zmk_widget_wpm_status wpm_status_widget; #endif +lv_style_t global_style; + lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - screen = lv_obj_create(NULL, NULL); + lv_style_init(&global_style); + lv_style_set_text_font(&global_style, &lv_font_montserrat_12); + + screen = lv_obj_create(NULL); + lv_obj_add_style(screen, &global_style, LV_PART_MAIN); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); - lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), NULL, LV_ALIGN_IN_TOP_RIGHT, - 0, 0); + lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), LV_ALIGN_TOP_RIGHT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_OUTPUT_STATUS) zmk_widget_output_status_init(&output_status_widget, screen); - lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), NULL, LV_ALIGN_IN_TOP_LEFT, 0, - 0); + lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), LV_ALIGN_TOP_LEFT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS) zmk_widget_peripheral_status_init(&peripheral_status_widget, screen); - lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), NULL, - LV_ALIGN_IN_TOP_LEFT, 0, 0); + lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), LV_ALIGN_TOP_LEFT, 0, + 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_LAYER_STATUS) zmk_widget_layer_status_init(&layer_status_widget, screen); - lv_obj_set_style_local_text_font(zmk_widget_layer_status_obj(&layer_status_widget), - LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, - lv_theme_get_font_small()); - lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), NULL, LV_ALIGN_IN_BOTTOM_LEFT, - 0, 0); + lv_obj_set_style_text_font(zmk_widget_layer_status_obj(&layer_status_widget), + lv_theme_get_font_small(screen), LV_PART_MAIN); + lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), LV_ALIGN_BOTTOM_LEFT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_WPM_STATUS) zmk_widget_wpm_status_init(&wpm_status_widget, screen); - lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, - 0); + lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), LV_ALIGN_BOTTOM_RIGHT, 0, 0); #endif return screen; } diff --git a/app/src/display/theme.c b/app/src/display/theme.c new file mode 100644 index 00000000..3ad41dac --- /dev/null +++ b/app/src/display/theme.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +#if defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_10) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_10 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_14 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_16 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_18 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_20 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_22 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_24 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_26 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_30 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_32 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_34 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_36 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_38 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_40 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_42 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_44 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_46 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_48 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12_subpx +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28_compressed +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_simsun_16_cjk +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_16 +#endif + +void zmk_display_theme_init(lv_obj_t *obj) { + lv_theme_t *theme = lv_theme_get_from_obj(obj); + + if (theme == NULL) { + return; + } + + theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; +} \ No newline at end of file diff --git a/app/src/display/theme.h b/app/src/display/theme.h new file mode 100644 index 00000000..94bf7f39 --- /dev/null +++ b/app/src/display/theme.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include + +#if defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_10) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_10 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_14 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_16 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_18 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_20 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_22 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_24 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_26 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_30 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_32 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_34 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_36 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_38 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_40 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_42 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_44 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_46 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_48 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12_subpx +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28_compressed +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_simsun_16_cjk +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_16 +#endif diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 847a47ab..5ef32d20 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -7,13 +7,13 @@ config ZMK_WIDGET_LAYER_STATUS bool "Widget for highest, active layer using small icons" default y depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_BATTERY_STATUS bool "Widget for battery charge information, using small icons" depends on BT default y if BT - select LVGL_USE_LABEL + select LV_USE_LABEL if ZMK_WIDGET_BATTERY_STATUS @@ -26,18 +26,18 @@ config ZMK_WIDGET_OUTPUT_STATUS bool "Widget for keyboard output status icons" depends on BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) default y if BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_PERIPHERAL_STATUS bool "Widget for split peripheral status icons" depends on BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL default y if BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_WPM_STATUS bool "Widget for displaying typed words per minute" depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL select ZMK_WPM endmenu diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 71b243d3..3480101d 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -55,7 +55,6 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat } #endif lv_label_set_text(label, text); - lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); } void battery_status_update_cb(struct battery_status_state state) { @@ -81,9 +80,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 43, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index a4a7be58..8dc0061c 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -54,9 +54,7 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, laye ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 8bbe1a7e..135770a6 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -81,9 +81,7 @@ ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/peripheral_status.c b/app/src/display/widgets/peripheral_status.c index baf48f58..d0c33f20 100644 --- a/app/src/display/widgets/peripheral_status.c +++ b/app/src/display/widgets/peripheral_status.c @@ -45,9 +45,7 @@ ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/wpm_status.c b/app/src/display/widgets/wpm_status.c index a2c6a287..f3d06d65 100644 --- a/app/src/display/widgets/wpm_status.c +++ b/app/src/display/widgets/wpm_status.c @@ -31,7 +31,7 @@ void set_wpm_symbol(lv_obj_t *label, struct wpm_status_state state) { snprintf(text, sizeof(text), "%i", state.wpm); lv_label_set_text(label, text); - lv_obj_align(label, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); + lv_obj_align(label, LV_ALIGN_BOTTOM_RIGHT, 0, 0); } void wpm_status_update_cb(struct wpm_status_state state) { @@ -44,10 +44,8 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_wpm_status, struct wpm_status_state, wpm_stat ZMK_SUBSCRIPTION(widget_wpm_status, zmk_wpm_state_changed); int zmk_widget_wpm_status_init(struct zmk_widget_wpm_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - lv_label_set_align(widget->obj, LV_LABEL_ALIGN_RIGHT); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); + lv_obj_align(widget->obj, LV_ALIGN_RIGHT_MID, 0, 0); sys_slist_append(&widgets, &widget->node); From 243a227ff96e0cc25d4ae362efb30c769b4bc329 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:35:40 -0400 Subject: [PATCH 030/134] refactor: Move to LISTIFY/DT_FOREACH_PROP_ELEM macros. --- app/drivers/kscan/kscan_gpio_demux.c | 6 +++--- app/drivers/kscan/kscan_gpio_direct.c | 4 ++-- app/drivers/kscan/kscan_gpio_matrix.c | 8 ++++---- app/src/behaviors/behavior_caps_word.c | 4 ++-- app/src/behaviors/behavior_macro.c | 4 ++-- app/src/behaviors/behavior_tap_dance.c | 4 ++-- app/src/conditional_layer.c | 5 ++--- app/src/keymap.c | 8 ++++---- app/src/matrix_transform.c | 4 ++-- app/src/sensors.c | 17 ++++++++++------- 10 files changed, 33 insertions(+), 31 deletions(-) diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 6e3d9e79..ff2c6c69 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -28,7 +28,7 @@ struct kscan_gpio_item_config { .label = DT_INST_GPIO_LABEL_BY_IDX(n, prop, idx), \ .pin = DT_INST_GPIO_PIN_BY_IDX(n, prop, idx), \ .flags = DT_INST_GPIO_FLAGS_BY_IDX(n, prop, idx), \ - }, + } // Define row and col cfg #define _KSCAN_GPIO_INPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, input_gpios, idx) @@ -240,8 +240,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {UTIL_LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, n)}, \ - .cols = {UTIL_LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, n)}, \ + .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (,), n)}, \ + .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (,), n)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index ee7b13f6..1e0576c5 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -41,7 +41,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define INST_INPUTS_LEN(n) DT_INST_PROP_LEN(n, input_gpios) #define KSCAN_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) struct kscan_direct_irq_callback { const struct device *dev; @@ -327,7 +327,7 @@ static const struct kscan_driver_api kscan_direct_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ - UTIL_LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, n)}; \ + LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (,), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 71fcad29..de65fd49 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -50,9 +50,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, pollcode, intcode) #define KSCAN_GPIO_ROW_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) #define KSCAN_GPIO_COL_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) enum kscan_diode_direction { KSCAN_ROW2COL, @@ -433,10 +433,10 @@ static const struct kscan_driver_api kscan_matrix_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ - UTIL_LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, n)}; \ + LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (,), n)}; \ \ static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ - UTIL_LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, n)}; \ + LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (,), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ \ diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 3842a31f..7a9612b3 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -168,7 +168,7 @@ static int behavior_caps_word_init(const struct device *dev) { #define PARSE_BREAK(i) \ {.page = ZMK_HID_USAGE_PAGE(i), \ .id = ZMK_HID_USAGE_ID(i), \ - .implicit_modifiers = SELECT_MODS(i)}, + .implicit_modifiers = SELECT_MODS(i)} #define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i)) @@ -177,7 +177,7 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ - .continuations = {UTIL_LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, n)}, \ + .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (,), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, NULL, &behavior_caps_word_data_##n, \ diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index 46fdde3c..5b215b93 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -166,10 +166,10 @@ static const struct behavior_driver_api behavior_macro_driver_api = { .binding_released = on_macro_binding_released, }; -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)), +#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) #define TRANSFORMED_BEHAVIORS(n) \ - {UTIL_LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, n)}, + {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (,), n)}, #define MACRO_INST(n) \ static struct behavior_macro_state behavior_macro_state_##n = {}; \ diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index 3bad2901..6d78cb3e 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -237,10 +237,10 @@ static int behavior_tap_dance_init(const struct device *dev) { return 0; } -#define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node), +#define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node) #define TRANSFORMED_BINDINGS(node) \ - { UTIL_LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, DT_DRV_INST(node)) } + { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (,), DT_DRV_INST(node)) } #define KP_INST(n) \ static struct zmk_behavior_binding \ diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index 1728a7f4..572652ff 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -33,13 +33,12 @@ struct conditional_layer_cfg { int8_t then_layer; }; -#define IF_LAYER_BIT(i, n) BIT(DT_PROP_BY_IDX(n, if_layers, i)) | +#define IF_LAYER_BIT(node_id, prop, idx) BIT(DT_PROP_BY_IDX(node_id, prop, idx)) | // Evaluates to conditional_layer_cfg struct initializer. #define CONDITIONAL_LAYER_DECL(n) \ { \ - /* TODO: Replace UTIL_LISTIFY with DT_FOREACH_PROP_ELEM after Zepyhr 2.6.0 upgrade. */ \ - .if_layers_state_mask = UTIL_LISTIFY(DT_PROP_LEN(n, if_layers), IF_LAYER_BIT, n) 0, \ + .if_layers_state_mask = DT_FOREACH_PROP_ELEM(n, if_layers, IF_LAYER_BIT) 0, \ .then_layer = DT_PROP(n, then_layer), \ }, diff --git a/app/src/keymap.c b/app/src/keymap.c index e586316f..b00d0fba 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -34,10 +34,10 @@ static uint8_t _zmk_keymap_layer_default = 0; #define ZMK_KEYMAP_NODE DT_DRV_INST(0) #define ZMK_KEYMAP_LAYERS_LEN (DT_INST_FOREACH_CHILD(0, LAYER_CHILD_LEN) 0) -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst), +#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) #define TRANSFORMED_LAYER(node) \ - {UTIL_LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, node)}, + {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (,), node)}, #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ @@ -47,12 +47,12 @@ static uint8_t _zmk_keymap_layer_default = 0; (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param2), (0), \ (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param2))), \ - }, + } #define SENSOR_LAYER(node) \ COND_CODE_1( \ DT_NODE_HAS_PROP(node, sensor_bindings), \ - ({UTIL_LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, node)}), \ + ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (,), node)}), \ ({})), #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index 8f54f312..e7c6e95f 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -13,9 +13,9 @@ #define _TRANSFORM_ENTRY(i, _) \ [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ - KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i, + KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i -static uint32_t transform[] = {UTIL_LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, 0)}; +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (,), 0)}; #endif diff --git a/app/src/sensors.c b/app/src/sensors.c index dd5f4267..184061ac 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -25,12 +25,15 @@ struct sensors_data_item { }; #define _SENSOR_ITEM(node) \ - {.dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION}}, -#define SENSOR_ITEM(idx, _) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ()) + { \ + .dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION } \ + } -static struct sensors_data_item sensors[] = {UTIL_LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, 0)}; +#define SENSOR_ITEM(idx, _node) \ + COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ + (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ({})) + +static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; static void zmk_sensors_trigger_handler(const struct device *dev, struct sensor_trigger *trigger) { int err; @@ -71,10 +74,10 @@ static int zmk_sensors_init(const struct device *_arg) { int local_index = 0; int absolute_index = 0; - UTIL_LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, 0) + LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, (), 0) return 0; } SYS_INIT(zmk_sensors_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); -#endif /* ZMK_KEYMAP_HAS_SENSORS */ \ No newline at end of file +#endif /* ZMK_KEYMAP_HAS_SENSORS */ From d513dc1766edf52a22d78da0e73d5a09670059e9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:36:13 -0400 Subject: [PATCH 031/134] refactor: Move to new PM API. --- app/src/activity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/activity.c b/app/src/activity.c index 5a1e2385..029908c0 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -70,7 +70,7 @@ void activity_work_handler(struct k_work *work) { if (inactive_time > MAX_SLEEP_MS && !is_usb_power_present()) { // Put devices in suspend power mode before sleeping set_state(ZMK_ACTIVITY_SLEEP); - pm_power_state_force(0U, (struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); + pm_state_force(0U, &(struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { From 4f2f9db1d474dc8754780b27243b1a61acbdad42 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:36:53 -0400 Subject: [PATCH 032/134] refactor(ble): New callback API for pairing complete. --- app/src/ble.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/ble.c b/app/src/ble.c index b10aa20b..4d2e4603 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -528,7 +528,6 @@ static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { static struct bt_conn_auth_cb zmk_ble_auth_cb_display = { .pairing_accept = auth_pairing_accept, - .pairing_complete = auth_pairing_complete, // .passkey_display = auth_passkey_display, #if IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) @@ -537,6 +536,10 @@ static struct bt_conn_auth_cb zmk_ble_auth_cb_display = { .cancel = auth_cancel, }; +static struct bt_conn_auth_info_cb zmk_ble_auth_info_cb_display = { + .pairing_complete = auth_pairing_complete, +}; + static void zmk_ble_ready(int err) { LOG_DBG("ready? %d", err); if (err) { @@ -589,6 +592,7 @@ static int zmk_ble_init(const struct device *_arg) { bt_conn_cb_register(&conn_callbacks); bt_conn_auth_cb_register(&zmk_ble_auth_cb_display); + bt_conn_auth_info_cb_register(&zmk_ble_auth_info_cb_display); zmk_ble_ready(0); From 35a1c5a3d44b92c050d28c0aca3d1cb9c7e53695 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:37:16 -0400 Subject: [PATCH 033/134] refactor(behaviors): Rename `reset` behavior. * Upstream now has a node w/ label `reset` on many boards, so renaming our reset behavior node label to `sys_reset`. --- app/boards/arm/bt60/bt60_v1.keymap | 10 +++++----- app/boards/arm/bt60/bt60_v1_hs.keymap | 2 +- app/boards/arm/planck/planck_rev6.keymap | 2 +- app/boards/arm/s40nc/s40nc.keymap | 2 +- app/boards/shields/bfo9000/bfo9000.keymap | 2 +- .../shields/boardsource3x4/boardsource3x4.keymap | 2 +- app/boards/shields/contra/contra.keymap | 2 +- app/boards/shields/cradio/cradio.keymap | 2 +- app/boards/shields/crbn/crbn.keymap | 2 +- app/boards/shields/eek/eek.keymap | 2 +- app/boards/shields/ergodash/ergodash.keymap | 4 ++-- .../shields/eternal_keypad/eternal_keypad.keymap | 4 ++-- .../shields/eternal_keypad/eternal_keypad_lefty.keymap | 4 ++-- app/boards/shields/jian/jian.keymap | 2 +- app/boards/shields/jiran/jiran.keymap | 2 +- app/boards/shields/jorne/jorne.keymap | 2 +- app/boards/shields/leeloo/leeloo.keymap | 2 +- app/boards/shields/lotus58/lotus58.keymap | 6 +++--- app/boards/shields/m60/m60.keymap | 2 +- app/boards/shields/murphpad/murphpad.keymap | 2 +- app/boards/shields/qaz/qaz.keymap | 2 +- app/boards/shields/redox/redox.keymap | 2 +- app/boards/shields/reviung41/reviung41.keymap | 2 +- .../shields/settings_reset/settings_reset.keymap | 2 +- app/boards/shields/tg4x/tg4x.keymap | 2 +- app/boards/shields/tidbit/tidbit.keymap | 2 +- app/boards/shields/tidbit/tidbit_19key.keymap | 2 +- app/boards/shields/waterfowl/waterfowl.keymap | 8 ++++---- app/boards/shields/zodiark/zodiark.keymap | 2 +- app/dts/behaviors/reset.dtsi | 4 ++-- docs/blog/2021-01-27-zmk-sotf-4.md | 2 +- docs/docs/behaviors/reset.md | 6 +++--- docs/src/data/keymap-upgrade.js | 1 + 33 files changed, 48 insertions(+), 47 deletions(-) diff --git a/app/boards/arm/bt60/bt60_v1.keymap b/app/boards/arm/bt60/bt60_v1.keymap index 0985a605..b42f3f3d 100644 --- a/app/boards/arm/bt60/bt60_v1.keymap +++ b/app/boards/arm/bt60/bt60_v1.keymap @@ -56,7 +56,7 @@ // ------------------------------------------------------------------------------------------ bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans @@ -84,7 +84,7 @@ raise { bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL - &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &reset + &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans &trans &trans &trans &bootloader &trans &trans &trans @@ -112,7 +112,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR @@ -140,7 +140,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR @@ -168,7 +168,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR diff --git a/app/boards/arm/bt60/bt60_v1_hs.keymap b/app/boards/arm/bt60/bt60_v1_hs.keymap index 6e62e1bb..167460c6 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.keymap +++ b/app/boards/arm/bt60/bt60_v1_hs.keymap @@ -26,7 +26,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR diff --git a/app/boards/arm/planck/planck_rev6.keymap b/app/boards/arm/planck/planck_rev6.keymap index bbfb770e..7e4f6732 100644 --- a/app/boards/arm/planck/planck_rev6.keymap +++ b/app/boards/arm/planck/planck_rev6.keymap @@ -39,7 +39,7 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP >; }; }; diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index d7f349d9..c43bc671 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -50,7 +50,7 @@ &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP &bt BT_SEL 0 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &kp K_LOCK &bt BT_SEL 1 &out OUT_USB &kp CAPS &kp KP_NUM &kp SLCK &trans &trans &kp COMMA &kp DOT &kp K_VOL_UP &kp K_MUTE - &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP + &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &sys_reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP >; }; }; diff --git a/app/boards/shields/bfo9000/bfo9000.keymap b/app/boards/shields/bfo9000/bfo9000.keymap index fe904931..22186a1d 100644 --- a/app/boards/shields/bfo9000/bfo9000.keymap +++ b/app/boards/shields/bfo9000/bfo9000.keymap @@ -46,7 +46,7 @@ &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans - &reset &bootloader &trans &trans &trans &trans &trans &trans &trans &reset &bootloader &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans >; diff --git a/app/boards/shields/boardsource3x4/boardsource3x4.keymap b/app/boards/shields/boardsource3x4/boardsource3x4.keymap index add7efa0..c47126ab 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.keymap +++ b/app/boards/shields/boardsource3x4/boardsource3x4.keymap @@ -32,7 +32,7 @@ lower_layer { bindings = < - &bt BT_CLR &none &reset &bootloader + &bt BT_CLR &none &sys_reset &bootloader &trans &bt BT_SEL 3 &bt BT_SEL 4 &none &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 >; diff --git a/app/boards/shields/contra/contra.keymap b/app/boards/shields/contra/contra.keymap index e24b5028..77b431b6 100644 --- a/app/boards/shields/contra/contra.keymap +++ b/app/boards/shields/contra/contra.keymap @@ -30,7 +30,7 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &kp TAB &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp PG_UP &kp LBKT &kp RBKT &kp BSLH &kp LSHFT &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp EQUAL &kp PG_DN &kp HOME &kp END &kp ENTER - &kp LCTRL &kp LGUI &kp LALT &reset &to DEFAULT &kp SPACE &trans &mo BT_CTRL &kp LEFT &kp RIGHT &kp UP &kp DOWN + &kp LCTRL &kp LGUI &kp LALT &sys_reset &to DEFAULT &kp SPACE &trans &mo BT_CTRL &kp LEFT &kp RIGHT &kp UP &kp DOWN >; }; diff --git a/app/boards/shields/cradio/cradio.keymap b/app/boards/shields/cradio/cradio.keymap index 587bc7aa..3f6670da 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -88,7 +88,7 @@ bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │ - &reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &reset + &sys_reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &sys_reset //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ //│BOOTLOADER│ │ │ │PROFILE 1 │ │ │ │ │ │BOOTLOADER│ &bootloader &trans &trans &trans &bt BT_SEL 1 &trans &trans &trans &trans &bootloader diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index 9423e1af..b967e5e2 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -52,7 +52,7 @@ control { bindings = < - &reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index 439c90aa..d250cb01 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -49,7 +49,7 @@ &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &out OUT_USB &out OUT_BLE &none &kp EQUAL &kp MINUS &kp CAPS &kp F5 &kp F6 &kp F7 &kp F8 &kp LBKT &kp RBKT &none &kp GRAVE &kp BSLH &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &none &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &reset &none &trans + &kp LCTRL &kp LGUI &kp LALT &sys_reset &none &trans >; }; }; diff --git a/app/boards/shields/ergodash/ergodash.keymap b/app/boards/shields/ergodash/ergodash.keymap index a85c58a6..e384e504 100644 --- a/app/boards/shields/ergodash/ergodash.keymap +++ b/app/boards/shields/ergodash/ergodash.keymap @@ -56,7 +56,7 @@ &kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &none &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none -&trans &bootloader &reset &none &none &none &none &none &none &none &none &none &none &trans +&trans &bootloader &sys_reset &none &none &none &none &none &none &none &none &none &none &trans &trans &none &none &trans &trans &none &trans &trans &none &trans &none &none &none &trans >; }; @@ -77,7 +77,7 @@ &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none -&trans &none &none &none &none &none &none &none &none &none &none &bootloader &reset &trans +&trans &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &trans &trans &none &none &trans &trans &none &trans &trans &none &trans &none &none &none &trans >; }; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.keymap b/app/boards/shields/eternal_keypad/eternal_keypad.keymap index 0f3eda7b..da06d274 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad.keymap @@ -38,7 +38,7 @@ &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD &bt BT_CLR &trans &kp LEFT &kp DOWN &kp RIGHT &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD - &reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR + &sys_reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR &bootloader &trans &trans &trans &trans &trans >; }; @@ -48,7 +48,7 @@ &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 &bt BT_CLR &kp BSPC &kp SEMI &kp L &kp K &kp J &kp H &kp F8 - &reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 + &sys_reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 &bootloader &trans &trans &trans &trans &kp F10 >; }; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap index e1bddbad..81710032 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap @@ -38,7 +38,7 @@ &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD &bt BT_CLR &trans &kp RIGHT &kp DOWN &kp RIGHT &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD - &reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR + &sys_reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR &bootloader &trans &trans &trans &trans &trans >; }; @@ -48,7 +48,7 @@ &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 &bt BT_CLR &kp BSPC &kp SEMI &kp L &kp K &kp J &kp H &kp F8 - &reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 + &sys_reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 &bootloader &trans &trans &trans &trans &kp F10 >; }; diff --git a/app/boards/shields/jian/jian.keymap b/app/boards/shields/jian/jian.keymap index 7b8dd676..e8f7dcc8 100644 --- a/app/boards/shields/jian/jian.keymap +++ b/app/boards/shields/jian/jian.keymap @@ -67,7 +67,7 @@ // | | | | | | | | | | | | | | // | | | | | | | | bindings = < - &reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &reset + &sys_reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &trans &none &trans &trans &none &trans diff --git a/app/boards/shields/jiran/jiran.keymap b/app/boards/shields/jiran/jiran.keymap index e6c073cc..6dcd733c 100644 --- a/app/boards/shields/jiran/jiran.keymap +++ b/app/boards/shields/jiran/jiran.keymap @@ -25,7 +25,7 @@ lower_layer { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp EQUAL - &kp F11 &kp TAB &bt BT_CLR &kp HOME &reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &reset &kp HOME &kp INS &kp DEL &kp F12 + &kp F11 &kp TAB &bt BT_CLR &kp HOME &sys_reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &sys_reset &kp HOME &kp INS &kp DEL &kp F12 &kp LSHIFT &bt BT_NXT &kp LEFT &kp UP &kp RIGHT &kp C_MUTE &kp C_MUTE &kp LEFT &kp UP &kp RIGHT &kp PSCRN &mt RSHIFT SLCK &kp LCTRL &bt BT_PRV &kp END &kp DOWN &kp PG_DN &kp C_VOL_DN &kp C_VOL_DN &kp PG_DN &kp DOWN &kp END &kp PAUSE_BREAK &mt RCTRL KP_NUM &trans &kp SPACE &kp LALT &mt RALT RET &kp BSPC &trans diff --git a/app/boards/shields/jorne/jorne.keymap b/app/boards/shields/jorne/jorne.keymap index 93c7691a..2a109fe8 100644 --- a/app/boards/shields/jorne/jorne.keymap +++ b/app/boards/shields/jorne/jorne.keymap @@ -64,7 +64,7 @@ // | | | | | | | | | | | | | | // | | | | | | | | bindings = < - &reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &reset + &sys_reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &trans &none &trans &trans &none &trans diff --git a/app/boards/shields/leeloo/leeloo.keymap b/app/boards/shields/leeloo/leeloo.keymap index 4104cc3a..fc3b25e0 100644 --- a/app/boards/shields/leeloo/leeloo.keymap +++ b/app/boards/shields/leeloo/leeloo.keymap @@ -45,7 +45,7 @@ raise_layer { bindings = < &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &reset &bootloader +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR &trans diff --git a/app/boards/shields/lotus58/lotus58.keymap b/app/boards/shields/lotus58/lotus58.keymap index cfe4342c..50249146 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -57,7 +57,7 @@ bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &fofunc &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp EQUAL &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT -&kp LSHFT &kp A &sleft &kp D &fright &kp G &reset &reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT +&kp LSHFT &kp A &sleft &kp D &fright &kp G &sys_reset &sys_reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp C_MUTE &kp C_PP &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RCTRL BSLH < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI >; @@ -91,8 +91,8 @@ // | | UNDO | CUT | COPY | PASTE | | | | | | |> | <|<| | |>|> | | | // | | | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &reset &bootloader -&trans &kp INS &kp PSCRN &kp K_CMENU &reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &sys_reset &bootloader +&trans &kp INS &kp PSCRN &kp K_CMENU &sys_reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans &trans &kp LALT &kp LCTRL &kp LSHFT &bootloader &kp CLCK &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC &trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &kp C_PP &kp C_PREV &kp C_NEXT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/m60/m60.keymap b/app/boards/shields/m60/m60.keymap index 6caa6370..aa656929 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.keymap @@ -32,7 +32,7 @@ fn_layer { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader -&trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &reset +&trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &sys_reset &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &none &none &trans &trans &none &none &none &none &none &none &none &none &none &none &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/murphpad/murphpad.keymap b/app/boards/shields/murphpad/murphpad.keymap index aec58878..2e8c6f6e 100644 --- a/app/boards/shields/murphpad/murphpad.keymap +++ b/app/boards/shields/murphpad/murphpad.keymap @@ -31,7 +31,7 @@ combo_reset { timeout-ms = ; key-positions = <1 3>; - bindings = <&reset>; + bindings = <&sys_reset>; }; combo_bootloader { timeout-ms = ; diff --git a/app/boards/shields/qaz/qaz.keymap b/app/boards/shields/qaz/qaz.keymap index a832860e..e6794e7b 100644 --- a/app/boards/shields/qaz/qaz.keymap +++ b/app/boards/shields/qaz/qaz.keymap @@ -42,7 +42,7 @@ &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans &trans &trans &trans &kp EQUAL &kp MINUS &kp DEL &none &none &none &none &none &none &none &kp DOT - &bootloader &reset &none &trans &trans &kp RET &trans &kp FSLH + &bootloader &sys_reset &none &trans &trans &kp RET &trans &kp FSLH >; }; diff --git a/app/boards/shields/redox/redox.keymap b/app/boards/shields/redox/redox.keymap index aed22c42..a45595ff 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -73,7 +73,7 @@ bindings = < &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &none &none &none &none &none &bootloader &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG - &trans &kp K_MUTE &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE &none &reset &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 + &trans &kp K_MUTE &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE &none &sys_reset &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp PSCRN &kp PSCRN &kp CLCK &none &none &trans &trans &trans &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans >; diff --git a/app/boards/shields/reviung41/reviung41.keymap b/app/boards/shields/reviung41/reviung41.keymap index d291ca8b..12f15ad4 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -64,7 +64,7 @@ bindings = < &rgb_ug RGB_BRI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_EFF &none &rgb_ug RGB_TOG &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_CLR &rgb_ug RGB_BRD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_EFR &none &none &none &none &none &none &none &none - &none &none &none &none &none &none &reset &none &none &none &none &none + &none &none &none &none &none &none &sys_reset &none &none &none &none &none &trans &trans &tog 3 &trans &trans >; }; diff --git a/app/boards/shields/settings_reset/settings_reset.keymap b/app/boards/shields/settings_reset/settings_reset.keymap index 05236445..0afdcc2b 100644 --- a/app/boards/shields/settings_reset/settings_reset.keymap +++ b/app/boards/shields/settings_reset/settings_reset.keymap @@ -13,7 +13,7 @@ default_layer { bindings = < - &reset + &sys_reset >; }; }; diff --git a/app/boards/shields/tg4x/tg4x.keymap b/app/boards/shields/tg4x/tg4x.keymap index 84ca3273..e68d0f92 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -45,7 +45,7 @@ bindings = < &kp PRINTSCREEN &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans -&trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &reset &trans +&trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &sys_reset &trans &trans &trans &trans &trans &trans &kp C_VOL_UP &kp C_VOL_DN &kp C_PP >; }; diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 7fa98af2..e8cb3789 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -36,7 +36,7 @@ func_layer { bindings = < - &none &reset &bootloader + &none &sys_reset &bootloader &out OUT_TOG &out OUT_USB &out OUT_BLE &none &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 6e158b03..8414a012 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -37,7 +37,7 @@ func_layer { bindings = < - &tog 0 &reset &bootloader + &tog 0 &sys_reset &bootloader &out OUT_TOG &out OUT_USB &out OUT_BLE &none &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index 9a1dabac..d208fe49 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -99,10 +99,10 @@ * `-----' `--------------------' `--------------------' `-----' */ bindings = < - &trans &trans &bt BT_CLR &trans &reset &reset &kp F7 &kp F8 &kp F9 &kp F11 - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 - &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 + &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 >; sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; diff --git a/app/boards/shields/zodiark/zodiark.keymap b/app/boards/shields/zodiark/zodiark.keymap index 21fdef10..0211f818 100644 --- a/app/boards/shields/zodiark/zodiark.keymap +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -56,7 +56,7 @@ // | | | | | | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &reset +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &sys_reset &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index cb246814..74a7163b 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -8,9 +8,9 @@ / { behaviors { - reset: behavior_reset { + sys_reset: behavior_reset { compatible = "zmk,behavior-reset"; - label = "RESET"; + label = "SYSRESET"; #binding-cells = <0>; }; diff --git a/docs/blog/2021-01-27-zmk-sotf-4.md b/docs/blog/2021-01-27-zmk-sotf-4.md index cd84da88..e7ff3232 100644 --- a/docs/blog/2021-01-27-zmk-sotf-4.md +++ b/docs/blog/2021-01-27-zmk-sotf-4.md @@ -164,7 +164,7 @@ For anyone looking to contribute, you can find the [ZMK Firmware project](https: Some items listed in the last coming soon section are still under active development. - A power profiler page for the website, to help users estimate their battery life for a given keyboard - [Nicell] -- Behavior "locality", allowing improved split usage for things like `&reset`, and controlling external power and RGB underglow for both sides - [petejohanson] +- Behavior "locality", allowing improved split usage for things like `&sys_reset`, and controlling external power and RGB underglow for both sides - [petejohanson] - More modular approach to external boards/shields, custom code, user keymaps, etc. - More shields and boards diff --git a/docs/docs/behaviors/reset.md b/docs/docs/behaviors/reset.md index c06a13b7..0fc62b2f 100644 --- a/docs/docs/behaviors/reset.md +++ b/docs/docs/behaviors/reset.md @@ -17,13 +17,13 @@ to the device ### Behavior Binding -- Reference: `&reset` +- Reference: `&sys_reset` - Parameters: None Example: ``` -&reset +&sys_reset ``` ## Bootloader Reset @@ -44,7 +44,7 @@ Example: ## Split Keyboards -Both basic and bootloader reset behaviors are source-specific: This means that it affects the side of the keyboard that contains the behavior binding for split keyboards. For example if you press a key with the `&reset` binding on the left half of the keyboard, the left half will be reset. If you want to be able to reset both sides you can put the bindings on both sides of the keyboard and activate it on the side you would like to reset. +Both basic and bootloader reset behaviors are source-specific: This means that it affects the side of the keyboard that contains the behavior binding for split keyboards. For example if you press a key with the `&sys_reset` binding on the left half of the keyboard, the left half will be reset. If you want to be able to reset both sides you can put the bindings on both sides of the keyboard and activate it on the side you would like to reset. :::note Peripheral invocation The peripheral side of the keyboard has to be paired and connected to the central side in order to be able to activate these behaviors, even if it is possible to trigger the behavior using only keys on that side. This is because the key bindings are processed on the central side which would then instruct the peripheral side to reset. diff --git a/docs/src/data/keymap-upgrade.js b/docs/src/data/keymap-upgrade.js index 7936ca16..8e153828 100644 --- a/docs/src/data/keymap-upgrade.js +++ b/docs/src/data/keymap-upgrade.js @@ -81,4 +81,5 @@ export const Codes = { export const Behaviors = { cp: "kp", inc_dec_cp: "inc_dec_kp", + reset: "sys_reset", }; From 3a958c667fcbdf9940d115bbdf3f7fe61d821402 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 00:46:08 -0400 Subject: [PATCH 034/134] refactor: Move to `zephyr/` include paths. * Zephyr moved to properly namespaced headers, so major "rip the bandaid" commit to move us to those everywhere. --- app/boards/arm/mikoto/pinmux.c | 12 +++++----- app/boards/arm/nrfmicro/pinmux.c | 12 +++++----- app/boards/arm/puchi_ble/pinmux.c | 12 +++++----- app/drivers/display/il0323.c | 14 ++++++------ app/drivers/gpio/gpio_595.c | 14 ++++++------ app/drivers/gpio/gpio_mcp23017.c | 8 +++---- app/drivers/gpio/gpio_mcp23017.h | 2 +- app/drivers/kscan/debounce.h | 2 +- app/drivers/kscan/kscan_composite.c | 4 ++-- app/drivers/kscan/kscan_gpio_demux.c | 8 +++---- app/drivers/kscan/kscan_gpio_direct.c | 14 ++++++------ app/drivers/kscan/kscan_gpio_matrix.c | 16 +++++++------- app/drivers/kscan/kscan_mock.c | 6 ++--- app/drivers/sensor/battery/battery_common.c | 2 +- app/drivers/sensor/battery/battery_common.h | 2 +- app/drivers/sensor/battery/battery_nrf_vddh.c | 10 ++++----- .../sensor/battery/battery_voltage_divider.c | 6 ++--- app/drivers/sensor/ec11/ec11.c | 14 ++++++------ app/drivers/sensor/ec11/ec11.h | 6 ++--- app/drivers/sensor/ec11/ec11_trigger.c | 12 +++++----- app/include/drivers/behavior.h | 4 ++-- app/include/drivers/ext_power.h | 2 +- app/include/linker/zmk-events.ld | 2 +- app/include/zmk/behavior_queue.h | 2 +- app/include/zmk/ble/profile.h | 2 +- .../zmk/display/widgets/battery_status.h | 2 +- .../zmk/display/widgets/layer_status.h | 2 +- .../zmk/display/widgets/output_status.h | 2 +- .../zmk/display/widgets/peripheral_status.h | 2 +- app/include/zmk/display/widgets/wpm_status.h | 2 +- app/include/zmk/event_manager.h | 2 +- .../zmk/events/activity_state_changed.h | 2 +- .../zmk/events/battery_state_changed.h | 2 +- .../zmk/events/ble_active_profile_changed.h | 4 ++-- .../zmk/events/endpoint_selection_changed.h | 2 +- .../zmk/events/keycode_state_changed.h | 2 +- app/include/zmk/events/layer_state_changed.h | 2 +- .../zmk/events/modifiers_state_changed.h | 2 +- .../zmk/events/position_state_changed.h | 2 +- app/include/zmk/events/sensor_event.h | 4 ++-- .../events/split_peripheral_status_changed.h | 2 +- .../zmk/events/usb_conn_state_changed.h | 4 ++-- app/include/zmk/events/wpm_state_changed.h | 2 +- app/include/zmk/hid.h | 4 ++-- app/include/zmk/keys.h | 2 +- app/include/zmk/matrix.h | 2 +- app/include/zmk/split/bluetooth/central.h | 2 +- app/include/zmk/split/bluetooth/uuid.h | 2 +- app/include/zmk/usb.h | 4 ++-- app/src/activity.c | 14 ++++++------ app/src/backlight.c | 14 ++++++------ app/src/battery.c | 14 ++++++------ app/src/behavior_queue.c | 4 ++-- app/src/behaviors/behavior_backlight.c | 4 ++-- app/src/behaviors/behavior_bt.c | 10 +++++---- app/src/behaviors/behavior_caps_word.c | 4 ++-- app/src/behaviors/behavior_ext_power.c | 6 ++--- app/src/behaviors/behavior_hold_tap.c | 4 ++-- app/src/behaviors/behavior_key_press.c | 4 ++-- app/src/behaviors/behavior_key_repeat.c | 4 ++-- app/src/behaviors/behavior_key_toggle.c | 4 ++-- app/src/behaviors/behavior_macro.c | 4 ++-- app/src/behaviors/behavior_mod_morph.c | 4 ++-- app/src/behaviors/behavior_momentary_layer.c | 4 ++-- app/src/behaviors/behavior_none.c | 4 ++-- app/src/behaviors/behavior_outputs.c | 6 ++--- app/src/behaviors/behavior_reset.c | 7 +++--- app/src/behaviors/behavior_rgb_underglow.c | 4 ++-- .../behavior_sensor_rotate_key_press.c | 8 +++---- app/src/behaviors/behavior_sticky_key.c | 4 ++-- app/src/behaviors/behavior_tap_dance.c | 4 ++-- app/src/behaviors/behavior_to_layer.c | 4 ++-- app/src/behaviors/behavior_toggle_layer.c | 4 ++-- app/src/behaviors/behavior_transparent.c | 4 ++-- app/src/ble.c | 22 +++++++++---------- app/src/combo.c | 9 ++++---- app/src/conditional_layer.c | 6 ++--- app/src/display/main.c | 10 ++++----- app/src/display/status_screen.c | 2 +- app/src/display/widgets/battery_status.c | 6 ++--- app/src/display/widgets/layer_status.c | 4 ++-- app/src/display/widgets/output_status.c | 5 ++--- app/src/display/widgets/peripheral_status.c | 5 ++--- app/src/display/widgets/wpm_status.c | 2 +- app/src/endpoints.c | 6 ++--- app/src/event_manager.c | 4 ++-- app/src/events/activity_state_changed.c | 2 +- app/src/events/battery_state_changed.c | 2 +- app/src/events/ble_active_profile_changed.c | 2 +- app/src/events/endpoint_selection_changed.c | 2 +- app/src/events/keycode_state_changed.c | 2 +- app/src/events/layer_state_changed.c | 2 +- app/src/events/modifiers_state_changed.c | 2 +- app/src/events/position_state_changed.c | 2 +- app/src/events/sensor_event.c | 2 +- .../events/split_peripheral_status_changed.c | 2 +- app/src/events/usb_conn_state_changed.c | 2 +- app/src/events/wpm_state_changed.c | 2 +- app/src/ext_power_generic.c | 15 +++++++------ app/src/hid.c | 2 +- app/src/hid_listener.c | 2 +- app/src/hog.c | 10 ++++----- app/src/keymap.c | 10 ++++----- app/src/kscan.c | 10 ++++----- app/src/main.c | 10 ++++----- app/src/matrix_transform.c | 4 ++-- app/src/rgb_underglow.c | 12 +++++----- app/src/sensors.c | 8 +++---- app/src/split/bluetooth/central.c | 16 +++++++------- app/src/split/bluetooth/peripheral.c | 22 +++++++++---------- app/src/split/bluetooth/service.c | 10 ++++----- app/src/split/bluetooth/split_listener.c | 4 ++-- app/src/usb.c | 8 +++---- app/src/usb_hid.c | 8 +++---- app/src/wpm.c | 8 +++---- docs/docs/development/new-behavior.md | 4 ++-- 116 files changed, 332 insertions(+), 329 deletions(-) diff --git a/app/boards/arm/mikoto/pinmux.c b/app/boards/arm/mikoto/pinmux.c index 59a38fbf..6d7f46d1 100644 --- a/app/boards/arm/mikoto/pinmux.c +++ b/app/boards/arm/mikoto/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_mikoto_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c index ef5b5521..129530d4 100644 --- a/app/boards/arm/nrfmicro/pinmux.c +++ b/app/boards/arm/nrfmicro/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_nrfmicro_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/boards/arm/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c index 78cea314..0817b6e0 100644 --- a/app/boards/arm/puchi_ble/pinmux.c +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_puchi_ble_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index f6c9037e..ec6da159 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -7,16 +7,16 @@ #define DT_DRV_COMPAT gooddisplay_il0323 #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include "il0323_regs.h" -#include +#include LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); /** diff --git a/app/drivers/gpio/gpio_595.c b/app/drivers/gpio/gpio_595.c index 32016702..3d385844 100644 --- a/app/drivers/gpio/gpio_595.c +++ b/app/drivers/gpio/gpio_595.c @@ -12,15 +12,15 @@ #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include +#include LOG_MODULE_REGISTER(gpio_595); /** Configuration data */ diff --git a/app/drivers/gpio/gpio_mcp23017.c b/app/drivers/gpio/gpio_mcp23017.c index 1df14e6b..feafbd0a 100644 --- a/app/drivers/gpio/gpio_mcp23017.c +++ b/app/drivers/gpio/gpio_mcp23017.c @@ -12,9 +12,9 @@ #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -22,7 +22,7 @@ #include "gpio_mcp23017.h" #define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include +#include LOG_MODULE_REGISTER(gpio_mcp23017); /** diff --git a/app/drivers/gpio/gpio_mcp23017.h b/app/drivers/gpio/gpio_mcp23017.h index 026565cd..01908c0c 100644 --- a/app/drivers/gpio/gpio_mcp23017.h +++ b/app/drivers/gpio/gpio_mcp23017.h @@ -11,7 +11,7 @@ #ifndef ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ #define ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ -#include +#include #include #include diff --git a/app/drivers/kscan/debounce.h b/app/drivers/kscan/debounce.h index 9fa4531b..6e9faa66 100644 --- a/app/drivers/kscan/debounce.h +++ b/app/drivers/kscan/debounce.h @@ -8,7 +8,7 @@ #include #include -#include +#include #define DEBOUNCE_COUNTER_BITS 14 #define DEBOUNCE_COUNTER_MAX BIT_MASK(DEBOUNCE_COUNTER_BITS) diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index 35584d9c..e0cf47f9 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_kscan_composite -#include +#include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define MATRIX_NODE_ID DT_DRV_INST(0) diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index ff2c6c69..5fdd3a7e 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -6,10 +6,10 @@ #define DT_DRV_COMPAT zmk_kscan_gpio_demux -#include -#include -#include -#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 1e0576c5..18a9348d 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -6,13 +6,13 @@ #include "debounce.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index de65fd49..70502148 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -6,14 +6,14 @@ #include "debounce.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_mock.c b/app/drivers/kscan/kscan_mock.c index 4ccce69f..57862b0d 100644 --- a/app/drivers/kscan/kscan_mock.c +++ b/app/drivers/kscan/kscan_mock.c @@ -7,9 +7,9 @@ #define DT_DRV_COMPAT zmk_kscan_mock #include -#include -#include -#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/sensor/battery/battery_common.c b/app/drivers/sensor/battery/battery_common.c index 36e98aff..9afe2d5b 100644 --- a/app/drivers/sensor/battery/battery_common.c +++ b/app/drivers/sensor/battery/battery_common.c @@ -5,7 +5,7 @@ */ #include -#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/battery/battery_common.h b/app/drivers/sensor/battery/battery_common.h index d81c39e2..3e16ceed 100644 --- a/app/drivers/sensor/battery/battery_common.h +++ b/app/drivers/sensor/battery/battery_common.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct battery_value { diff --git a/app/drivers/sensor/battery/battery_nrf_vddh.c b/app/drivers/sensor/battery/battery_nrf_vddh.c index 60104a69..3f230812 100644 --- a/app/drivers/sensor/battery/battery_nrf_vddh.c +++ b/app/drivers/sensor/battery/battery_nrf_vddh.c @@ -9,11 +9,11 @@ #define DT_DRV_COMPAT zmk_battery_nrf_vddh -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index 09e5525e..bc35d002 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -6,12 +6,12 @@ #define DT_DRV_COMPAT zmk_battery_voltage_divider -#include -#include +#include +#include #include #include #include -#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 2fe641fa..5f26ebc3 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -6,13 +6,13 @@ #define DT_DRV_COMPAT alps_ec11 -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include "ec11.h" diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 1cb9c5f7..04750df5 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -6,9 +6,9 @@ #pragma once -#include -#include -#include +#include +#include +#include struct ec11_config { const char *a_label; diff --git a/app/drivers/sensor/ec11/ec11_trigger.c b/app/drivers/sensor/ec11/ec11_trigger.c index 555e1f4a..804a21d9 100644 --- a/app/drivers/sensor/ec11/ec11_trigger.c +++ b/app/drivers/sensor/ec11/ec11_trigger.c @@ -6,17 +6,17 @@ #define DT_DRV_COMPAT alps_ec11 -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "ec11.h" extern struct ec11_data ec11_driver; -#include +#include LOG_MODULE_DECLARE(EC11, CONFIG_SENSOR_LOG_LEVEL); static inline void setup_int(const struct device *dev, bool enable) { diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index fcb24f6f..71df7344 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -8,9 +8,9 @@ #include #include -#include +#include #include -#include +#include #include #include diff --git a/app/include/drivers/ext_power.h b/app/include/drivers/ext_power.h index b422750c..287679e1 100644 --- a/app/include/drivers/ext_power.h +++ b/app/include/drivers/ext_power.h @@ -8,7 +8,7 @@ #include #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 78d00bb7..66c1264a 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include __event_type_start = .; \ KEEP(*(".event_type")); \ diff --git a/app/include/zmk/behavior_queue.h b/app/include/zmk/behavior_queue.h index 8a184e4a..307482e7 100644 --- a/app/include/zmk/behavior_queue.h +++ b/app/include/zmk/behavior_queue.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/ble/profile.h b/app/include/zmk/ble/profile.h index 1df27436..0a57f16f 100644 --- a/app/include/zmk/ble/profile.h +++ b/app/include/zmk/ble/profile.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define ZMK_BLE_PROFILE_NAME_MAX 15 diff --git a/app/include/zmk/display/widgets/battery_status.h b/app/include/zmk/display/widgets/battery_status.h index b87e87ee..ce22da4d 100644 --- a/app/include/zmk/display/widgets/battery_status.h +++ b/app/include/zmk/display/widgets/battery_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_battery_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/layer_status.h b/app/include/zmk/display/widgets/layer_status.h index 3779351a..a11c4039 100644 --- a/app/include/zmk/display/widgets/layer_status.h +++ b/app/include/zmk/display/widgets/layer_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_layer_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/output_status.h b/app/include/zmk/display/widgets/output_status.h index 66f09271..ed8ee813 100644 --- a/app/include/zmk/display/widgets/output_status.h +++ b/app/include/zmk/display/widgets/output_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_output_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/peripheral_status.h b/app/include/zmk/display/widgets/peripheral_status.h index e3b41355..07caeaa7 100644 --- a/app/include/zmk/display/widgets/peripheral_status.h +++ b/app/include/zmk/display/widgets/peripheral_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_peripheral_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/wpm_status.h b/app/include/zmk/display/widgets/wpm_status.h index 0592299e..fbe96cc2 100644 --- a/app/include/zmk/display/widgets/wpm_status.h +++ b/app/include/zmk/display/widgets/wpm_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_wpm_status { sys_snode_t node; diff --git a/app/include/zmk/event_manager.h b/app/include/zmk/event_manager.h index 5acb26eb..aa9942ea 100644 --- a/app/include/zmk/event_manager.h +++ b/app/include/zmk/event_manager.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include struct zmk_event_type { diff --git a/app/include/zmk/events/activity_state_changed.h b/app/include/zmk/events/activity_state_changed.h index 998fa2d4..6a3481f3 100644 --- a/app/include/zmk/events/activity_state_changed.h +++ b/app/include/zmk/events/activity_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/battery_state_changed.h b/app/include/zmk/events/battery_state_changed.h index 6a003d8d..5a8c625e 100644 --- a/app/include/zmk/events/battery_state_changed.h +++ b/app/include/zmk/events/battery_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_battery_state_changed { diff --git a/app/include/zmk/events/ble_active_profile_changed.h b/app/include/zmk/events/ble_active_profile_changed.h index 4d3bb7ae..620e19b4 100644 --- a/app/include/zmk/events/ble_active_profile_changed.h +++ b/app/include/zmk/events/ble_active_profile_changed.h @@ -6,9 +6,9 @@ #pragma once -#include +#include #include -#include +#include #include diff --git a/app/include/zmk/events/endpoint_selection_changed.h b/app/include/zmk/events/endpoint_selection_changed.h index 38a6a8e5..198fe5a1 100644 --- a/app/include/zmk/events/endpoint_selection_changed.h +++ b/app/include/zmk/events/endpoint_selection_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h index 233ec62f..c3a3ed30 100644 --- a/app/include/zmk/events/keycode_state_changed.h +++ b/app/include/zmk/events/keycode_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/layer_state_changed.h b/app/include/zmk/events/layer_state_changed.h index 33183546..405d1365 100644 --- a/app/include/zmk/events/layer_state_changed.h +++ b/app/include/zmk/events/layer_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_layer_state_changed { diff --git a/app/include/zmk/events/modifiers_state_changed.h b/app/include/zmk/events/modifiers_state_changed.h index 504c2c9c..3f772cdb 100644 --- a/app/include/zmk/events/modifiers_state_changed.h +++ b/app/include/zmk/events/modifiers_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/position_state_changed.h b/app/include/zmk/events/position_state_changed.h index 5323e943..3e4e9238 100644 --- a/app/include/zmk/events/position_state_changed.h +++ b/app/include/zmk/events/position_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #define ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL UINT8_MAX diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index f579bc39..9398bcbb 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,9 +6,9 @@ #pragma once -#include +#include #include -#include +#include struct zmk_sensor_event { uint8_t sensor_number; const struct device *sensor; diff --git a/app/include/zmk/events/split_peripheral_status_changed.h b/app/include/zmk/events/split_peripheral_status_changed.h index c75a879f..6ea59f60 100644 --- a/app/include/zmk/events/split_peripheral_status_changed.h +++ b/app/include/zmk/events/split_peripheral_status_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_split_peripheral_status_changed { diff --git a/app/include/zmk/events/usb_conn_state_changed.h b/app/include/zmk/events/usb_conn_state_changed.h index b40158c3..5f4ac5d2 100644 --- a/app/include/zmk/events/usb_conn_state_changed.h +++ b/app/include/zmk/events/usb_conn_state_changed.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/include/zmk/events/wpm_state_changed.h b/app/include/zmk/events/wpm_state_changed.h index 3d1a3695..76253e20 100644 --- a/app/include/zmk/events/wpm_state_changed.h +++ b/app/include/zmk/events/wpm_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 01104d1c..ab42adaa 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/include/zmk/keys.h b/app/include/zmk/keys.h index 38777ec8..fa6e7cfe 100644 --- a/app/include/zmk/keys.h +++ b/app/include/zmk/keys.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include typedef uint32_t zmk_key_t; diff --git a/app/include/zmk/matrix.h b/app/include/zmk/matrix.h index b3e2323b..5f8cd7d7 100644 --- a/app/include/zmk/matrix.h +++ b/app/include/zmk/matrix.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define ZMK_MATRIX_NODE_ID DT_CHOSEN(zmk_kscan) diff --git a/app/include/zmk/split/bluetooth/central.h b/app/include/zmk/split/bluetooth/central.h index 07240860..443d9b1b 100644 --- a/app/include/zmk/split/bluetooth/central.h +++ b/app/include/zmk/split/bluetooth/central.h @@ -1,7 +1,7 @@ #pragma once -#include +#include #include int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding, diff --git a/app/include/zmk/split/bluetooth/uuid.h b/app/include/zmk/split/bluetooth/uuid.h index 735f5751..cbdb1772 100644 --- a/app/include/zmk/split/bluetooth/uuid.h +++ b/app/include/zmk/split/bluetooth/uuid.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #ifndef BT_UUID_NUM_OF_DIGITALS #define BT_UUID_NUM_OF_DIGITALS BT_UUID_DECLARE_16(0x2909) diff --git a/app/include/zmk/usb.h b/app/include/zmk/usb.h index 786d9c73..9e92a836 100644 --- a/app/include/zmk/usb.h +++ b/app/include/zmk/usb.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/src/activity.c b/app/src/activity.c index 029908c0..41fe2e15 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/backlight.c b/app/src/backlight.c index 159c6fb2..f633ddb7 100644 --- a/app/src/backlight.c +++ b/app/src/backlight.c @@ -4,14 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include +#include -#include -#include -#include +#include +#include #include #include diff --git a/app/src/battery.c b/app/src/battery.c index 3f662241..540f7c3e 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -4,14 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 617d5aad..529e5782 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -6,8 +6,8 @@ #include -#include -#include +#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/behaviors/behavior_backlight.c b/app/src/behaviors/behavior_backlight.c index a1eaaf86..fe2155b7 100644 --- a/app/src/behaviors/behavior_backlight.c +++ b/app/src/behaviors/behavior_backlight.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_backlight -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_bt.c b/app/src/behaviors/behavior_bt.c index 79b805b6..71cf2322 100644 --- a/app/src/behaviors/behavior_bt.c +++ b/app/src/behaviors/behavior_bt.c @@ -6,14 +6,16 @@ #define DT_DRV_COMPAT zmk_behavior_bluetooth -#include +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + #include #include -#include -#include #include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 7a9612b3..8ee5bb5c 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_caps_word -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_ext_power.c b/app/src/behaviors/behavior_ext_power.c index 5db8aac2..690ac971 100644 --- a/app/src/behaviors/behavior_ext_power.c +++ b/app/src/behaviors/behavior_ext_power.c @@ -6,14 +6,14 @@ #define DT_DRV_COMPAT zmk_behavior_ext_power -#include -#include +#include +#include #include #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index a9e4d642..6ea2fe97 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -6,11 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_hold_tap -#include +#include #include #include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_key_press.c b/app/src/behaviors/behavior_key_press.c index 215da41d..2765db9f 100644 --- a/app/src/behaviors/behavior_key_press.c +++ b/app/src/behaviors/behavior_key_press.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_press -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_key_repeat.c b/app/src/behaviors/behavior_key_repeat.c index ad29cb0a..033f498b 100644 --- a/app/src/behaviors/behavior_key_repeat.c +++ b/app/src/behaviors/behavior_key_repeat.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_repeat -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_key_toggle.c b/app/src/behaviors/behavior_key_toggle.c index cd2a5dcd..cbbdd0d9 100644 --- a/app/src/behaviors/behavior_key_toggle.c +++ b/app/src/behaviors/behavior_key_toggle.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_toggle -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index 5b215b93..c86d732a 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_macro -#include +#include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index effbe4ac..e5ba346e 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_mod_morph -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_momentary_layer.c b/app/src/behaviors/behavior_momentary_layer.c index 46e49fcc..c2bd0ffc 100644 --- a/app/src/behaviors/behavior_momentary_layer.c +++ b/app/src/behaviors/behavior_momentary_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_momentary_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_none.c b/app/src/behaviors/behavior_none.c index 1e7eb2b0..613ecbad 100644 --- a/app/src/behaviors/behavior_none.c +++ b/app/src/behaviors/behavior_none.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_none -#include +#include #include -#include +#include #include diff --git a/app/src/behaviors/behavior_outputs.c b/app/src/behaviors/behavior_outputs.c index 366abd8f..7aab8ee3 100644 --- a/app/src/behaviors/behavior_outputs.c +++ b/app/src/behaviors/behavior_outputs.c @@ -6,8 +6,8 @@ #define DT_DRV_COMPAT zmk_behavior_outputs -#include -#include +#include +#include #include #include @@ -15,7 +15,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_reset.c b/app/src/behaviors/behavior_reset.c index 47b11fa4..0b983c84 100644 --- a/app/src/behaviors/behavior_reset.c +++ b/app/src/behaviors/behavior_reset.c @@ -6,10 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_reset -#include -#include +#include +#include +#include + #include -#include #include diff --git a/app/src/behaviors/behavior_rgb_underglow.c b/app/src/behaviors/behavior_rgb_underglow.c index 3459cd22..0af07f81 100644 --- a/app/src/behaviors/behavior_rgb_underglow.c +++ b/app/src/behaviors/behavior_rgb_underglow.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_rgb_underglow -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c index c4a34a94..ed6eedae 100644 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -6,11 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_sensor_rotate_key_press -#include -#include -#include +#include +#include +#include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 267b81ab..22936086 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_sticky_key -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index 6d78cb3e..ddb4aeab 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_tap_dance -#include +#include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_to_layer.c b/app/src/behaviors/behavior_to_layer.c index cce39d5d..c05b83ea 100644 --- a/app/src/behaviors/behavior_to_layer.c +++ b/app/src/behaviors/behavior_to_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_to_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c index a682c6fe..73a700ed 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_toggle_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_transparent.c b/app/src/behaviors/behavior_transparent.c index 2ba05747..eeb2242d 100644 --- a/app/src/behaviors/behavior_transparent.c +++ b/app/src/behaviors/behavior_transparent.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_transparent -#include +#include #include -#include +#include #include diff --git a/app/src/ble.c b/app/src/ble.c index 4d2e4603..aee90d5d 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -4,29 +4,29 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if IS_ENABLED(CONFIG_SETTINGS) -#include +#include #endif -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/combo.c b/app/src/combo.c index e434ae17..2e237330 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -6,11 +6,12 @@ #define DT_DRV_COMPAT zmk_combos -#include +#include +#include +#include +#include + #include -#include -#include -#include #include #include diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index 572652ff..9ba02a5c 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -7,10 +7,10 @@ #define DT_DRV_COMPAT zmk_conditional_layers #include -#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/display/main.c b/app/src/display/main.c index 3fb4e8f6..52fa3c69 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 6b58c301..7c3870a8 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -11,7 +11,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 3480101d..e35f890a 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -4,10 +4,10 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index 8dc0061c..c3ddd07c 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 135770a6..1c6da4b9 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -4,10 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/peripheral_status.c b/app/src/display/widgets/peripheral_status.c index d0c33f20..fdfe4d9c 100644 --- a/app/src/display/widgets/peripheral_status.c +++ b/app/src/display/widgets/peripheral_status.c @@ -4,10 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/wpm_status.c b/app/src/display/widgets/wpm_status.c index f3d06d65..9ae8b540 100644 --- a/app/src/display/widgets/wpm_status.c +++ b/app/src/display/widgets/wpm_status.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 33760010..9c824f44 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include @@ -18,7 +18,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define DEFAULT_ENDPOINT \ diff --git a/app/src/event_manager.c b/app/src/event_manager.c index 471432a8..0f4a5547 100644 --- a/app/src/event_manager.c +++ b/app/src/event_manager.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/events/activity_state_changed.c b/app/src/events/activity_state_changed.c index 2c27ce74..95be678e 100644 --- a/app/src/events/activity_state_changed.c +++ b/app/src/events/activity_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_activity_state_changed); \ No newline at end of file diff --git a/app/src/events/battery_state_changed.c b/app/src/events/battery_state_changed.c index 435fb24d..508ee971 100644 --- a/app/src/events/battery_state_changed.c +++ b/app/src/events/battery_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_battery_state_changed); \ No newline at end of file diff --git a/app/src/events/ble_active_profile_changed.c b/app/src/events/ble_active_profile_changed.c index c4887f73..dccbc7e0 100644 --- a/app/src/events/ble_active_profile_changed.c +++ b/app/src/events/ble_active_profile_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_ble_active_profile_changed); \ No newline at end of file diff --git a/app/src/events/endpoint_selection_changed.c b/app/src/events/endpoint_selection_changed.c index 7f9014da..34bc39dd 100644 --- a/app/src/events/endpoint_selection_changed.c +++ b/app/src/events/endpoint_selection_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_endpoint_selection_changed); diff --git a/app/src/events/keycode_state_changed.c b/app/src/events/keycode_state_changed.c index c9ef6aa7..a134f341 100644 --- a/app/src/events/keycode_state_changed.c +++ b/app/src/events/keycode_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_keycode_state_changed); diff --git a/app/src/events/layer_state_changed.c b/app/src/events/layer_state_changed.c index bd6234c9..79326ccc 100644 --- a/app/src/events/layer_state_changed.c +++ b/app/src/events/layer_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_layer_state_changed); \ No newline at end of file diff --git a/app/src/events/modifiers_state_changed.c b/app/src/events/modifiers_state_changed.c index 3dfea25f..f44d90dd 100644 --- a/app/src/events/modifiers_state_changed.c +++ b/app/src/events/modifiers_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_modifiers_state_changed); \ No newline at end of file diff --git a/app/src/events/position_state_changed.c b/app/src/events/position_state_changed.c index bb40584e..7b9be89f 100644 --- a/app/src/events/position_state_changed.c +++ b/app/src/events/position_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_position_state_changed); \ No newline at end of file diff --git a/app/src/events/sensor_event.c b/app/src/events/sensor_event.c index 94ade947..bec1e6e7 100644 --- a/app/src/events/sensor_event.c +++ b/app/src/events/sensor_event.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_sensor_event); \ No newline at end of file diff --git a/app/src/events/split_peripheral_status_changed.c b/app/src/events/split_peripheral_status_changed.c index 1d70b2ff..3f4c967d 100644 --- a/app/src/events/split_peripheral_status_changed.c +++ b/app/src/events/split_peripheral_status_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_split_peripheral_status_changed); \ No newline at end of file diff --git a/app/src/events/usb_conn_state_changed.c b/app/src/events/usb_conn_state_changed.c index b3555569..ae1f0503 100644 --- a/app/src/events/usb_conn_state_changed.c +++ b/app/src/events/usb_conn_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_usb_conn_state_changed); \ No newline at end of file diff --git a/app/src/events/wpm_state_changed.c b/app/src/events/wpm_state_changed.c index 3d9830bf..f16f54d2 100644 --- a/app/src/events/wpm_state_changed.c +++ b/app/src/events/wpm_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_wpm_state_changed); \ No newline at end of file diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index aab09cec..654f683f 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -7,17 +7,18 @@ #define DT_DRV_COMPAT zmk_ext_power_generic #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include + #include #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct ext_power_generic_config { diff --git a/app/src/hid.c b/app/src/hid.c index b66a910d..2a6b5d39 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -5,7 +5,7 @@ */ #include "zmk/keys.h" -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index e233b0b8..3a11101d 100644 --- a/app/src/hid_listener.c +++ b/app/src/hid_listener.c @@ -5,7 +5,7 @@ */ #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/hog.c b/app/src/hog.c index 3dd3e874..930714b0 100644 --- a/app/src/hog.c +++ b/app/src/hog.c @@ -4,15 +4,15 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include -#include +#include +#include #include #include diff --git a/app/src/keymap.c b/app/src/keymap.c index b00d0fba..0f06a39a 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -4,9 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -37,7 +37,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) #define TRANSFORMED_LAYER(node) \ - {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (,), node)}, + {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (, ), node)}, #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ @@ -52,7 +52,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #define SENSOR_LAYER(node) \ COND_CODE_1( \ DT_NODE_HAS_PROP(node, sensor_bindings), \ - ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (,), node)}), \ + ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (, ), node)}), \ ({})), #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/kscan.c b/app/src/kscan.c index c7cf2881..f9db8b1c 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/main.c b/app/src/main.c index ae604a7b..8ea67057 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_REGISTER(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index e7c6e95f..47256608 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include #include #include @@ -15,7 +15,7 @@ [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i -static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (,), 0)}; +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (, ), 0)}; #endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 18614a4e..47c3658e 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -4,17 +4,17 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include #include #include -#include +#include -#include +#include #include #include diff --git a/app/src/sensors.c b/app/src/sensors.c index 184061ac..9873de4f 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index e94a59ae..82cf7e01 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -5,15 +5,16 @@ */ #include +#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -24,7 +25,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include -#include static int start_scan(void); diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index aa690ab2..07d3ee3f 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -4,29 +4,29 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if IS_ENABLED(CONFIG_SETTINGS) -#include +#include #endif -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index 5da5401d..cc20c72f 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -5,15 +5,15 @@ */ #include -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include -#include +#include +#include #include #include diff --git a/app/src/split/bluetooth/split_listener.c b/app/src/split/bluetooth/split_listener.c index 3f3763ae..eb5398c4 100644 --- a/app/src/split/bluetooth/split_listener.c +++ b/app/src/split/bluetooth/split_listener.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include diff --git a/app/src/usb.c b/app/src/usb.c index 146e7bb7..cf04ef46 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index 4b90cf96..f46c70a0 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/wpm.c b/app/src/wpm.c index bcabf377..00a5942e 100644 --- a/app/src/wpm.c +++ b/app/src/wpm.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index af98613e..e65bb296 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -137,9 +137,9 @@ The code snippet below shows the essential components of a new driver. #define DT_DRV_COMPAT zmk_ // Dependencies -#include +#include #include -#include +#include #include From e84b4299b5ee15a922397c3485de83468b7036fd Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 00:47:36 -0400 Subject: [PATCH 035/134] refactor: Remove deprecated Kconfig override. --- app/Kconfig | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 358d5d14..cf2cc6b3 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -429,9 +429,6 @@ config USB_CDC_ACM_RINGBUF_SIZE config LOG_BUFFER_SIZE default 8192 -config LOG_STRDUP_BUF_COUNT - default 16 - config LOG_PROCESS_THREAD_STARTUP_DELAY_MS default 1000 From 062f94d0144530fa699e5158b87293e7ebb526fc Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 20:36:34 -0500 Subject: [PATCH 036/134] refactor: Remove v1 logging vestiges. --- app/drivers/kscan/kscan_composite.c | 4 ++-- app/drivers/kscan/kscan_gpio_demux.c | 4 ++-- app/drivers/kscan/kscan_gpio_direct.c | 2 +- app/drivers/kscan/kscan_gpio_matrix.c | 4 ++-- app/src/behavior_queue.c | 2 +- app/src/ble.c | 30 +++++++++++++-------------- app/src/endpoints.c | 2 +- app/src/keymap.c | 5 ++--- app/src/split/bluetooth/central.c | 14 ++++++------- app/src/split/bluetooth/peripheral.c | 8 +++---- app/src/split/bluetooth/service.c | 4 ++-- 11 files changed, 39 insertions(+), 40 deletions(-) diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index e0cf47f9..b452a9d2 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -43,7 +43,7 @@ static int kscan_composite_enable_callback(const struct device *dev) { const struct device *dev = device_get_binding(cfg->label); if (!dev) { - LOG_WRN("Failed to load child kscan device %s", log_strdup(cfg->label)); + LOG_WRN("Failed to load child kscan device %s", cfg->label); continue; } kscan_enable_callback(dev); @@ -57,7 +57,7 @@ static int kscan_composite_disable_callback(const struct device *dev) { const struct device *dev = device_get_binding(cfg->label); if (!dev) { - LOG_WRN("Failed to load child kscan device %s", log_strdup(cfg->label)); + LOG_WRN("Failed to load child kscan device %s", cfg->label); continue; } kscan_disable_callback(dev); diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 5fdd3a7e..3ca300a3 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -240,8 +240,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (,), n)}, \ - .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (,), n)}, \ + .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (, ), n)}, \ + .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (, ), n)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 18a9348d..586e0d95 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -327,7 +327,7 @@ static const struct kscan_driver_api kscan_direct_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ - LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (,), n)}; \ + LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 70502148..d2121273 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -433,10 +433,10 @@ static const struct kscan_driver_api kscan_matrix_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ - LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (,), n)}; \ + LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (, ), n)}; \ \ static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ - LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (,), n)}; \ + LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ \ diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 529e5782..971816f2 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -28,7 +28,7 @@ static void behavior_queue_process_next(struct k_work *work) { struct q_item item = {.wait = 0}; while (k_msgq_get(&zmk_behavior_queue_msgq, &item, K_NO_WAIT) == 0) { - LOG_DBG("Invoking %s: 0x%02x 0x%02x", log_strdup(item.binding.behavior_dev), + LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, item.binding.param1, item.binding.param2); struct zmk_behavior_binding_event event = {.position = item.position, diff --git a/app/src/ble.c b/app/src/ble.c index aee90d5d..a7037d0c 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -111,7 +111,7 @@ void set_profile_address(uint8_t index, const bt_addr_le_t *addr) { memcpy(&profiles[index].peer, addr, sizeof(bt_addr_le_t)); sprintf(setting_name, "ble/profiles/%d", index); - LOG_DBG("Setting profile addr for %s to %s", log_strdup(setting_name), log_strdup(addr_str)); + LOG_DBG("Setting profile addr for %s to %s", setting_name, addr_str); settings_save_one(setting_name, &profiles[index], sizeof(struct zmk_ble_profile)); k_work_submit(&raise_profile_changed_event_work); } @@ -177,7 +177,7 @@ int update_advertising() { // addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(zmk_ble_active_profile_addr(), addr_str, // sizeof(addr_str)); - // LOG_DBG("Directed advertising to %s", log_strdup(addr_str)); + // LOG_DBG("Directed advertising to %s", addr_str); // desired_adv = ZMK_ADV_DIR; } LOG_DBG("advertising from %d to %d", advertising_status, desired_adv); @@ -293,13 +293,13 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c void *cb_arg) { const char *next; - LOG_DBG("Setting BLE value %s", log_strdup(name)); + LOG_DBG("Setting BLE value %s", name); if (settings_name_steq(name, "profiles", &next) && next) { char *endptr; uint8_t idx = strtoul(next, &endptr, 10); if (*endptr != '\0') { - LOG_WRN("Invalid profile index: %s", log_strdup(next)); + LOG_WRN("Invalid profile index: %s", next); return -EINVAL; } @@ -324,7 +324,7 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c char addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(&profiles[idx].peer, addr_str, sizeof(addr_str)); - LOG_DBG("Loaded %s address for profile %d", log_strdup(addr_str), idx); + LOG_DBG("Loaded %s address for profile %d", addr_str, idx); } else if (settings_name_steq(name, "active_profile", &next) && !next) { if (len != sizeof(active_profile)) { return -EINVAL; @@ -376,12 +376,12 @@ static void connected(struct bt_conn *conn, uint8_t err) { advertising_status = ZMK_ADV_NONE; if (err) { - LOG_WRN("Failed to connect to %s (%u)", log_strdup(addr), err); + LOG_WRN("Failed to connect to %s (%u)", addr, err); update_advertising(); return; } - LOG_DBG("Connected %s", log_strdup(addr)); + LOG_DBG("Connected %s", addr); if (bt_conn_set_security(conn, BT_SECURITY_L2)) { LOG_ERR("Failed to set security"); @@ -401,7 +401,7 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected from %s (reason 0x%02x)", log_strdup(addr), reason); + LOG_DBG("Disconnected from %s (reason 0x%02x)", addr, reason); bt_conn_get_info(conn, &info); @@ -426,9 +426,9 @@ static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_ bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); if (!err) { - LOG_DBG("Security changed: %s level %u", log_strdup(addr), level); + LOG_DBG("Security changed: %s level %u", addr, level); } else { - LOG_ERR("Security failed: %s level %u err %d", log_strdup(addr), level, err); + LOG_ERR("Security failed: %s level %u err %d", addr, level, err); } } @@ -438,7 +438,7 @@ static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t l bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("%s: interval %d latency %d timeout %d", log_strdup(addr), interval, latency, timeout); + LOG_DBG("%s: interval %d latency %d timeout %d", addr, interval, latency, timeout); } static struct bt_conn_cb conn_callbacks = { @@ -454,7 +454,7 @@ static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Passkey for %s: %06u", log_strdup(addr), passkey); + LOG_DBG("Passkey for %s: %06u", addr, passkey); } */ @@ -465,7 +465,7 @@ static void auth_passkey_entry(struct bt_conn *conn) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Passkey entry requested for %s", log_strdup(addr)); + LOG_DBG("Passkey entry requested for %s", addr); passkey_digit = 0; auth_passkey_entry_conn = bt_conn_ref(conn); } @@ -486,7 +486,7 @@ static void auth_cancel(struct bt_conn *conn) { passkey_digit = 0; #endif - LOG_DBG("Pairing cancelled: %s", log_strdup(addr)); + LOG_DBG("Pairing cancelled: %s", addr); } static enum bt_security_err auth_pairing_accept(struct bt_conn *conn, @@ -517,7 +517,7 @@ static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { } if (!zmk_ble_active_profile_is_open()) { - LOG_ERR("Pairing completed but current profile is not open: %s", log_strdup(addr)); + LOG_ERR("Pairing completed but current profile is not open: %s", addr); bt_unpair(BT_ID_DEFAULT, dst); return; } diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 9c824f44..dbd1a3e6 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -148,7 +148,7 @@ int zmk_endpoints_send_report(uint16_t usage_page) { static int endpoints_handle_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) { - LOG_DBG("Setting endpoint value %s", log_strdup(name)); + LOG_DBG("Setting endpoint value %s", name); if (settings_name_steq(name, "preferred", NULL)) { if (len != sizeof(enum zmk_endpoint)) { diff --git a/app/src/keymap.c b/app/src/keymap.c index 0f06a39a..99483592 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -179,8 +179,7 @@ int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position .timestamp = timestamp, }; - LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, - log_strdup(binding.behavior_dev)); + LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, binding.behavior_dev); behavior = device_get_binding(binding.behavior_dev); @@ -260,7 +259,7 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens int ret; LOG_DBG("layer: %d sensor_number: %d, binding name: %s", layer, sensor_number, - log_strdup(binding->behavior_dev)); + binding->behavior_dev); behavior = device_get_binding(binding->behavior_dev); diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 82cf7e01..5b952dfc 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -377,8 +377,8 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { bt_uuid_to_str(&uuid.uuid, uuid_str, sizeof(uuid_str)); bt_uuid_to_str(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID), service_uuid_str, sizeof(service_uuid_str)); - LOG_DBG("UUID %s does not match split UUID: %s", log_strdup(uuid_str), - log_strdup(service_uuid_str)); + LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, + service_uuid_str); continue; } @@ -433,7 +433,7 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui char dev[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, dev, sizeof(dev)); - LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", log_strdup(dev), type, ad->len, + LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, rssi); /* We're only interested in connectable events */ @@ -469,7 +469,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { } if (conn_err) { - LOG_ERR("Failed to connect to %s (%u)", log_strdup(addr), conn_err); + LOG_ERR("Failed to connect to %s (%u)", addr, conn_err); release_peripheral_slot_for_conn(conn); @@ -477,7 +477,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { return; } - LOG_DBG("Connected: %s", log_strdup(addr)); + LOG_DBG("Connected: %s", addr); confirm_peripheral_slot_conn(conn); split_central_process_connection(conn); @@ -489,7 +489,7 @@ static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected: %s (reason %d)", log_strdup(addr), reason); + LOG_DBG("Disconnected: %s (reason %d)", addr, reason); err = release_peripheral_slot_for_conn(conn); @@ -579,7 +579,7 @@ int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *bi if (strlcpy(payload.behavior_dev, binding->behavior_dev, payload_dev_size) >= payload_dev_size) { LOG_ERR("Truncated behavior label %s to %s before invoking peripheral behavior", - log_strdup(binding->behavior_dev), log_strdup(payload.behavior_dev)); + binding->behavior_dev, payload.behavior_dev); } struct zmk_split_run_behavior_payload_wrapper wrapper = {.source = source, .payload = payload}; diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index 07d3ee3f..6b767baa 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -59,7 +59,7 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected from %s (reason 0x%02x)", log_strdup(addr), reason); + LOG_DBG("Disconnected from %s (reason 0x%02x)", addr, reason); is_connected = false; @@ -73,9 +73,9 @@ static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_ bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); if (!err) { - LOG_DBG("Security changed: %s level %u", log_strdup(addr), level); + LOG_DBG("Security changed: %s level %u", addr, level); } else { - LOG_ERR("Security failed: %s level %u err %d", log_strdup(addr), level, err); + LOG_ERR("Security failed: %s level %u err %d", addr, level, err); } } @@ -85,7 +85,7 @@ static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t l bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("%s: interval %d latency %d timeout %d", log_strdup(addr), interval, latency, timeout); + LOG_DBG("%s: interval %d latency %d timeout %d", addr, interval, latency, timeout); } static struct bt_conn_cb conn_callbacks = { diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index cc20c72f..fa4b7718 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -60,7 +60,7 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt .param2 = payload->data.param2, .behavior_dev = payload->behavior_dev, }; - LOG_DBG("%s with params %d %d: pressed? %d", log_strdup(binding.behavior_dev), + LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, binding.param1, binding.param2, payload->data.state); struct zmk_behavior_binding_event event = {.position = payload->data.position, .timestamp = k_uptime_get()}; @@ -72,7 +72,7 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt } if (err) { - LOG_ERR("Failed to invoke behavior %s: %d", log_strdup(binding.behavior_dev), err); + LOG_ERR("Failed to invoke behavior %s: %d", binding.behavior_dev, err); } } From 09ed79a867b9d360270d505ff361a65ed66735e3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 20:40:44 -0500 Subject: [PATCH 037/134] refactor: Move away from deprecated label usages. * Move away from DT_LABEL. * Move to DEVICE_DT_GET for non-behavior device access. * Move various drivers to `gpio_spec_dt` and `DT` related macros. * Remove mcp23017 while at it, since better upstream driver is available. --- app/boards/arm/ferris/ferris_rev02.dts | 3 +- app/boards/arm/ferris/ferris_rev02_defconfig | 3 - app/boards/arm/mikoto/pinmux.c | 4 +- app/boards/arm/nrfmicro/pinmux.c | 2 +- app/boards/arm/puchi_ble/pinmux.c | 2 +- app/drivers/display/il0323.c | 146 +++----- app/drivers/gpio/CMakeLists.txt | 1 - app/drivers/gpio/Kconfig | 1 - app/drivers/gpio/Kconfig.mcp23017 | 22 -- app/drivers/gpio/gpio_mcp23017.c | 332 ------------------ app/drivers/gpio/gpio_mcp23017.h | 86 ----- app/drivers/kscan/kscan_composite.c | 26 +- app/drivers/kscan/kscan_gpio_demux.c | 90 ++--- .../sensor/battery/battery_voltage_divider.c | 77 ++-- app/drivers/sensor/ec11/ec11.c | 30 +- app/drivers/sensor/ec11/ec11.h | 11 +- app/drivers/sensor/ec11/ec11_trigger.c | 15 +- .../dts/bindings/gpio/microchip,mcp23017.yaml | 29 -- .../dts/bindings/gpio/zmk,gpio-595.yaml | 3 - .../bindings/sensor/zmk,battery-nrf-vddh.yaml | 5 - .../sensor/zmk,battery-voltage-divider.yaml | 5 - app/include/zmk/keymap.h | 2 +- app/include/zmk/kscan.h | 4 +- app/src/activity.c | 4 +- app/src/behavior_queue.c | 4 +- app/src/behaviors/behavior_bt.c | 1 - app/src/behaviors/behavior_caps_word.c | 9 +- app/src/behaviors/behavior_hold_tap.c | 4 +- app/src/behaviors/behavior_macro.c | 14 +- app/src/behaviors/behavior_mod_morph.c | 2 +- app/src/behaviors/behavior_tap_dance.c | 2 +- app/src/display/main.c | 11 +- app/src/ext_power_generic.c | 30 +- app/src/keymap.c | 5 +- app/src/kscan.c | 3 +- app/src/main.c | 4 +- app/src/rgb_underglow.c | 18 +- app/src/sensors.c | 3 +- app/src/split/bluetooth/central.c | 6 +- app/src/split/bluetooth/service.c | 4 +- docs/docs/development/new-behavior.md | 4 +- 41 files changed, 199 insertions(+), 828 deletions(-) delete mode 100644 app/drivers/gpio/Kconfig.mcp23017 delete mode 100644 app/drivers/gpio/gpio_mcp23017.c delete mode 100644 app/drivers/gpio/gpio_mcp23017.h delete mode 100644 app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index 50de9526..55055e9a 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -104,11 +104,10 @@ clock-frequency = ; right_io: mcp23017@20 { - compatible = "microchip,mcp23017"; + compatible = "microchip,mcp230xx"; status = "okay"; gpio-controller; reg = <0x20>; - label = "RIGHT_IO"; #gpio-cells = <2>; ngpios = <16>; }; diff --git a/app/boards/arm/ferris/ferris_rev02_defconfig b/app/boards/arm/ferris/ferris_rev02_defconfig index 934dc4a0..267035c9 100644 --- a/app/boards/arm/ferris/ferris_rev02_defconfig +++ b/app/boards/arm/ferris/ferris_rev02_defconfig @@ -20,9 +20,6 @@ CONFIG_ZMK_USB=y CONFIG_ZMK_KSCAN_MATRIX_POLLING=y CONFIG_USB_SELF_POWERED=n -# Enable IO multiplexer -CONFIG_GPIO_MCP23017=y - # Needed to reduce this to size that will fit on F072 CONFIG_HEAP_MEM_POOL_SIZE=1024 diff --git a/app/boards/arm/mikoto/pinmux.c b/app/boards/arm/mikoto/pinmux.c index 6d7f46d1..524aa17e 100644 --- a/app/boards/arm/mikoto/pinmux.c +++ b/app/boards/arm/mikoto/pinmux.c @@ -15,8 +15,8 @@ static int pinmux_mikoto_init(const struct device *port) { ARG_UNUSED(port); #if CONFIG_BOARD_MIKOTO_520 - const struct device *p0 = device_get_binding("GPIO_0"); - const struct device *p1 = device_get_binding("GPIO_1"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); + const struct device *p1 = DEVICE_DT_GET(DT_NODELABEL(gpio1)); #if CONFIG_BOARD_MIKOTO_CHARGER_CURRENT_40MA gpio_pin_configure(p0, 26, GPIO_INPUT | GPIO_PULL_DOWN); gpio_pin_configure(p1, 15, GPIO_INPUT); diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c index 129530d4..6362b392 100644 --- a/app/boards/arm/nrfmicro/pinmux.c +++ b/app/boards/arm/nrfmicro/pinmux.c @@ -15,7 +15,7 @@ static int pinmux_nrfmicro_init(const struct device *port) { ARG_UNUSED(port); #if (CONFIG_BOARD_NRFMICRO_13 || CONFIG_BOARD_NRFMICRO_13_52833) - const struct device *p0 = device_get_binding("GPIO_0"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); #if CONFIG_BOARD_NRFMICRO_CHARGER gpio_pin_configure(p0, 5, GPIO_OUTPUT); gpio_pin_set(p0, 5, 0); diff --git a/app/boards/arm/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c index 0817b6e0..28178274 100644 --- a/app/boards/arm/puchi_ble/pinmux.c +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -15,7 +15,7 @@ static int pinmux_puchi_ble_init(const struct device *port) { ARG_UNUSED(port); #if CONFIG_BOARD_PUCHI_BLE_v1 - const struct device *p0 = device_get_binding("GPIO_0"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); #if CONFIG_BOARD_PUCHI_BLE_CHARGER gpio_pin_configure(p0, 5, GPIO_OUTPUT); gpio_pin_set(p0, 5, 0); diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index ec6da159..94e38481 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -24,23 +24,6 @@ LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); * */ -#define IL0323_SPI_FREQ DT_INST_PROP(0, spi_max_frequency) -#define IL0323_BUS_NAME DT_INST_BUS_LABEL(0) -#define IL0323_DC_PIN DT_INST_GPIO_PIN(0, dc_gpios) -#define IL0323_DC_FLAGS DT_INST_GPIO_FLAGS(0, dc_gpios) -#define IL0323_DC_CNTRL DT_INST_GPIO_LABEL(0, dc_gpios) -#define IL0323_CS_PIN DT_INST_SPI_DEV_CS_GPIOS_PIN(0) -#define IL0323_CS_FLAGS DT_INST_SPI_DEV_CS_GPIOS_FLAGS(0) -#if DT_INST_SPI_DEV_HAS_CS_GPIOS(0) -#define IL0323_CS_CNTRL DT_INST_SPI_DEV_CS_GPIOS_LABEL(0) -#endif -#define IL0323_BUSY_PIN DT_INST_GPIO_PIN(0, busy_gpios) -#define IL0323_BUSY_CNTRL DT_INST_GPIO_LABEL(0, busy_gpios) -#define IL0323_BUSY_FLAGS DT_INST_GPIO_FLAGS(0, busy_gpios) -#define IL0323_RESET_PIN DT_INST_GPIO_PIN(0, reset_gpios) -#define IL0323_RESET_CNTRL DT_INST_GPIO_LABEL(0, reset_gpios) -#define IL0323_RESET_FLAGS DT_INST_GPIO_FLAGS(0, reset_gpios) - #define EPD_PANEL_WIDTH DT_INST_PROP(0, width) #define EPD_PANEL_HEIGHT DT_INST_PROP(0, height) #define IL0323_PIXELS_PER_BYTE 8U @@ -53,15 +36,11 @@ LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); #define IL0323_PANEL_LAST_PAGE (IL0323_NUMOF_PAGES - 1) #define IL0323_BUFFER_SIZE 1280 -struct il0323_data { - const struct device *reset; - const struct device *dc; - const struct device *busy; - const struct device *spi_dev; - struct spi_config spi_config; -#if defined(IL0323_CS_CNTRL) - struct spi_cs_control cs_ctrl; -#endif +struct il0323_cfg { + struct gpio_dt_spec reset; + struct gpio_dt_spec dc; + struct gpio_dt_spec busy; + struct spi_dt_spec spi; }; static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); @@ -69,21 +48,21 @@ static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); static uint8_t last_buffer[IL0323_BUFFER_SIZE]; static bool blanking_on = true; -static inline int il0323_write_cmd(struct il0323_data *driver, uint8_t cmd, uint8_t *data, +static inline int il0323_write_cmd(const struct il0323_cfg *cfg, uint8_t cmd, uint8_t *data, size_t len) { struct spi_buf buf = {.buf = &cmd, .len = sizeof(cmd)}; struct spi_buf_set buf_set = {.buffers = &buf, .count = 1}; - gpio_pin_set(driver->dc, IL0323_DC_PIN, 1); - if (spi_write(driver->spi_dev, &driver->spi_config, &buf_set)) { + gpio_pin_set_dt(&cfg->dc, 1); + if (spi_write_dt(&cfg->spi, &buf_set)) { return -EIO; } if (data != NULL) { buf.buf = data; buf.len = len; - gpio_pin_set(driver->dc, IL0323_DC_PIN, 0); - if (spi_write(driver->spi_dev, &driver->spi_config, &buf_set)) { + gpio_pin_set_dt(&cfg->dc, 0); + if (spi_write_dt(&cfg->spi, &buf_set)) { return -EIO; } } @@ -91,22 +70,22 @@ static inline int il0323_write_cmd(struct il0323_data *driver, uint8_t cmd, uint return 0; } -static inline void il0323_busy_wait(struct il0323_data *driver) { - int pin = gpio_pin_get(driver->busy, IL0323_BUSY_PIN); +static inline void il0323_busy_wait(const struct il0323_cfg *cfg) { + int pin = gpio_pin_get_dt(&cfg->busy); while (pin > 0) { __ASSERT(pin >= 0, "Failed to get pin level"); // LOG_DBG("wait %u", pin); k_msleep(IL0323_BUSY_DELAY); - pin = gpio_pin_get(driver->busy, IL0323_BUSY_PIN); + pin = gpio_pin_get_dt(&cfg->busy); } } static int il0323_update_display(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; LOG_DBG("Trigger update sequence"); - if (il0323_write_cmd(driver, IL0323_CMD_DRF, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DRF, NULL, 0)) { return -EIO; } @@ -117,7 +96,7 @@ static int il0323_update_display(const struct device *dev) { static int il0323_write(const struct device *dev, const uint16_t x, const uint16_t y, const struct display_buffer_descriptor *desc, const void *buf) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; uint16_t x_end_idx = x + desc->width - 1; uint16_t y_end_idx = y + desc->height - 1; uint8_t ptl[IL0323_PTL_REG_LENGTH] = {0}; @@ -147,20 +126,20 @@ static int il0323_write(const struct device *dev, const uint16_t x, const uint16 ptl[sizeof(ptl) - 1] = IL0323_PTL_PT_SCAN; LOG_HEXDUMP_DBG(ptl, sizeof(ptl), "ptl"); - il0323_busy_wait(driver); - if (il0323_write_cmd(driver, IL0323_CMD_PIN, NULL, 0)) { + il0323_busy_wait(cfg); + if (il0323_write_cmd(cfg, IL0323_CMD_PIN, NULL, 0)) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_PTL, ptl, sizeof(ptl))) { + if (il0323_write_cmd(cfg, IL0323_CMD_PTL, ptl, sizeof(ptl))) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_DTM1, last_buffer, IL0323_BUFFER_SIZE)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DTM1, last_buffer, IL0323_BUFFER_SIZE)) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_DTM2, (uint8_t *)buf, buf_len)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DTM2, (uint8_t *)buf, buf_len)) { return -EIO; } @@ -173,7 +152,7 @@ static int il0323_write(const struct device *dev, const uint16_t x, const uint16 } } - if (il0323_write_cmd(driver, IL0323_CMD_POUT, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_POUT, NULL, 0)) { return -EIO; } @@ -217,11 +196,11 @@ static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t patte } static int il0323_blanking_off(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; if (blanking_on) { - /* Update EPD pannel in normal mode */ - il0323_busy_wait(driver); + /* Update EPD panel in normal mode */ + il0323_busy_wait(cfg); if (il0323_clear_and_write_buffer(dev, 0xff, true)) { return -EIO; } @@ -278,30 +257,30 @@ static int il0323_set_pixel_format(const struct device *dev, const enum display_ } static int il0323_controller_init(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; uint8_t tmp[IL0323_TRES_REG_LENGTH]; LOG_DBG(""); - gpio_pin_set(driver->reset, IL0323_RESET_PIN, 1); + gpio_pin_set_dt(&cfg->reset, 1); k_msleep(IL0323_RESET_DELAY); - gpio_pin_set(driver->reset, IL0323_RESET_PIN, 0); + gpio_pin_set_dt(&cfg->reset, 0); k_msleep(IL0323_RESET_DELAY); - il0323_busy_wait(driver); + il0323_busy_wait(cfg); LOG_DBG("Initialize IL0323 controller"); - if (il0323_write_cmd(driver, IL0323_CMD_PWR, il0323_pwr, sizeof(il0323_pwr))) { + if (il0323_write_cmd(cfg, IL0323_CMD_PWR, il0323_pwr, sizeof(il0323_pwr))) { return -EIO; } /* Turn on: booster, controller, regulators, and sensor. */ - if (il0323_write_cmd(driver, IL0323_CMD_PON, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_PON, NULL, 0)) { return -EIO; } k_msleep(IL0323_PON_DELAY); - il0323_busy_wait(driver); + il0323_busy_wait(cfg); /* Pannel settings, KW mode */ tmp[0] = IL0323_PSR_UD | IL0323_PSR_SHL | IL0323_PSR_SHD | IL0323_PSR_RST; @@ -321,7 +300,7 @@ static int il0323_controller_init(const struct device *dev) { #endif /* panel width */ LOG_HEXDUMP_DBG(tmp, 1, "PSR"); - if (il0323_write_cmd(driver, IL0323_CMD_PSR, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_PSR, tmp, 1)) { return -EIO; } @@ -329,24 +308,24 @@ static int il0323_controller_init(const struct device *dev) { tmp[IL0323_TRES_HRES_IDX] = EPD_PANEL_WIDTH; tmp[IL0323_TRES_VRES_IDX] = EPD_PANEL_HEIGHT; LOG_HEXDUMP_DBG(tmp, IL0323_TRES_REG_LENGTH, "TRES"); - if (il0323_write_cmd(driver, IL0323_CMD_TRES, tmp, IL0323_TRES_REG_LENGTH)) { + if (il0323_write_cmd(cfg, IL0323_CMD_TRES, tmp, IL0323_TRES_REG_LENGTH)) { return -EIO; } tmp[IL0323_CDI_CDI_IDX] = DT_INST_PROP(0, cdi); LOG_HEXDUMP_DBG(tmp, IL0323_CDI_REG_LENGTH, "CDI"); - if (il0323_write_cmd(driver, IL0323_CMD_CDI, tmp, IL0323_CDI_REG_LENGTH)) { + if (il0323_write_cmd(cfg, IL0323_CMD_CDI, tmp, IL0323_CDI_REG_LENGTH)) { return -EIO; } tmp[0] = DT_INST_PROP(0, tcon); - if (il0323_write_cmd(driver, IL0323_CMD_TCON, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_TCON, tmp, 1)) { return -EIO; } /* Enable Auto Sequence */ tmp[0] = IL0323_AUTO_PON_DRF_POF; - if (il0323_write_cmd(driver, IL0323_CMD_AUTO, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_AUTO, tmp, 1)) { return -EIO; } @@ -354,62 +333,43 @@ static int il0323_controller_init(const struct device *dev) { } static int il0323_init(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; - LOG_DBG(""); - - driver->spi_dev = device_get_binding(IL0323_BUS_NAME); - if (driver->spi_dev == NULL) { - LOG_ERR("Could not get SPI device for IL0323"); + if (!spi_is_ready(&cfg->spi)) { + LOG_ERR("SPI device not ready for IL0323"); return -EIO; } - driver->spi_config.frequency = IL0323_SPI_FREQ; - driver->spi_config.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8); - driver->spi_config.slave = DT_INST_REG_ADDR(0); - driver->spi_config.cs = NULL; - - driver->reset = device_get_binding(IL0323_RESET_CNTRL); - if (driver->reset == NULL) { + if (!device_is_ready(cfg->reset.port)) { LOG_ERR("Could not get GPIO port for IL0323 reset"); return -EIO; } - gpio_pin_configure(driver->reset, IL0323_RESET_PIN, GPIO_OUTPUT_INACTIVE | IL0323_RESET_FLAGS); + gpio_pin_configure_dt(&cfg->reset, GPIO_OUTPUT_INACTIVE); - driver->dc = device_get_binding(IL0323_DC_CNTRL); - if (driver->dc == NULL) { + if (!device_is_ready(cfg->dc.port)) { LOG_ERR("Could not get GPIO port for IL0323 DC signal"); return -EIO; } - gpio_pin_configure(driver->dc, IL0323_DC_PIN, GPIO_OUTPUT_INACTIVE | IL0323_DC_FLAGS); + gpio_pin_configure_dt(&cfg->dc, GPIO_OUTPUT_INACTIVE); - driver->busy = device_get_binding(IL0323_BUSY_CNTRL); - if (driver->busy == NULL) { + if (!device_is_ready(cfg->busy.port)) { LOG_ERR("Could not get GPIO port for IL0323 busy signal"); return -EIO; } - gpio_pin_configure(driver->busy, IL0323_BUSY_PIN, GPIO_INPUT | IL0323_BUSY_FLAGS); - -#if defined(IL0323_CS_CNTRL) - driver->cs_ctrl.gpio_dev = device_get_binding(IL0323_CS_CNTRL); - if (!driver->cs_ctrl.gpio_dev) { - LOG_ERR("Unable to get SPI GPIO CS device"); - return -EIO; - } - - driver->cs_ctrl.gpio_pin = IL0323_CS_PIN; - driver->cs_ctrl.gpio_dt_flags = IL0323_CS_FLAGS; - driver->cs_ctrl.delay = 0U; - driver->spi_config.cs = &driver->cs_ctrl; -#endif + gpio_pin_configure_dt(&cfg->busy, GPIO_INPUT); return il0323_controller_init(dev); } -static struct il0323_data il0323_driver; +static struct il0323_cfg il0323_config = { + .spi = SPI_DT_SPEC_INST_GET(0, SPI_OP_MODE_MASTER | SPI_WORD_SET(8), 0), + .reset = GPIO_DT_SPEC_INST_GET(0, reset_gpios), + .busy = GPIO_DT_SPEC_INST_GET(0, busy_gpios), + .dc = GPIO_DT_SPEC_INST_GET(0, dc_gpios), +}; static struct display_driver_api il0323_driver_api = { .blanking_on = il0323_blanking_on, @@ -424,5 +384,5 @@ static struct display_driver_api il0323_driver_api = { .set_orientation = il0323_set_orientation, }; -DEVICE_DT_INST_DEFINE(0, il0323_init, NULL, &il0323_driver, NULL, POST_KERNEL, +DEVICE_DT_INST_DEFINE(0, il0323_init, NULL, NULL, &il0323_config, POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY, &il0323_driver_api); diff --git a/app/drivers/gpio/CMakeLists.txt b/app/drivers/gpio/CMakeLists.txt index f4378151..0756ed38 100644 --- a/app/drivers/gpio/CMakeLists.txt +++ b/app/drivers/gpio/CMakeLists.txt @@ -5,5 +5,4 @@ zephyr_library_named(zmk__drivers__gpio) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) zephyr_library_sources_ifdef(CONFIG_GPIO_595 gpio_595.c) -zephyr_library_sources_ifdef(CONFIG_GPIO_MCP23017 gpio_mcp23017.c) zephyr_library_sources_ifdef(CONFIG_GPIO_MAX7318 gpio_max7318.c) diff --git a/app/drivers/gpio/Kconfig b/app/drivers/gpio/Kconfig index 43c7c24e..54b30590 100644 --- a/app/drivers/gpio/Kconfig +++ b/app/drivers/gpio/Kconfig @@ -1,6 +1,5 @@ menuconfig ZMK_DRIVERS_GPIO bool "GPIO" -rsource "Kconfig.mcp23017" rsource "Kconfig.max7318" rsource "Kconfig.595" diff --git a/app/drivers/gpio/Kconfig.mcp23017 b/app/drivers/gpio/Kconfig.mcp23017 deleted file mode 100644 index 049ca82e..00000000 --- a/app/drivers/gpio/Kconfig.mcp23017 +++ /dev/null @@ -1,22 +0,0 @@ -# MCP23017 GPIO configuration options - -# Copyright (c) 2021 Pete Johanson -# SPDX-License-Identifier: Apache-2.0 - -menuconfig GPIO_MCP23017 - bool "MCP23017 I2C-based GPIO chip" - depends on I2C - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for MCP23017 I2C-based GPIO chip. - -if GPIO_MCP23017 - -config GPIO_MCP23017_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. - -endif #GPIO_MCP23017 diff --git a/app/drivers/gpio/gpio_mcp23017.c b/app/drivers/gpio/gpio_mcp23017.c deleted file mode 100644 index feafbd0a..00000000 --- a/app/drivers/gpio/gpio_mcp23017.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright (c) 2020 Geanix ApS - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#define DT_DRV_COMPAT microchip_mcp23017 - -/** - * @file Driver for MCP23017 SPI-based GPIO driver. - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include "gpio_mcp23017.h" - -#define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include -LOG_MODULE_REGISTER(gpio_mcp23017); - -/** - * @brief Read both port 0 and port 1 registers of certain register function. - * - * Given the register in reg, read the pair of port 0 and port 1. - * - * @param dev Device struct of the MCP23017. - * @param reg Register to read (the PORTA of the pair of registers). - * @param buf Buffer to read data into. - * - * @return 0 if successful, failed otherwise. - */ -static int read_port_regs(const struct device *dev, uint8_t reg, uint16_t *buf) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - uint16_t port_data; - - uint8_t addr = config->slave; - - ret = i2c_burst_read(drv_data->i2c, addr, reg, (uint8_t *)&port_data, sizeof(port_data)); - if (ret) { - LOG_DBG("i2c_write_read FAIL %d\n", ret); - return ret; - } - - *buf = sys_le16_to_cpu(port_data); - - LOG_DBG("MCP23017: Read: REG[0x%X] = 0x%X, REG[0x%X] = 0x%X", reg, (*buf & 0xFF), (reg + 1), - (*buf >> 8)); - - return 0; -} - -/** - * @brief Write both port 0 and port 1 registers of certain register function. - * - * Given the register in reg, write the pair of port 0 and port 1. - * - * @param dev Device struct of the MCP23017. - * @param reg Register to write into (the PORTA of the pair of registers). - * @param buf Buffer to write data from. - * - * @return 0 if successful, failed otherwise. - */ -static int write_port_regs(const struct device *dev, uint8_t reg, uint16_t value) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - uint16_t port_data; - - LOG_DBG("MCP23017: Write: REG[0x%X] = 0x%X, REG[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), - (value >> 8)); - - port_data = sys_cpu_to_le16(value); - - ret = i2c_burst_write(drv_data->i2c, config->slave, reg, (uint8_t *)&port_data, - sizeof(port_data)); - if (ret) { - LOG_DBG("i2c_write FAIL %d\n", ret); - return ret; - } - - return 0; -} - -/** - * @brief Setup the pin direction (input or output) - * - * @param dev Device struct of the MCP23017 - * @param pin The pin number - * @param flags Flags of pin or port - * - * @return 0 if successful, failed otherwise - */ -static int setup_pin_dir(const struct device *dev, uint32_t pin, int flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t *dir = &drv_data->reg_cache.iodir; - uint16_t *output = &drv_data->reg_cache.gpio; - int ret; - - if ((flags & GPIO_OUTPUT) != 0U) { - if ((flags & GPIO_OUTPUT_INIT_HIGH) != 0U) { - *output |= BIT(pin); - } else if ((flags & GPIO_OUTPUT_INIT_LOW) != 0U) { - *output &= ~BIT(pin); - } - *dir &= ~BIT(pin); - } else { - *dir |= BIT(pin); - } - - ret = write_port_regs(dev, REG_GPIO_PORTA, *output); - if (ret != 0) { - return ret; - } - - ret = write_port_regs(dev, REG_IODIR_PORTA, *dir); - - return ret; -} - -/** - * @brief Setup the pin pull up/pull down status - * - * @param dev Device struct of the MCP23017 - * @param pin The pin number - * @param flags Flags of pin or port - * - * @return 0 if successful, failed otherwise - */ -static int setup_pin_pullupdown(const struct device *dev, uint32_t pin, int flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t port; - int ret; - - /* Setup pin pull up or pull down */ - port = drv_data->reg_cache.gppu; - - /* pull down == 0, pull up == 1 */ - if ((flags & GPIO_PULL_DOWN) != 0U) { - return -ENOTSUP; - } - - WRITE_BIT(port, pin, (flags & GPIO_PULL_UP) != 0U); - - ret = write_port_regs(dev, REG_GPPU_PORTA, port); - if (ret == 0) { - drv_data->reg_cache.gppu = port; - } - - return ret; -} - -static int mcp23017_config(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - if ((flags & GPIO_OPEN_DRAIN) != 0U) { - ret = -ENOTSUP; - goto done; - }; - - ret = setup_pin_dir(dev, pin, flags); - if (ret) { - LOG_ERR("MCP23017: error setting pin direction (%d)", ret); - goto done; - } - - ret = setup_pin_pullupdown(dev, pin, flags); - if (ret) { - LOG_ERR("MCP23017: error setting pin pull up/down (%d)", ret); - goto done; - } - -done: - k_sem_give(&drv_data->lock); - return ret; -} - -static int mcp23017_port_get_raw(const struct device *dev, uint32_t *value) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - ret = read_port_regs(dev, REG_GPIO_PORTA, &buf); - if (ret != 0) { - goto done; - } - - *value = buf; - -done: - k_sem_give(&drv_data->lock); - return ret; -} - -static int mcp23017_port_set_masked_raw(const struct device *dev, uint32_t mask, uint32_t value) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - buf = drv_data->reg_cache.gpio; - buf = (buf & ~mask) | (mask & value); - - ret = write_port_regs(dev, REG_GPIO_PORTA, buf); - if (ret == 0) { - drv_data->reg_cache.gpio = buf; - } - - k_sem_give(&drv_data->lock); - - return ret; -} - -static int mcp23017_port_set_bits_raw(const struct device *dev, uint32_t mask) { - return mcp23017_port_set_masked_raw(dev, mask, mask); -} - -static int mcp23017_port_clear_bits_raw(const struct device *dev, uint32_t mask) { - return mcp23017_port_set_masked_raw(dev, mask, 0); -} - -static int mcp23017_port_toggle_bits(const struct device *dev, uint32_t mask) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - buf = drv_data->reg_cache.gpio; - buf ^= mask; - - ret = write_port_regs(dev, REG_GPIO_PORTA, buf); - if (ret == 0) { - drv_data->reg_cache.gpio = buf; - } - - k_sem_give(&drv_data->lock); - - return ret; -} - -static int mcp23017_pin_interrupt_configure(const struct device *dev, gpio_pin_t pin, - enum gpio_int_mode mode, enum gpio_int_trig trig) { - return -ENOTSUP; -} - -static const struct gpio_driver_api api_table = { - .pin_configure = mcp23017_config, - .port_get_raw = mcp23017_port_get_raw, - .port_set_masked_raw = mcp23017_port_set_masked_raw, - .port_set_bits_raw = mcp23017_port_set_bits_raw, - .port_clear_bits_raw = mcp23017_port_clear_bits_raw, - .port_toggle_bits = mcp23017_port_toggle_bits, - .pin_interrupt_configure = mcp23017_pin_interrupt_configure, -}; - -/** - * @brief Initialization function of MCP23017 - * - * @param dev Device struct - * @return 0 if successful, failed otherwise. - */ -static int mcp23017_init(const struct device *dev) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - - drv_data->i2c = device_get_binding((char *)config->i2c_dev_name); - if (!drv_data->i2c) { - LOG_DBG("Unable to get i2c device"); - return -ENODEV; - } - - k_sem_init(&drv_data->lock, 1, 1); - - return 0; -} - -#define MCP23017_INIT(inst) \ - static struct mcp23017_config mcp23017_##inst##_config = { \ - .i2c_dev_name = DT_INST_BUS_LABEL(inst), \ - .slave = DT_INST_REG_ADDR(inst), \ - \ - }; \ - \ - static struct mcp23017_drv_data mcp23017_##inst##_drvdata = { \ - /* Default for registers according to datasheet */ \ - .reg_cache.iodir = 0xFFFF, .reg_cache.ipol = 0x0, .reg_cache.gpinten = 0x0, \ - .reg_cache.defval = 0x0, .reg_cache.intcon = 0x0, .reg_cache.iocon = 0x0, \ - .reg_cache.gppu = 0x0, .reg_cache.intf = 0x0, .reg_cache.intcap = 0x0, \ - .reg_cache.gpio = 0x0, .reg_cache.olat = 0x0, \ - }; \ - \ - /* This has to init after SPI master */ \ - DEVICE_DT_INST_DEFINE(inst, mcp23017_init, NULL, &mcp23017_##inst##_drvdata, \ - &mcp23017_##inst##_config, POST_KERNEL, \ - CONFIG_GPIO_MCP23017_INIT_PRIORITY, &api_table); - -DT_INST_FOREACH_STATUS_OKAY(MCP23017_INIT) diff --git a/app/drivers/gpio/gpio_mcp23017.h b/app/drivers/gpio/gpio_mcp23017.h deleted file mode 100644 index 01908c0c..00000000 --- a/app/drivers/gpio/gpio_mcp23017.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2020 Geanix ApS, Pete Johanson - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @file Header file for the MCP23017 driver. - */ - -#ifndef ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ -#define ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Register definitions */ -#define REG_IODIR_PORTA 0x00 -#define REG_IODIR_PORTB 0x01 -#define REG_IPOL_PORTA 0x02 -#define REG_IPOL_PORTB 0x03 -#define REG_GPINTEN_PORTA 0x04 -#define REG_GPINTEN_PORTB 0x05 -#define REG_DEFVAL_PORTA 0x06 -#define REG_DEFVAL_PORTB 0x07 -#define REG_INTCON_PORTA 0x08 -#define REG_INTCON_PORTB 0x09 -#define REG_GPPU_PORTA 0x0C -#define REG_GPPU_PORTB 0x0D -#define REG_INTF_PORTA 0x0E -#define REG_INTF_PORTB 0x0F -#define REG_INTCAP_PORTA 0x10 -#define REG_INTCAP_PORTB 0x11 -#define REG_GPIO_PORTA 0x12 -#define REG_GPIO_PORTB 0x13 -#define REG_OLAT_PORTA 0x14 -#define REG_OLAT_PORTB 0x15 - -#define MCP23017_ADDR 0x40 -#define MCP23017_READBIT 0x01 - -/** Configuration data */ -struct mcp23017_config { - /* gpio_driver_data needs to be first */ - struct gpio_driver_config common; - - const char *const i2c_dev_name; - const uint16_t slave; -}; - -/** Runtime driver data */ -struct mcp23017_drv_data { - /* gpio_driver_data needs to be first */ - struct gpio_driver_config data; - - /** Master SPI device */ - const struct device *i2c; - - struct k_sem lock; - - struct { - uint16_t iodir; - uint16_t ipol; - uint16_t gpinten; - uint16_t defval; - uint16_t intcon; - uint16_t iocon; - uint16_t gppu; - uint16_t intf; - uint16_t intcap; - uint16_t gpio; - uint16_t olat; - } reg_cache; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ */ diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index b452a9d2..9909a4cf 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -7,7 +7,7 @@ #define DT_DRV_COMPAT zmk_kscan_composite #include -#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -16,13 +16,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define MATRIX_COLS DT_PROP(MATRIX_NODE_ID, columns) struct kscan_composite_child_config { - char *label; + const struct device *child; uint8_t row_offset; uint8_t column_offset; }; #define CHILD_CONFIG(inst) \ - {.label = DT_LABEL(DT_PHANDLE(inst, kscan)), \ + {.child = DEVICE_DT_GET(DT_PHANDLE(inst, kscan)), \ .row_offset = DT_PROP(inst, row_offset), \ .column_offset = DT_PROP(inst, column_offset)}, @@ -41,12 +41,7 @@ static int kscan_composite_enable_callback(const struct device *dev) { for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - const struct device *dev = device_get_binding(cfg->label); - if (!dev) { - LOG_WRN("Failed to load child kscan device %s", cfg->label); - continue; - } - kscan_enable_callback(dev); + kscan_enable_callback(cfg->child); } return 0; } @@ -55,12 +50,7 @@ static int kscan_composite_disable_callback(const struct device *dev) { for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - const struct device *dev = device_get_binding(cfg->label); - if (!dev) { - LOG_WRN("Failed to load child kscan device %s", cfg->label); - continue; - } - kscan_disable_callback(dev); + kscan_disable_callback(cfg->child); } return 0; } @@ -68,13 +58,13 @@ static int kscan_composite_disable_callback(const struct device *dev) { static void kscan_composite_child_callback(const struct device *child_dev, uint32_t row, uint32_t column, bool pressed) { // TODO: Ideally we can get this passed into our callback! - const struct device *dev = device_get_binding(DT_INST_LABEL(0)); + const struct device *dev = DEVICE_DT_GET(DT_DRV_INST(0)); struct kscan_composite_data *data = dev->data; for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - if (device_get_binding(cfg->label) != child_dev) { + if (cfg->child != child_dev) { continue; } @@ -92,7 +82,7 @@ static int kscan_composite_configure(const struct device *dev, kscan_callback_t for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - kscan_config(device_get_binding(cfg->label), &kscan_composite_child_callback); + kscan_config(cfg->child, &kscan_composite_child_callback); } data->callback = callback; diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 3ca300a3..812a899d 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -13,26 +13,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -struct kscan_gpio_item_config { - char *label; - gpio_pin_t pin; - gpio_flags_t flags; -}; - // Helper macro #define PWR_TWO(x) (1 << (x)) -// Define GPIO cfg -#define _KSCAN_GPIO_ITEM_CFG_INIT(n, prop, idx) \ - { \ - .label = DT_INST_GPIO_LABEL_BY_IDX(n, prop, idx), \ - .pin = DT_INST_GPIO_PIN_BY_IDX(n, prop, idx), \ - .flags = DT_INST_GPIO_FLAGS_BY_IDX(n, prop, idx), \ - } - // Define row and col cfg -#define _KSCAN_GPIO_INPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, input_gpios, idx) -#define _KSCAN_GPIO_OUTPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, output_gpios, idx) +#define _KSCAN_GPIO_CFG_INIT(n, prop, idx) GPIO_DT_SPEC_GET_BY_IDX(n, prop, idx), // Check debounce config #define CHECK_DEBOUNCE_CFG(n, a, b) COND_CODE_0(DT_INST_PROP(n, debounce_period), a, b) @@ -51,8 +36,8 @@ struct kscan_gpio_item_config { }; \ \ struct kscan_gpio_config_##n { \ - struct kscan_gpio_item_config rows[INST_MATRIX_INPUTS(n)]; \ - struct kscan_gpio_item_config cols[INST_DEMUX_GPIOS(n)]; \ + const struct gpio_dt_spec rows[INST_MATRIX_INPUTS(n)]; \ + const struct gpio_dt_spec cols[INST_DEMUX_GPIOS(n)]; \ }; \ \ struct kscan_gpio_data_##n { \ @@ -60,33 +45,16 @@ struct kscan_gpio_item_config { struct k_timer poll_timer; \ struct CHECK_DEBOUNCE_CFG(n, (k_work), (k_work_delayable)) work; \ bool matrix_state[INST_MATRIX_INPUTS(n)][INST_MATRIX_OUTPUTS(n)]; \ - const struct device *rows[INST_MATRIX_INPUTS(n)]; \ - const struct device *cols[INST_MATRIX_OUTPUTS(n)]; \ const struct device *dev; \ }; \ /* IO/GPIO SETUP */ \ - /* gpio_input_devices are PHYSICAL IO devices */ \ - static const struct device **kscan_gpio_input_devices_##n(const struct device *dev) { \ - struct kscan_gpio_data_##n *data = dev->data; \ - return data->rows; \ - } \ - \ - static const struct kscan_gpio_item_config *kscan_gpio_input_configs_##n( \ - const struct device *dev) { \ + static const struct gpio_dt_spec *kscan_gpio_input_specs_##n(const struct device *dev) { \ const struct kscan_gpio_config_##n *cfg = dev->config; \ return cfg->rows; \ } \ \ - /* gpio_output_devices are PHYSICAL IO devices */ \ - static const struct device **kscan_gpio_output_devices_##n(const struct device *dev) { \ - struct kscan_gpio_data_##n *data = dev->data; \ - return data->cols; \ - } \ - \ - static const struct kscan_gpio_item_config *kscan_gpio_output_configs_##n( \ - const struct device *dev) { \ + static const struct gpio_dt_spec *kscan_gpio_output_specs_##n(const struct device *dev) { \ const struct kscan_gpio_config_##n *cfg = dev->config; \ - /* If row2col, rows = outputs & cols = inputs */ \ return cfg->cols; \ } \ /* POLLING SETUP */ \ @@ -106,21 +74,16 @@ struct kscan_gpio_item_config { /* Iterate over bits and set GPIOs accordingly */ \ for (uint8_t bit = 0; bit < INST_DEMUX_GPIOS(n); bit++) { \ uint8_t state = (o & (0b1 << bit)) >> bit; \ - const struct device *out_dev = kscan_gpio_output_devices_##n(dev)[bit]; \ - const struct kscan_gpio_item_config *out_cfg = \ - &kscan_gpio_output_configs_##n(dev)[bit]; \ - gpio_pin_set(out_dev, out_cfg->pin, state); \ + const struct gpio_dt_spec *out_spec = &kscan_gpio_output_specs_##n(dev)[bit]; \ + gpio_pin_set_dt(out_spec, state); \ } \ /* Let the col settle before reading the rows */ \ k_usleep(1); \ \ for (int i = 0; i < INST_MATRIX_INPUTS(n); i++) { \ - /* Get the input device (port) */ \ - const struct device *in_dev = kscan_gpio_input_devices_##n(dev)[i]; \ - /* Get the input device config (pin) */ \ - const struct kscan_gpio_item_config *in_cfg = \ - &kscan_gpio_input_configs_##n(dev)[i]; \ - read_state[i][o] = gpio_pin_get(in_dev, in_cfg->pin) > 0; \ + /* Get the input spec */ \ + const struct gpio_dt_spec *in_spec = &kscan_gpio_input_specs_##n(dev)[i]; \ + read_state[i][o] = gpio_pin_get_dt(in_spec) > 0; \ } \ } \ for (int r = 0; r < INST_MATRIX_INPUTS(n); r++) { \ @@ -146,8 +109,7 @@ struct kscan_gpio_item_config { kscan_gpio_read_##n(data->dev); \ } \ \ - static struct kscan_gpio_data_##n kscan_gpio_data_##n = { \ - .rows = {[INST_MATRIX_INPUTS(n) - 1] = NULL}, .cols = {[INST_DEMUX_GPIOS(n) - 1] = NULL}}; \ + static struct kscan_gpio_data_##n kscan_gpio_data_##n = {}; \ \ /* KSCAN API configure function */ \ static int kscan_gpio_configure_##n(const struct device *dev, kscan_callback_t callback) { \ @@ -185,20 +147,18 @@ struct kscan_gpio_item_config { struct kscan_gpio_data_##n *data = dev->data; \ int err; \ /* configure input devices*/ \ - const struct device **input_devices = kscan_gpio_input_devices_##n(dev); \ for (int i = 0; i < INST_MATRIX_INPUTS(n); i++) { \ - const struct kscan_gpio_item_config *in_cfg = &kscan_gpio_input_configs_##n(dev)[i]; \ - input_devices[i] = device_get_binding(in_cfg->label); \ - if (!input_devices[i]) { \ + const struct gpio_dt_spec *in_spec = &kscan_gpio_input_specs_##n(dev)[i]; \ + if (!device_is_ready(in_spec->port)) { \ LOG_ERR("Unable to find input GPIO device"); \ return -EINVAL; \ } \ - err = gpio_pin_configure(input_devices[i], in_cfg->pin, GPIO_INPUT | in_cfg->flags); \ + err = gpio_pin_configure_dt(in_spec, GPIO_INPUT); \ if (err) { \ - LOG_ERR("Unable to configure pin %d on %s for input", in_cfg->pin, in_cfg->label); \ + LOG_ERR("Unable to configure pin %d for input", in_spec->pin); \ return err; \ } else { \ - LOG_DBG("Configured pin %d on %s for input", in_cfg->pin, in_cfg->label); \ + LOG_DBG("Configured pin %d for input", in_spec->pin); \ } \ if (err) { \ LOG_ERR("Error adding the callback to the column device"); \ @@ -206,22 +166,18 @@ struct kscan_gpio_item_config { } \ } \ /* configure output devices*/ \ - const struct device **output_devices = kscan_gpio_output_devices_##n(dev); \ for (int o = 0; o < INST_DEMUX_GPIOS(n); o++) { \ - const struct kscan_gpio_item_config *out_cfg = &kscan_gpio_output_configs_##n(dev)[o]; \ - output_devices[o] = device_get_binding(out_cfg->label); \ - if (!output_devices[o]) { \ + const struct gpio_dt_spec *out_spec = &kscan_gpio_output_specs_##n(dev)[o]; \ + if (!device_is_ready(out_spec->port)) { \ LOG_ERR("Unable to find output GPIO device"); \ return -EINVAL; \ } \ - err = gpio_pin_configure(output_devices[o], out_cfg->pin, \ - GPIO_OUTPUT_ACTIVE | out_cfg->flags); \ + err = gpio_pin_configure_dt(out_spec, GPIO_OUTPUT_ACTIVE); \ if (err) { \ - LOG_ERR("Unable to configure pin %d on %s for output", out_cfg->pin, \ - out_cfg->label); \ + LOG_ERR("Unable to configure pin %d for output", out_spec->pin); \ return err; \ } else { \ - LOG_DBG("Configured pin %d on %s for output", out_cfg->pin, out_cfg->label); \ + LOG_DBG("Configured pin %d for output", out_spec->pin); \ } \ } \ data->dev = dev; \ @@ -240,8 +196,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (, ), n)}, \ - .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (, ), n)}, \ + .rows = {DT_FOREACH_PROP_ELEM(DT_DRV_INST(n), input_gpios, _KSCAN_GPIO_CFG_INIT)}, \ + .cols = {DT_FOREACH_PROP_ELEM(DT_DRV_INST(n), output_gpios, _KSCAN_GPIO_CFG_INIT)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index bc35d002..655af3db 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -8,9 +8,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include "battery_common.h" @@ -21,22 +21,15 @@ struct io_channel_config { uint8_t channel; }; -struct gpio_channel_config { - const char *label; - uint8_t pin; - uint8_t flags; -}; - struct bvd_config { struct io_channel_config io_channel; - struct gpio_channel_config power_gpios; + struct gpio_dt_spec power; uint32_t output_ohm; uint32_t full_ohm; }; struct bvd_data { const struct device *adc; - const struct device *gpio; struct adc_channel_cfg acc; struct adc_sequence as; struct battery_value value; @@ -56,19 +49,19 @@ static int bvd_sample_fetch(const struct device *dev, enum sensor_channel chan) int rc = 0; - // Enable power GPIO if present - if (drv_data->gpio) { - rc = gpio_pin_set(drv_data->gpio, drv_cfg->power_gpios.pin, 1); +#if DT_INST_NODE_HAS_PROP(0, power_gpios) + // Enable power before sampling + rc = gpio_pin_set_dt(&drv_cfg->power, 1); - if (rc != 0) { - LOG_DBG("Failed to enable ADC power GPIO: %d", rc); - return rc; - } - - // wait for any capacitance to charge up - k_sleep(K_MSEC(10)); + if (rc != 0) { + LOG_DBG("Failed to enable ADC power GPIO: %d", rc); + return rc; } + // wait for any capacitance to charge up + k_sleep(K_MSEC(10)); +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) + // Read ADC rc = adc_read(drv_data->adc, as); as->calibrate = false; @@ -90,15 +83,15 @@ static int bvd_sample_fetch(const struct device *dev, enum sensor_channel chan) LOG_DBG("Failed to read ADC: %d", rc); } +#if DT_INST_NODE_HAS_PROP(0, power_gpios) // Disable power GPIO if present - if (drv_data->gpio) { - int rc2 = gpio_pin_set(drv_data->gpio, drv_cfg->power_gpios.pin, 0); + int rc2 = gpio_pin_set_dt(&drv_cfg->power, 0); - if (rc2 != 0) { - LOG_DBG("Failed to disable ADC power GPIO: %d", rc2); - return rc2; - } + if (rc2 != 0) { + LOG_DBG("Failed to disable ADC power GPIO: %d", rc2); + return rc2; } +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) return rc; } @@ -125,20 +118,17 @@ static int bvd_init(const struct device *dev) { int rc = 0; - if (drv_cfg->power_gpios.label) { - drv_data->gpio = device_get_binding(drv_cfg->power_gpios.label); - if (drv_data->gpio == NULL) { - LOG_ERR("Failed to get GPIO %s", drv_cfg->power_gpios.label); - return -ENODEV; - } - rc = gpio_pin_configure(drv_data->gpio, drv_cfg->power_gpios.pin, - GPIO_OUTPUT_INACTIVE | drv_cfg->power_gpios.flags); - if (rc != 0) { - LOG_ERR("Failed to control feed %s.%u: %d", drv_cfg->power_gpios.label, - drv_cfg->power_gpios.pin, rc); - return rc; - } +#if DT_INST_NODE_HAS_PROP(0, power_gpios) + if (!device_is_ready(drv_cfg->power.port)) { + LOG_ERR("GPIO port for power control is not ready"); + return -ENODEV; } + rc = gpio_pin_configure_dt(&drv_cfg->power, GPIO_OUTPUT_INACTIVE); + if (rc != 0) { + LOG_ERR("Failed to control feed %u: %d", drv_cfg->power.pin, rc); + return rc; + } +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) drv_data->as = (struct adc_sequence){ .channels = BIT(0), @@ -175,12 +165,7 @@ static const struct bvd_config bvd_cfg = { DT_IO_CHANNELS_INPUT(DT_DRV_INST(0)), }, #if DT_INST_NODE_HAS_PROP(0, power_gpios) - .power_gpios = - { - DT_INST_GPIO_LABEL(0, power_gpios), - DT_INST_GPIO_PIN(0, power_gpios), - DT_INST_GPIO_FLAGS(0, power_gpios), - }, + .power = GPIO_DT_SPEC_INST_GET(0, power_gpios), #endif .output_ohm = DT_INST_PROP(0, output_ohms), .full_ohm = DT_INST_PROP(0, full_ohms), diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 5f26ebc3..7091f73e 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -19,11 +19,9 @@ LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL); static int ec11_get_ab_state(const struct device *dev) { - struct ec11_data *drv_data = dev->data; const struct ec11_config *drv_cfg = dev->config; - return (gpio_pin_get(drv_data->a, drv_cfg->a_pin) << 1) | - gpio_pin_get(drv_data->b, drv_cfg->b_pin); + return (gpio_pin_get_dt(&drv_cfg->a) << 1) | gpio_pin_get_dt(&drv_cfg->b); } static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) { @@ -94,27 +92,25 @@ int ec11_init(const struct device *dev) { struct ec11_data *drv_data = dev->data; const struct ec11_config *drv_cfg = dev->config; - LOG_DBG("A: %s %d B: %s %d resolution %d", drv_cfg->a_label, drv_cfg->a_pin, drv_cfg->b_label, - drv_cfg->b_pin, drv_cfg->resolution); + LOG_DBG("A: %s %d B: %s %d resolution %d", drv_cfg->a.port->name, drv_cfg->a.pin, + drv_cfg->b.port->name, drv_cfg->b.pin, drv_cfg->resolution); - drv_data->a = device_get_binding(drv_cfg->a_label); - if (drv_data->a == NULL) { - LOG_ERR("Failed to get pointer to A GPIO device"); + if (!device_is_ready(drv_cfg->a.port)) { + LOG_ERR("A GPIO device is not ready"); return -EINVAL; } - drv_data->b = device_get_binding(drv_cfg->b_label); - if (drv_data->b == NULL) { - LOG_ERR("Failed to get pointer to B GPIO device"); + if (!device_is_ready(drv_cfg->b.port)) { + LOG_ERR("B GPIO device is not ready"); return -EINVAL; } - if (gpio_pin_configure(drv_data->a, drv_cfg->a_pin, drv_cfg->a_flags | GPIO_INPUT)) { + if (gpio_pin_configure_dt(&drv_cfg->a, GPIO_INPUT)) { LOG_DBG("Failed to configure A pin"); return -EIO; } - if (gpio_pin_configure(drv_data->b, drv_cfg->b_pin, drv_cfg->b_flags | GPIO_INPUT)) { + if (gpio_pin_configure_dt(&drv_cfg->b, GPIO_INPUT)) { LOG_DBG("Failed to configure B pin"); return -EIO; } @@ -134,12 +130,8 @@ int ec11_init(const struct device *dev) { #define EC11_INST(n) \ struct ec11_data ec11_data_##n; \ const struct ec11_config ec11_cfg_##n = { \ - .a_label = DT_INST_GPIO_LABEL(n, a_gpios), \ - .a_pin = DT_INST_GPIO_PIN(n, a_gpios), \ - .a_flags = DT_INST_GPIO_FLAGS(n, a_gpios), \ - .b_label = DT_INST_GPIO_LABEL(n, b_gpios), \ - .b_pin = DT_INST_GPIO_PIN(n, b_gpios), \ - .b_flags = DT_INST_GPIO_FLAGS(n, b_gpios), \ + .a = GPIO_DT_SPEC_INST_GET(n, a_gpios), \ + .b = GPIO_DT_SPEC_INST_GET(n, b_gpios), \ COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \ }; \ DEVICE_DT_INST_DEFINE(n, ec11_init, NULL, &ec11_data_##n, &ec11_cfg_##n, POST_KERNEL, \ diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 04750df5..82c21572 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -11,20 +11,13 @@ #include struct ec11_config { - const char *a_label; - const uint8_t a_pin; - const uint8_t a_flags; - - const char *b_label; - const uint8_t b_pin; - const uint8_t b_flags; + const struct gpio_dt_spec a; + const struct gpio_dt_spec b; const uint8_t resolution; }; struct ec11_data { - const struct device *a; - const struct device *b; uint8_t ab_state; int8_t pulses; int8_t ticks; diff --git a/app/drivers/sensor/ec11/ec11_trigger.c b/app/drivers/sensor/ec11/ec11_trigger.c index 804a21d9..f9384a66 100644 --- a/app/drivers/sensor/ec11/ec11_trigger.c +++ b/app/drivers/sensor/ec11/ec11_trigger.c @@ -20,18 +20,15 @@ extern struct ec11_data ec11_driver; LOG_MODULE_DECLARE(EC11, CONFIG_SENSOR_LOG_LEVEL); static inline void setup_int(const struct device *dev, bool enable) { - struct ec11_data *data = dev->data; const struct ec11_config *cfg = dev->config; LOG_DBG("enabled %s", (enable ? "true" : "false")); - if (gpio_pin_interrupt_configure(data->a, cfg->a_pin, - enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { + if (gpio_pin_interrupt_configure_dt(&cfg->a, enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { LOG_WRN("Unable to set A pin GPIO interrupt"); } - if (gpio_pin_interrupt_configure(data->b, cfg->b_pin, - enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { + if (gpio_pin_interrupt_configure_dt(&cfg->b, enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { LOG_WRN("Unable to set A pin GPIO interrupt"); } } @@ -121,16 +118,16 @@ int ec11_init_interrupt(const struct device *dev) { drv_data->dev = dev; /* setup gpio interrupt */ - gpio_init_callback(&drv_data->a_gpio_cb, ec11_a_gpio_callback, BIT(drv_cfg->a_pin)); + gpio_init_callback(&drv_data->a_gpio_cb, ec11_a_gpio_callback, BIT(drv_cfg->a.pin)); - if (gpio_add_callback(drv_data->a, &drv_data->a_gpio_cb) < 0) { + if (gpio_add_callback(drv_cfg->a.port, &drv_data->a_gpio_cb) < 0) { LOG_DBG("Failed to set A callback!"); return -EIO; } - gpio_init_callback(&drv_data->b_gpio_cb, ec11_b_gpio_callback, BIT(drv_cfg->b_pin)); + gpio_init_callback(&drv_data->b_gpio_cb, ec11_b_gpio_callback, BIT(drv_cfg->b.pin)); - if (gpio_add_callback(drv_data->b, &drv_data->b_gpio_cb) < 0) { + if (gpio_add_callback(drv_cfg->b.port, &drv_data->b_gpio_cb) < 0) { LOG_DBG("Failed to set B callback!"); return -EIO; } diff --git a/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml b/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml deleted file mode 100644 index 75e19c49..00000000 --- a/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# -# Copyright (c) 2020 Geanix ApS -# -# SPDX-License-Identifier: Apache-2.0 -# - -description: > - This is a representation of the Microchip MCP23017 I2C Gpio Expander. - -compatible: "microchip,mcp23017" - -include: [gpio-controller.yaml, i2c-device.yaml] - -properties: - label: - required: true - - "#gpio-cells": - const: 2 - - ngpios: - type: int - required: true - const: 16 - description: Number of gpios supported - -gpio-cells: - - pin - - flags diff --git a/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml b/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml index 43fa7511..605c969d 100644 --- a/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml +++ b/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml @@ -12,9 +12,6 @@ compatible: "zmk,gpio-595" include: [gpio-controller.yaml, spi-device.yaml] properties: - label: - required: true - "#gpio-cells": const: 2 diff --git a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml index a8904360..28b7541b 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml @@ -4,8 +4,3 @@ description: Battery SoC monitoring using nRF VDDH compatible: "zmk,battery-nrf-vddh" - -properties: - label: - required: true - type: string diff --git a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml index c4c6f80c..d9e07b79 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml @@ -6,8 +6,3 @@ description: Battery SoC monitoring using voltage divider compatible: "zmk,battery-voltage-divider" include: voltage-divider.yaml - -properties: - label: - required: true - type: string diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 1195b943..a47cd505 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -25,7 +25,7 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr #define ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) \ { \ - .behavior_dev = DT_LABEL(DT_PHANDLE_BY_IDX(drv_inst, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_PHANDLE_BY_IDX(drv_inst, bindings, idx), label), \ .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(drv_inst, bindings, idx, param1), (0), \ (DT_PHA_BY_IDX(drv_inst, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(drv_inst, bindings, idx, param2), (0), \ diff --git a/app/include/zmk/kscan.h b/app/include/zmk/kscan.h index 33526008..eebe41e7 100644 --- a/app/include/zmk/kscan.h +++ b/app/include/zmk/kscan.h @@ -6,4 +6,6 @@ #pragma once -int zmk_kscan_init(char *name); +#include + +int zmk_kscan_init(const struct device *dev); diff --git a/app/src/activity.c b/app/src/activity.c index 41fe2e15..46af56fb 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 971816f2..1511e755 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -28,8 +28,8 @@ static void behavior_queue_process_next(struct k_work *work) { struct q_item item = {.wait = 0}; while (k_msgq_get(&zmk_behavior_queue_msgq, &item, K_NO_WAIT) == 0) { - LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, - item.binding.param1, item.binding.param2); + LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, item.binding.param1, + item.binding.param2); struct zmk_behavior_binding_event event = {.position = item.position, .timestamp = k_uptime_get()}; diff --git a/app/src/behaviors/behavior_bt.c b/app/src/behaviors/behavior_bt.c index 71cf2322..6d44b5f5 100644 --- a/app/src/behaviors/behavior_bt.c +++ b/app/src/behaviors/behavior_bt.c @@ -16,7 +16,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include - #include #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 8ee5bb5c..4c9fd711 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -166,9 +166,10 @@ static int behavior_caps_word_init(const struct device *dev) { #define CAPS_WORD_LABEL(i, _n) DT_INST_LABEL(i) #define PARSE_BREAK(i) \ - {.page = ZMK_HID_USAGE_PAGE(i), \ - .id = ZMK_HID_USAGE_ID(i), \ - .implicit_modifiers = SELECT_MODS(i)} + { \ + .page = ZMK_HID_USAGE_PAGE(i), .id = ZMK_HID_USAGE_ID(i), \ + .implicit_modifiers = SELECT_MODS(i) \ + } #define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i)) @@ -177,7 +178,7 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ - .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (,), n)}, \ + .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, NULL, &behavior_caps_word_data_##n, \ diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 6ea2fe97..30350ef2 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -700,8 +700,8 @@ static int behavior_hold_tap_init(const struct device *dev) { #define KP_INST(n) \ static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ - .hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ - .tap_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index c86d732a..e84f1fc8 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -44,13 +44,13 @@ struct behavior_macro_config { struct zmk_behavior_binding bindings[]; }; -#define TAP_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_tap)) -#define PRESS_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_press)) -#define REL_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_release)) +#define TAP_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_tap), label) +#define PRESS_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_press), label) +#define REL_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_release), label) -#define TAP_TIME DT_LABEL(DT_INST(0, zmk_macro_control_tap_time)) -#define WAIT_TIME DT_LABEL(DT_INST(0, zmk_macro_control_wait_time)) -#define WAIT_REL DT_LABEL(DT_INST(0, zmk_macro_pause_for_release)) +#define TAP_TIME DT_PROP(DT_INST(0, zmk_macro_control_tap_time), label) +#define WAIT_TIME DT_PROP(DT_INST(0, zmk_macro_control_wait_time), label) +#define WAIT_REL DT_PROP(DT_INST(0, zmk_macro_pause_for_release), label) #define ZM_IS_NODE_MATCH(a, b) (strcmp(a, b) == 0) #define IS_TAP_MODE(dev) ZM_IS_NODE_MATCH(dev, TAP_MODE) @@ -169,7 +169,7 @@ static const struct behavior_driver_api behavior_macro_driver_api = { #define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) #define TRANSFORMED_BEHAVIORS(n) \ - {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (,), n)}, + {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (, ), n)}, #define MACRO_INST(n) \ static struct behavior_macro_state behavior_macro_state_##n = {}; \ diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index e5ba346e..d540abd9 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -81,7 +81,7 @@ static int behavior_mod_morph_init(const struct device *dev) { return 0; } #define _TRANSFORM_ENTRY(idx, node) \ { \ - .behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(node, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(node, bindings, idx), label), \ .param1 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param1), (0), \ (DT_INST_PHA_BY_IDX(node, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param2), (0), \ diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index ddb4aeab..fc685124 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -240,7 +240,7 @@ static int behavior_tap_dance_init(const struct device *dev) { #define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node) #define TRANSFORMED_BINDINGS(node) \ - { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (,), DT_DRV_INST(node)) } + { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (, ), DT_DRV_INST(node)) } #define KP_INST(n) \ static struct zmk_behavior_binding \ diff --git a/app/src/display/main.c b/app/src/display/main.c index 52fa3c69..e34f8a53 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -12,7 +12,7 @@ #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include +#include #include #include "theme.h" @@ -21,9 +21,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#define ZMK_DISPLAY_NAME CONFIG_LV_Z_DISPLAY_DEV_NAME - -static const struct device *display; +static const struct device *display = DEVICE_DT_GET(DT_CHOSEN(zephyr_display)); static bool initialized = false; static lv_obj_t *screen; @@ -103,8 +101,7 @@ static void initialize_theme() { void initialize_display(struct k_work *work) { LOG_DBG(""); - display = device_get_binding(ZMK_DISPLAY_NAME); - if (display == NULL) { + if (!device_is_ready(display)) { LOG_ERR("Failed to find display device"); return; } @@ -165,4 +162,4 @@ int display_event_handler(const zmk_event_t *eh) { ZMK_LISTENER(display, display_event_handler); ZMK_SUBSCRIPTION(display, zmk_activity_state_changed); -#endif /* IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) */ \ No newline at end of file +#endif /* IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) */ diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 654f683f..e35714da 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -22,14 +22,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct ext_power_generic_config { - const char *label; - const uint8_t pin; - const uint8_t flags; + const struct gpio_dt_spec control; const uint16_t init_delay_ms; }; struct ext_power_generic_data { - const struct device *gpio; bool status; #if IS_ENABLED(CONFIG_SETTINGS) bool settings_init; @@ -39,10 +36,10 @@ struct ext_power_generic_data { #if IS_ENABLED(CONFIG_SETTINGS) static void ext_power_save_state_work(struct k_work *work) { char setting_path[40]; - const struct device *ext_power = device_get_binding(DT_INST_LABEL(0)); + const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); struct ext_power_generic_data *data = ext_power->data; - snprintf(setting_path, 40, "ext_power/state/%s", DT_INST_LABEL(0)); + snprintf(setting_path, 40, "ext_power/state/%s", DT_INST_PROP(0, label)); settings_save_one(setting_path, &data->status, sizeof(data->status)); } @@ -62,7 +59,7 @@ static int ext_power_generic_enable(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - if (gpio_pin_set(data->gpio, config->pin, 1)) { + if (gpio_pin_set_dt(&config->control, 1)) { LOG_WRN("Failed to set ext-power control pin"); return -EIO; } @@ -74,7 +71,8 @@ static int ext_power_generic_disable(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - if (gpio_pin_set(data->gpio, config->pin, 0)) { + if (gpio_pin_set_dt(&config->control, 0)) { + LOG_WRN("Failed to set ext-power control pin"); LOG_WRN("Failed to clear ext-power control pin"); return -EIO; } @@ -93,7 +91,7 @@ static int ext_power_settings_set(const char *name, size_t len, settings_read_cb const char *next; int rc; - if (settings_name_steq(name, DT_INST_LABEL(0), &next) && !next) { + if (settings_name_steq(name, DT_INST_PROP(0, label), &next) && !next) { const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); struct ext_power_generic_data *data = ext_power->data; @@ -106,7 +104,7 @@ static int ext_power_settings_set(const char *name, size_t len, settings_read_cb data->settings_init = true; if (ext_power == NULL) { - LOG_ERR("Unable to retrieve ext_power device: %s", DT_INST_LABEL(0)); + LOG_ERR("Unable to retrieve ext_power device: %s", DT_INST_PROP(0, label)); return -EIO; } @@ -131,13 +129,7 @@ static int ext_power_generic_init(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - data->gpio = device_get_binding(config->label); - if (data->gpio == NULL) { - LOG_ERR("Failed to get ext-power control device"); - return -EINVAL; - } - - if (gpio_pin_configure(data->gpio, config->pin, config->flags | GPIO_OUTPUT)) { + if (gpio_pin_configure_dt(&config->control, GPIO_OUTPUT_INACTIVE)) { LOG_ERR("Failed to configure ext-power control pin"); return -EIO; } @@ -190,9 +182,7 @@ static int ext_power_generic_pm_action(const struct device *dev, enum pm_device_ #endif /* CONFIG_PM_DEVICE */ static const struct ext_power_generic_config config = { - .label = DT_INST_GPIO_LABEL(0, control_gpios), - .pin = DT_INST_GPIO_PIN(0, control_gpios), - .flags = DT_INST_GPIO_FLAGS(0, control_gpios), + .control = GPIO_DT_SPEC_INST_GET(0, control_gpios), .init_delay_ms = DT_INST_PROP_OR(0, init_delay_ms, 0)}; static struct ext_power_generic_data data = { diff --git a/app/src/keymap.c b/app/src/keymap.c index 99483592..c4e304d4 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -42,7 +42,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ { \ - .behavior_dev = DT_LABEL(DT_PHANDLE_BY_IDX(layer, sensor_bindings, idx)), \ + .behavior_dev = DT_PROP(DT_PHANDLE_BY_IDX(layer, sensor_bindings, idx), label), \ .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param1), (0), \ (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param2), (0), \ @@ -57,7 +57,8 @@ static uint8_t _zmk_keymap_layer_default = 0; #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#define LAYER_LABEL(node) COND_CODE_0(DT_NODE_HAS_PROP(node, label), (NULL), (DT_LABEL(node))), +#define LAYER_LABEL(node) \ + COND_CODE_0(DT_NODE_HAS_PROP(node, label), (NULL), (DT_PROP(node, label))), // State diff --git a/app/src/kscan.c b/app/src/kscan.c index f9db8b1c..b0713320 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -58,8 +58,7 @@ void zmk_kscan_process_msgq(struct k_work *item) { } } -int zmk_kscan_init(char *name) { - const struct device *dev = device_get_binding(name); +int zmk_kscan_init(const struct device *dev) { if (dev == NULL) { LOG_ERR("Failed to get the KSCAN device"); return -EINVAL; diff --git a/app/src/main.c b/app/src/main.c index 8ea67057..3fd6b116 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -17,12 +17,10 @@ LOG_MODULE_REGISTER(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#define ZMK_KSCAN_DEV DT_LABEL(ZMK_MATRIX_NODE_ID) - void main(void) { LOG_INF("Welcome to ZMK!\n"); - if (zmk_kscan_init(ZMK_KSCAN_DEV) != 0) { + if (zmk_kscan_init(DEVICE_DT_GET(ZMK_MATRIX_NODE_ID)) != 0) { return; } diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 47c3658e..0ed2087a 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -27,8 +27,14 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#define STRIP_LABEL DT_LABEL(DT_CHOSEN(zmk_underglow)) -#define STRIP_NUM_PIXELS DT_PROP(DT_CHOSEN(zmk_underglow), chain_length) +#if !DT_CHOSEN(zmk_underglow) + +#error "A zmk,underglow chosen node must be declared" + +#endif + +#define STRIP_CHOSEN DT_CHOSEN(zmk_underglow) +#define STRIP_NUM_PIXELS DT_PROP(STRIP_CHOSEN, chain_length) #define HUE_MAX 360 #define SAT_MAX 100 @@ -230,13 +236,7 @@ static struct k_work_delayable underglow_save_work; #endif static int zmk_rgb_underglow_init(const struct device *_arg) { - led_strip = device_get_binding(STRIP_LABEL); - if (led_strip) { - LOG_INF("Found LED strip device %s", STRIP_LABEL); - } else { - LOG_ERR("LED strip device %s not found", STRIP_LABEL); - return -EINVAL; - } + led_strip = DEVICE_DT_GET(STRIP_CHOSEN); #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) ext_power = device_get_binding("EXT_POWER"); diff --git a/app/src/sensors.c b/app/src/sensors.c index 9873de4f..efae2bd9 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -65,7 +65,8 @@ static void zmk_sensors_init_item(const char *node, uint8_t i, uint8_t abs_i) { sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); } -#define _SENSOR_INIT(node) zmk_sensors_init_item(DT_LABEL(node), local_index++, absolute_index++); +#define _SENSOR_INIT(node) \ + zmk_sensors_init_item(DT_PROP(node, label), local_index++, absolute_index++); #define SENSOR_INIT(idx, _i) \ COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ (_SENSOR_INIT(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), (absolute_index++;)) diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 5b952dfc..ac073c59 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -377,8 +377,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { bt_uuid_to_str(&uuid.uuid, uuid_str, sizeof(uuid_str)); bt_uuid_to_str(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID), service_uuid_str, sizeof(service_uuid_str)); - LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, - service_uuid_str); + LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, service_uuid_str); continue; } @@ -433,8 +432,7 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui char dev[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, dev, sizeof(dev)); - LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, - rssi); + LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, rssi); /* We're only interested in connectable events */ if (type == BT_GAP_ADV_TYPE_ADV_IND || type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index fa4b7718..f7b0d587 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -60,8 +60,8 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt .param2 = payload->data.param2, .behavior_dev = payload->behavior_dev, }; - LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, - binding.param1, binding.param2, payload->data.state); + LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, binding.param1, + binding.param2, payload->data.state); struct zmk_behavior_binding_event event = {.position = payload->data.position, .timestamp = k_uptime_get()}; int err; diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index e65bb296..6d026f2b 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -258,8 +258,8 @@ An example of this can be seen below, taking the `#define KP_INST(n)` from the h #define KP_INST(n) \ static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ - .hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ - .tap_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ From 4ff1a4d3ea98390325e6330802e56381f9e910d5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 01:52:25 -0400 Subject: [PATCH 038/134] refactor: Move to updated Docker images. --- .devcontainer/Dockerfile | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/hardware-metadata-validation.yml | 2 +- .github/workflows/test.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 21a7fd5a..5b69e180 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/zmkfirmware/zmk-dev-arm:3.0 +FROM docker.io/zmkfirmware/zmk-dev-arm:3.2 COPY .bashrc tmp RUN mv /tmp/.bashrc ~/.bashrc diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6305b741..f472f755 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: if: ${{ always() }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.0 + image: docker.io/zmkfirmware/zmk-build-arm:3.2 needs: compile-matrix strategy: matrix: diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index c6566feb..4b10a28b 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -29,7 +29,7 @@ jobs: validate-metadata: runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-dev-arm:3.0 + image: docker.io/zmkfirmware/zmk-dev-arm:3.2 steps: - uses: actions/checkout@v3 - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 38c61eea..e8a9d220 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,7 @@ jobs: test: ${{ fromJSON(needs.collect-tests.outputs.test-dirs) }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.0 + image: docker.io/zmkfirmware/zmk-build-arm:3.2 steps: - name: Checkout uses: actions/checkout@v3 From 31f664ffec0e90fe2123e1dfcaca4b34654d4714 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 23 Dec 2021 23:45:29 -0500 Subject: [PATCH 039/134] fix(boards): Base config/overlay for rp2040 boards Baseline config and overlay for the following: * `rpi_pico` * `adafruit_kb2040` * `sparkfun_pro_micro_rp2040` * `adafruit_qt_py_rp2040` * `seeeduino_xiao_rp2040` * `boardsource_blok` * `01space_rp2040_042lcd` Co-authored-by: Joel Spadin --- app/boards/01space_rp2040_042lcd.conf | 6 ++++++ app/boards/01space_rp2040_042lcd.overlay | 9 +++++++++ app/boards/adafruit_kb2040.conf | 4 ++++ app/boards/adafruit_kb2040.overlay | 9 +++++++++ app/boards/adafruit_qt_py_rp2040.conf | 4 ++++ app/boards/adafruit_qt_py_rp2040.overlay | 9 +++++++++ .../adafruit_kb2040/adafruit_kb2040.zmk.yml | 9 +++++++++ .../adafruit_qt_py_rp2040.zmk.yml | 9 +++++++++ .../boardsource_blok/boardsource_blok.zmk.yml | 9 +++++++++ .../seeeduino_xiao_rp2040.zmk.yml | 9 +++++++++ .../sparkfun_pro_micro_rp2040.zmk.yml | 9 +++++++++ app/boards/boardsource_blok.conf | 4 ++++ app/boards/boardsource_blok.overlay | 9 +++++++++ app/boards/rpi_pico.conf | 5 +++++ app/boards/rpi_pico.overlay | 8 ++++++++ app/boards/seeeduino_xiao_rp2040.conf | 4 ++++ app/boards/seeeduino_xiao_rp2040.overlay | 9 +++++++++ app/boards/sparkfun_pro_micro_rp2040.conf | 4 ++++ app/boards/sparkfun_pro_micro_rp2040.overlay | 9 +++++++++ app/boards/usb_console.dtsi | 20 +++++++++++++++++++ 20 files changed, 158 insertions(+) create mode 100644 app/boards/01space_rp2040_042lcd.conf create mode 100644 app/boards/01space_rp2040_042lcd.overlay create mode 100644 app/boards/adafruit_kb2040.conf create mode 100644 app/boards/adafruit_kb2040.overlay create mode 100644 app/boards/adafruit_qt_py_rp2040.conf create mode 100644 app/boards/adafruit_qt_py_rp2040.overlay create mode 100644 app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml create mode 100644 app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml create mode 100644 app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml create mode 100644 app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml create mode 100644 app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml create mode 100644 app/boards/boardsource_blok.conf create mode 100644 app/boards/boardsource_blok.overlay create mode 100644 app/boards/rpi_pico.conf create mode 100644 app/boards/rpi_pico.overlay create mode 100644 app/boards/seeeduino_xiao_rp2040.conf create mode 100644 app/boards/seeeduino_xiao_rp2040.overlay create mode 100644 app/boards/sparkfun_pro_micro_rp2040.conf create mode 100644 app/boards/sparkfun_pro_micro_rp2040.overlay create mode 100644 app/boards/usb_console.dtsi diff --git a/app/boards/01space_rp2040_042lcd.conf b/app/boards/01space_rp2040_042lcd.conf new file mode 100644 index 00000000..c520a3b7 --- /dev/null +++ b/app/boards/01space_rp2040_042lcd.conf @@ -0,0 +1,6 @@ +CONFIG_ZMK_DISPLAY=y +CONFIG_LV_FONT_UNSCII_8=n +CONFIG_ZMK_USB=y +CONFIG_I2C=y +CONFIG_I2C_DW=y +CONFIG_LV_Z_VDB_SIZE=50 diff --git a/app/boards/01space_rp2040_042lcd.overlay b/app/boards/01space_rp2040_042lcd.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/01space_rp2040_042lcd.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/adafruit_kb2040.conf b/app/boards/adafruit_kb2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/adafruit_kb2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/adafruit_kb2040.overlay b/app/boards/adafruit_kb2040.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/adafruit_kb2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/adafruit_qt_py_rp2040.conf b/app/boards/adafruit_qt_py_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/adafruit_qt_py_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/adafruit_qt_py_rp2040.overlay b/app/boards/adafruit_qt_py_rp2040.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/adafruit_qt_py_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml b/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml new file mode 100644 index 00000000..c8973f5c --- /dev/null +++ b/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: adafruit_kb2040 +name: Adafruit KB2040 +type: board +arch: arm +outputs: + - usb +url: https://www.adafruit.com/product/5302 +exposes: [pro_micro] diff --git a/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml b/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml new file mode 100644 index 00000000..9b9c1450 --- /dev/null +++ b/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: adafruit_qt_py_rp2040 +name: Adafruit QT Py RP2040 +type: board +arch: arm +outputs: + - usb +url: https://www.adafruit.com/product/4900 +exposes: [seeed_xiao] diff --git a/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml b/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml new file mode 100644 index 00000000..a6e91afd --- /dev/null +++ b/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: boardsource_blok +name: BoardSource blok +type: board +arch: arm +outputs: + - usb +url: https://peg.software/docs/blok +exposes: [pro_micro] diff --git a/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml new file mode 100644 index 00000000..77d8d664 --- /dev/null +++ b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: seeeduino_xiao_rp2040 +name: Seeeduino XIAO RP2040 +type: board +arch: arm +outputs: + - usb +url: https://wiki.seeedstudio.com/XIAO-RP2040/ +exposes: [seeed_xiao] diff --git a/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml b/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml new file mode 100644 index 00000000..26a2ca64 --- /dev/null +++ b/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: sparkfun_pro_micro_rp2040 +name: SparkFun Pro Micro RP2040 +type: board +arch: arm +outputs: + - usb +url: https://www.sparkfun.com/products/18288 +exposes: [pro_micro] diff --git a/app/boards/boardsource_blok.conf b/app/boards/boardsource_blok.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/boardsource_blok.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/boardsource_blok.overlay b/app/boards/boardsource_blok.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/boardsource_blok.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/rpi_pico.conf b/app/boards/rpi_pico.conf new file mode 100644 index 00000000..f0db8ed1 --- /dev/null +++ b/app/boards/rpi_pico.conf @@ -0,0 +1,5 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y diff --git a/app/boards/rpi_pico.overlay b/app/boards/rpi_pico.overlay new file mode 100644 index 00000000..efc8e080 --- /dev/null +++ b/app/boards/rpi_pico.overlay @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + diff --git a/app/boards/seeeduino_xiao_rp2040.conf b/app/boards/seeeduino_xiao_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/seeeduino_xiao_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/seeeduino_xiao_rp2040.overlay b/app/boards/seeeduino_xiao_rp2040.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/seeeduino_xiao_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/sparkfun_pro_micro_rp2040.conf b/app/boards/sparkfun_pro_micro_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/sparkfun_pro_micro_rp2040.overlay b/app/boards/sparkfun_pro_micro_rp2040.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/usb_console.dtsi b/app/boards/usb_console.dtsi new file mode 100644 index 00000000..4ce59408 --- /dev/null +++ b/app/boards/usb_console.dtsi @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + chosen { + zephyr,console = &cdc_acm_uart; + }; +}; + +&usbd { + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + From 2f9bc2f1f7b2ad0e0662ef53f5479b72c0f84d02 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 13 Jul 2022 23:34:32 -0400 Subject: [PATCH 040/134] fix(logging): Disable USB driver logging. When enabling our high level USB logging, disable the USB driver logging itself entirely, to avoid logging in the driver causing errors when USB isn't up yet to send the logs. --- app/Kconfig | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index cf2cc6b3..01817107 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -419,9 +419,16 @@ if ZMK_USB_LOGGING config ZMK_LOG_LEVEL default 4 +choice USB_CDC_ACM_LOG_LEVEL_CHOICE + default USB_CDC_ACM_LOG_LEVEL_OFF +endchoice + +choice USB_DRIVER_LOG_LEVEL_CHOICE + default USB_DRIVER_LOG_LEVEL_OFF + +endchoice + # We do this to avoid log loop where logging to USB generates more log messages. -config USB_CDC_ACM_LOG_LEVEL - default 1 config USB_CDC_ACM_RINGBUF_SIZE default 1024 From a6ebdb7180f5b49d0603de91ca899ea789af0365 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 15 Jul 2022 11:14:51 -0400 Subject: [PATCH 041/134] fix(kscan): Default wait between outputs on RP2040. --- app/drivers/kscan/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index 51546006..216651a1 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -44,6 +44,7 @@ config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS int "Ticks to wait between each output when scanning" + default 1 if SOC_RP2040 default 0 help When iterating over each output to drive it active, read inputs, then set From c3d06b22c8b501fc69f6c2c140c10c95f989c76b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 3 Aug 2022 20:24:45 -0400 Subject: [PATCH 042/134] fix(core): Bump system work queue stack on RP2040. --- app/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Kconfig b/app/Kconfig index 01817107..824d2700 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -121,6 +121,7 @@ menuconfig ZMK_BLE if ZMK_BLE config SYSTEM_WORKQUEUE_STACK_SIZE + default 4096 if SOC_RP2040 default 2048 config ZMK_BLE_THREAD_STACK_SIZE From 198daaf524a2c1223393922195d8f1004964ae2e Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Oct 2022 02:21:25 -0400 Subject: [PATCH 043/134] fix(shields): Don't try to disable xiao_i2c on Hummingbird. --- app/boards/shields/hummingbird/hummingbird.overlay | 1 - 1 file changed, 1 deletion(-) diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 327200a8..4af9cbdf 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -53,5 +53,4 @@ }; &xiao_spi { status = "disabled"; }; -&xiao_i2c { status = "disabled"; }; &xiao_serial { status = "disabled"; }; From 518f9a550f5016dad4e8d96ed68f1c4e6a8ccb93 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Oct 2022 17:23:43 +0000 Subject: [PATCH 044/134] fix(underglow): Use `DT_HAS_CHOSEN` properly. --- app/src/rgb_underglow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 0ed2087a..048b58b4 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -27,7 +27,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if !DT_CHOSEN(zmk_underglow) +#if !DT_HAS_CHOSEN(zmk_underglow) #error "A zmk,underglow chosen node must be declared" From 1493620bf76e05d8419ceec37681b69ca024a871 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 5 Nov 2022 00:35:58 -0400 Subject: [PATCH 045/134] refactor(boards): Move to pinctrl. --- .../bluemicro840/bluemicro840_v1-pinctrl.dtsi | 39 ++++++++++ .../arm/bluemicro840/bluemicro840_v1.dts | 13 ++-- .../bluemicro840/bluemicro840_v1_defconfig | 4 +- .../arm/corneish_zen/corneish_zen_v2_left.dts | 27 ++++++- .../corneish_zen_v2_left_defconfig | 3 + .../corneish_zen/corneish_zen_v2_right.dts | 25 +++++- .../corneish_zen_v2_right_defconfig | 3 + app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/mikoto/mikoto_520.dts | 12 ++- app/boards/arm/mikoto/mikoto_520_defconfig | 2 + app/boards/arm/nice60/nice60-pinctrl.dtsi | 12 +++ app/boards/arm/nice60/nice60.dts | 7 +- app/boards/arm/nice60/nice60_defconfig | 2 + .../arm/nice_nano/nice_nano-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nice_nano/nice_nano.dtsi | 12 ++- app/boards/arm/nice_nano/nice_nano_defconfig | 5 +- .../arm/nice_nano/nice_nano_v2_defconfig | 5 +- .../nrfmicro/nrfmicro-flipped-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nrfmicro/nrfmicro_11.dts | 13 ++-- app/boards/arm/nrfmicro/nrfmicro_11_defconfig | 2 + .../arm/nrfmicro/nrfmicro_11_flipped.dts | 15 ++-- .../nrfmicro/nrfmicro_11_flipped_defconfig | 2 + app/boards/arm/nrfmicro/nrfmicro_13.dts | 13 ++-- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 13 ++-- .../arm/nrfmicro/nrfmicro_13_52833_defconfig | 2 + app/boards/arm/nrfmicro/nrfmicro_13_defconfig | 2 + app/boards/arm/pillbug/pillbug-pinctrl.dtsi | 56 +++++++++++++ app/boards/arm/pillbug/pillbug.dts | 20 +++-- .../arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/puchi_ble/puchi_ble_v1.dts | 11 ++- .../arm/puchi_ble/puchi_ble_v1_defconfig | 3 + .../shields/chalice/boards/nice_nano.overlay | 25 ++++-- .../chalice/boards/nice_nano_v2.overlay | 25 ++++-- .../shields/corne/boards/nice_nano.overlay | 28 +++++-- .../shields/corne/boards/nice_nano_v2.overlay | 47 +++++++++++ .../elephant42/boards/nice_nano.overlay | 47 +++++++++++ .../elephant42/boards/nice_nano_v2.overlay | 29 +++++-- .../eternal_keypad/boards/nice_nano.overlay | 47 +++++++++++ .../boards/nice_nano_v2.overlay | 35 +++++---- .../shields/helix/boards/nice_nano.overlay | 65 +++++++++------- .../shields/helix/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/jorne/boards/nice_nano.overlay | 27 +++++-- .../shields/jorne/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/kyria/boards/nice_nano.overlay | 24 +++++- .../shields/kyria/boards/nice_nano_v2.overlay | 23 +++++- .../shields/kyria/boards/nrfmicro_11.overlay | 25 ++++-- .../kyria/boards/nrfmicro_11_flipped.overlay | 24 +++++- .../shields/kyria/boards/nrfmicro_13.overlay | 24 +++++- .../shields/lily58/boards/nice_nano.overlay | 32 +++++--- .../lily58/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/microdox/boards/nice_nano.overlay | 35 +++++---- .../microdox/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/murphpad/boards/nice_nano.overlay | 33 +++++--- .../murphpad/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/nibble/boards/nice_nano.overlay | 32 +++++--- .../nibble/boards/nice_nano_v2.overlay | 47 +++++++++++ .../boards/bluemicro840_v1.overlay | 16 +++- .../boards/mikoto_520.overlay | 15 +++- .../boards/nice_nano.overlay | 15 +++- .../boards/nice_nano_v2.overlay | 15 +++- .../boards/nrfmicro_11.overlay | 16 +++- .../boards/nrfmicro_11_flipped.overlay | 15 +++- .../boards/nrfmicro_13.overlay | 15 +++- .../boards/puchi_ble_v1.overlay | 15 +++- .../shields/redox/boards/nice_nano.overlay | 31 +++++--- .../shields/redox/boards/nice_nano_v2.overlay | 47 +++++++++++ .../reviung41/boards/nice_nano.overlay | 26 +++++-- .../reviung41/boards/nice_nano_v2.overlay | 47 +++++++++++ .../romac_plus/boards/nice_nano.overlay | 78 +++++++++++-------- .../romac_plus/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/snap/boards/nice_nano.overlay | 32 +++++--- .../shields/snap/boards/nice_nano_v2.overlay | 32 +++++--- .../boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../boards/nice_nano.overlay | 24 +++++- .../boards/nice_nano_v2.overlay | 23 +++++- .../boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../shields/tg4x/boards/nice_nano.overlay | 32 +++++--- .../shields/tg4x/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/tidbit/boards/nice_nano.overlay | 32 +++++--- .../tidbit/boards/nice_nano_v2.overlay | 47 +++++++++++ .../two_percent_milk/boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../boards/nrfmicro_11.overlay | 27 +++++-- .../boards/nrfmicro_11_flipped.overlay | 26 +++++-- .../boards/nrfmicro_13.overlay | 26 +++++-- docs/docs/features/underglow.md | 28 ++++--- 89 files changed, 1981 insertions(+), 376 deletions(-) create mode 100644 app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi create mode 100644 app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi create mode 100644 app/boards/arm/nice60/nice60-pinctrl.dtsi create mode 100644 app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi create mode 100644 app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi create mode 100644 app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi create mode 100644 app/boards/arm/pillbug/pillbug-pinctrl.dtsi create mode 100644 app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi create mode 100644 app/boards/shields/corne/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/elephant42/boards/nice_nano.overlay create mode 100644 app/boards/shields/eternal_keypad/boards/nice_nano.overlay create mode 100644 app/boards/shields/helix/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/jorne/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/lily58/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/microdox/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/murphpad/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/nibble/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/redox/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/reviung41/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/romac_plus/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/tg4x/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/tidbit/boards/nice_nano_v2.overlay diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi new file mode 100644 index 00000000..18b90f21 --- /dev/null +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index 29bf0f8d..c636ca31 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "bluemicro840_v1-pinctrl.dtsi" / { model = "BlueMicro840_V1"; @@ -62,15 +63,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig index b8e4e805..99d51a94 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig +++ b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_BLUEMICRO840_V1=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y @@ -18,4 +20,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 2d8f0a81..4dbdaef5 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -53,12 +53,31 @@ }; +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + &spi0 { status = "okay"; compatible = "nordic,nrf-spim"; - sck-pin = <27>; - mosi-pin = <8>; - miso-pin = <22>; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; epd: il0323@0 { @@ -75,4 +94,4 @@ cdi = <0xd2>; tcon = <0x22>; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 42e27037..305ce72e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -13,6 +13,9 @@ CONFIG_ZMK_DISPLAY=y # Enable MPU CONFIG_ARM_MPU=y +# enable pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 097872f5..52439e4f 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -60,12 +60,31 @@ col-offset = <6>; }; +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + &spi0 { status = "okay"; compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <24>; - miso-pin = <27>; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; epd: il0323@0 { diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index e9b36f2e..0fd0fd6c 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -13,6 +13,9 @@ CONFIG_ZMK_DISPLAY=y # Enable MPU CONFIG_ARM_MPU=y +# enable pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi new file mode 100644 index 00000000..4a8ff82c --- /dev/null +++ b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index 49d9d6be..3fff0835 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "mikoto_520-pinctrl.dtsi" / { model = "mikoto"; @@ -62,14 +63,17 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <8>; - rx-pin = <4>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/mikoto/mikoto_520_defconfig b/app/boards/arm/mikoto/mikoto_520_defconfig index d5fd8958..c755633e 100644 --- a/app/boards/arm/mikoto/mikoto_520_defconfig +++ b/app/boards/arm/mikoto/mikoto_520_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_MIKOTO_520=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi new file mode 100644 index 00000000..aced76b4 --- /dev/null +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = ; + }; + }; +}; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index bb058da8..c982f88e 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -10,6 +10,8 @@ #include #include +#include "nice60-pinctrl.dtsi" + / { model = "nice!60"; compatible = "nice,60"; @@ -110,10 +112,9 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R &spi0 { compatible = "nordic,nrf-spim"; /* Cannot be used together with i2c0. */ + pinctrl-0 = <&spi0_default>; + pinctrl-names = "default"; status = "okay"; - sck-pin = <12>; - mosi-pin = <27>; - miso-pin = <13>; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/arm/nice60/nice60_defconfig b/app/boards/arm/nice60/nice60_defconfig index 9fac3a30..48936a04 100644 --- a/app/boards/arm/nice60/nice60_defconfig +++ b/app/boards/arm/nice60/nice60_defconfig @@ -8,6 +8,8 @@ CONFIG_BOARD_NICE60=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi new file mode 100644 index 00000000..18b90f21 --- /dev/null +++ b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/arm/nice_nano/nice_nano.dtsi index 6c9d081c..ad5ef278 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -5,6 +5,7 @@ */ #include +#include "nice_nano-pinctrl.dtsi" #include "arduino_pro_micro_pins.dtsi" / { @@ -45,14 +46,17 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nice_nano/nice_nano_defconfig b/app/boards/arm/nice_nano/nice_nano_defconfig index 1ff025ec..a837b7d2 100644 --- a/app/boards/arm/nice_nano/nice_nano_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_defconfig @@ -10,6 +10,9 @@ CONFIG_ARM_MPU=y # enable GPIO CONFIG_GPIO=y +# Use pinctrl +CONFIG_PINCTRL=y + CONFIG_USE_DT_CODE_PARTITION=y CONFIG_BUILD_OUTPUT_UF2=y @@ -18,4 +21,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/nice_nano/nice_nano_v2_defconfig b/app/boards/arm/nice_nano/nice_nano_v2_defconfig index 206e51c2..667cf71a 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_v2_defconfig @@ -7,6 +7,9 @@ CONFIG_BOARD_NICE_NANO_V2=y # Enable MPU CONFIG_ARM_MPU=y +# Use pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y @@ -18,4 +21,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi new file mode 100644 index 00000000..a54c2598 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi new file mode 100644 index 00000000..a5385690 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 82951b5f..48186ac9 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -47,15 +48,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig index 3f6a447d..b51929b0 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_11=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index fdfba507..656873a0 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins_flipped.dtsi" +#include "nrfmicro-flipped-pinctrl.dtsi" / { model = "nrfmicro"; @@ -47,15 +48,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <30>; - scl-pin = <31>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { @@ -105,4 +108,4 @@ reg = <0x000f4000 0x0000c000>; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig index efe924f2..335a2d75 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_11_FLIPPED=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index a0f74170..9fb68562 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -60,15 +61,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 7f833ff5..9ade364d 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins_52833.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -60,15 +61,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig index 112e0344..4af1ff86 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_13_52833=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig index 06758784..43ba40e2 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_13=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi new file mode 100644 index 00000000..8751bc4b --- /dev/null +++ b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts index 85c5cccd..c1330319 100644 --- a/app/boards/arm/pillbug/pillbug.dts +++ b/app/boards/arm/pillbug/pillbug.dts @@ -7,6 +7,7 @@ /dts-v1/; #include +#include "pillbug-pinctrl.dtsi" #include "blackpill_pins.dtsi" / { @@ -63,22 +64,25 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <13>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; -&spi1{ +&spi1 { status = "disabled"; compatible = "nordic,nrf-spim"; - sck-pin = <40>; - mosi-pin = <11>; - miso-pin = <26>; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi new file mode 100644 index 00000000..a5385690 --- /dev/null +++ b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts index e324cccc..a8f25c37 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.dts +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "puchi_ble_v1-pinctrl.dtsi" / { model = "puchi_ble"; @@ -61,14 +62,16 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig index e32886d0..1adb9217 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig +++ b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig @@ -11,6 +11,9 @@ CONFIG_ARM_MPU=y # enable GPIO CONFIG_GPIO=y +# Use pinctrl +CONFIG_PINCTRL=y + CONFIG_USE_DT_CODE_PARTITION=y CONFIG_BUILD_OUTPUT_UF2=y diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index 5a74582a..172859ae 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <14>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index 5a74582a..172859ae 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <14>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index e5f84063..172859ae 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,24 +1,38 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index 87c8da21..172859ae 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,23 +1,38 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; label = "WS2812"; + /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <27>; /* There are per-key RGB and the LAST 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; @@ -29,4 +44,4 @@ chosen { zmk,underglow = &led_strip; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index 61950d18..172859ae 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,32 +1,41 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index da7deed1..172859ae 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,38 +1,47 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + compatible = "nordic,nrf-spim"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* WS2812 */ - chain-length = <32>; /* number of LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index 2864fd60..172859ae 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,13 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -18,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index b774b4ba..172859ae 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index b1e7fbb5..172859ae 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11.overlay b/app/boards/shields/kyria/boards/nrfmicro_11.overlay index 1cff5f77..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; @@ -29,4 +45,3 @@ zmk,underglow = &led_strip; }; }; - diff --git a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay index 80d0c898..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_13.overlay b/app/boards/shields/kyria/boards/nrfmicro_13.overlay index 80d0c898..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_13.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_13.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index 69bfffa0..172859ae 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index 360e7098..172859ae 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,32 +1,41 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index d7cdcff7..89ba4f9d 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +#include - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <31>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; @@ -35,4 +44,4 @@ chosen { zmk,underglow = &led_strip; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..89ba4f9d --- /dev/null +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index 0a08c770..ece699e2 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <11>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..ece699e2 --- /dev/null +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 9d9ab734..27d76b07 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -4,11 +4,21 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index 9f6fad1c..fc2667f3 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <5>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 3a0ad462..c9a0e788 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 3a0ad462..0068b5b2 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <25>; + pinctrl-0 = <&spi0_default>; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 9d9ab734..27d76b07 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -4,11 +4,21 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 7b12c252..5074d0f9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <31>; - mosi-pin = <30>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 9d9ab734..9a4f3170 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 9d9ab734..9a4f3170 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index d67e46f9..172859ae 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +#include - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index b52faac6..172859ae 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <11>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index dc686af8..172859ae 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,31 +1,47 @@ -#include - -&spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; \ No newline at end of file +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index f869db5d..15c5801e 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <10>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index f869db5d..15c5801e 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <10>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index eb838b24..4a6b717d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -1,12 +1,28 @@ #include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index eb838b24..ed03ed0d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index fe7fbf18..62f20140 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <8>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <7>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..62f20140 --- /dev/null +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index d8a647e9..08379e30 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..08379e30 --- /dev/null +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index dd7e34c4..08379e30 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index dd7e34c4..08379e30 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay index c2dab5a6..64d16572 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <43>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; @@ -29,4 +45,3 @@ zmk,underglow = &led_strip; }; }; - diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay index e53b149a..b84beb93 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <38>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay index 252329b4..64d16572 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <43>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index 020701fd..c70ffffb 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -54,23 +54,33 @@ For example, the Kyria shield has a `boards/nice_nano.overlay` file that defines With nRF52 boards, you can just use `&spi1` and define the pins you want to use. -To identify which pin number you need to put in the config you need do to a bit of math. You need the hardware port and run it through a function. -**32 \* X + Y** = `` where X is first part of the hardware port "PX.01" and Y is the second part of the hardware port "P1.Y". - -(_P1.13_ would give you _32 \* 1 + 13_ = `<45>` and P0.15 would give you _32 \* 0 + 15_ = `<15>`) - Here's an example on a definition that uses P0.06: ``` #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; From 0c5bcf5fe4dff38f55219c213a745a6731544896 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 16 Jan 2023 04:28:35 +0000 Subject: [PATCH 046/134] feat(docs): Add BLE feature/config pages. Co-authored-by: Cem Aksoylar --- docs/docs/config/bluetooth.md | 14 ++++++++ docs/docs/features/bluetooth.md | 59 +++++++++++++++++++++++++++++++++ docs/sidebars.js | 2 ++ 3 files changed, 75 insertions(+) create mode 100644 docs/docs/config/bluetooth.md create mode 100644 docs/docs/features/bluetooth.md diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md new file mode 100644 index 00000000..420dd5c3 --- /dev/null +++ b/docs/docs/config/bluetooth.md @@ -0,0 +1,14 @@ +--- +title: Bluetooth Configuration +sidebar_label: Bluetooth +--- + +See the [bluetooth feature page](../features/bluetooth.md) for more details on the general Bluetooth functionality in ZMK. + +See [Configuration Overview](index.md) for instructions on how to change these settings. + +## Kconfig + +| Option | Type | Description | Default | +| ------------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------- | ------- | +| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md new file mode 100644 index 00000000..f1a3e241 --- /dev/null +++ b/docs/docs/features/bluetooth.md @@ -0,0 +1,59 @@ +--- +title: Bluetooth +sidebar_label: Bluetooth +--- + +ZMK's bluetooth functionality allows users to connect their keyboards to hosts using Bluetooth Low Energy (BLE) technology. It also is used for split keyboards to connect the two halves wirelessly. + +:::note + +Bluetooth 4.2 or newer is required in order to connect to a ZMK keyboard. ZMK implements advanced security using BLE's Secure Connection feature, which requires Bluetooth 4.2 at a minimum. To avoid well-known security vulnerabilities, we disallow using Legacy pairing. + +::: + +## Security + +BLE connections between keyboards and hosts are secured by an initial pairing/bonding process that establishes long term keys (LTK) shared between the two sides, using Elliptic Curve Diffie Hellman (ECDH) for key generation. The same security is used to secure the communication between the two sides of split keyboards running ZMK. + +The only known vulnerability in the protocol is a risk of an active man-in-the-middle (MITM) attack exactly during the initial pairing, which can be mitigated in the future using the Numeric Comparison association model. Support for that in ZMK is still experimental, so if you have serious concerns about an active attacker with physical proximity to your device, consider only pairing/bonding your keyboards in a controlled environment. + +## Profiles + +By default, ZMK supports five "profiles" for selecting which bonded host +device should receive the keyboard input. + +:::note Connection Management + +When pairing to a host device ZMK saves bond information to the selected profile. It will not replace this automatically when you initiate pairing with another device. To pair with a new device select an unused profile with or clearing the current profile, using the [`&bt` behavior](../behaviors/bluetooth.md) on your keyboard. + +A ZMK device may show as "connected" on multiple hosts at the same time. This is working as intended, and only the host associated with the active profile will receive keystrokes. + +::: + +Failure to manage the profiles can result in unexpected/broken behavior with hosts due to bond key mismatches, so it is an important aspect of ZMK to understand. + +## Bluetooth Behavior + +Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](../behaviors/bluetooth.md). Be sure to refer to that documentation to learn how to manage profiles, switch between connected hosts, etc. + +## Troubleshooting + +## Known Issues + +There are a few known issues related to BLE and ZMK: + +### Windows Battery Reporting + +There is a known issue with Windows failing to update the battery information after connecting to a ZMK keyboard. You can work around this Windows bug by overriding a [Bluetooth config variable](../config/bluetooth.md) to force battery notifications even if a host neglects to subscribe to them: + +``` +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +``` + +### macOS Connected But Not Working + +If you attempt to pair a ZMK keyboard from macOS in a way that causes a bonding issue, macOS may report the keyboard as connected, but fail to actually work. If this occurs: + +1. Remove the keyboard from macOS using the Bluetooth control panel. +1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the macOS device is active, by pressing the correct keys for your particular keymap. +1. Try connecting again from macOS. diff --git a/docs/sidebars.js b/docs/sidebars.js index 7b445a29..a52f3302 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -10,6 +10,7 @@ module.exports = { ], Features: [ "features/keymaps", + "features/bluetooth", "features/combos", "features/conditional-layers", "features/debouncing", @@ -57,6 +58,7 @@ module.exports = { "config/backlight", "config/battery", "config/behaviors", + "config/bluetooth", "config/combos", "config/displays", "config/encoders", From 313ed6adb6db3154c14f783b791255b6f3422fb3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 17 Mar 2023 06:20:33 +0000 Subject: [PATCH 047/134] fix(display): Tweak EPD driver init/blanking. Ensure we only clear the display when turning blanking off the first time, not every time, to avoid duplicate clears. --- app/drivers/display/il0323.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index 94e38481..6555e5c1 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -47,6 +47,7 @@ static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); static uint8_t last_buffer[IL0323_BUFFER_SIZE]; static bool blanking_on = true; +static bool init_clear_done = false; static inline int il0323_write_cmd(const struct il0323_cfg *cfg, uint8_t cmd, uint8_t *data, size_t len) { @@ -198,16 +199,21 @@ static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t patte static int il0323_blanking_off(const struct device *dev) { const struct il0323_cfg *cfg = dev->config; - if (blanking_on) { + if (!init_clear_done) { /* Update EPD panel in normal mode */ il0323_busy_wait(cfg); if (il0323_clear_and_write_buffer(dev, 0xff, true)) { return -EIO; } + init_clear_done = true; } blanking_on = false; + if (il0323_update_display(dev)) { + return -EIO; + } + return 0; } From 2614b856349a39a39ddb88c71b695c70a6fa1c05 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 24 Oct 2022 03:54:49 +0000 Subject: [PATCH 048/134] feat(docs): Add blog post for Zephyr 3.2. Co-authored-by: Cem Aksoylar --- docs/blog/2023-04-06-zephyr-3-2.md | 303 +++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 docs/blog/2023-04-06-zephyr-3-2.md diff --git a/docs/blog/2023-04-06-zephyr-3-2.md b/docs/blog/2023-04-06-zephyr-3-2.md new file mode 100644 index 00000000..b60ad27c --- /dev/null +++ b/docs/blog/2023-04-06-zephyr-3-2.md @@ -0,0 +1,303 @@ +--- +title: "Zephyr 3.2 Update" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [firmware, zephyr, core] +--- + +I'm happy to announce that we have completed the [work](https://github.com/zmkfirmware/zmk/pull/1499) to upgrade ZMK to [Zephyr 3.2](https://docs.zephyrproject.org/3.2.0/releases/release-notes-3.2.html)! + +[petejohanson] did the upgrade work to adjust ZMK for the Zephyr changes, with help from [Nicell] on the LVGL pieces. + +- Upgrade to LVGL 8.x API, and move to the new Kconfig settings. +- Tons of RP2040 work. +- Zephyr core API changes, including DTS `label` use changes. +- Move to [pinctrl](https://docs.zephyrproject.org/3.2.0/hardware/pinctrl/index.html) Zephyr subsystem. + +## Getting The Changes + +Use the following steps to update to the latest tooling in order to properly use the new ZMK changes: + +### User Config Repositories Using GitHub Actions + +Existing user config repositories using Github Actions to build will pull down Zephyr 3.2 automatically, however if you created your user config a while ago, you may need to update it to reference our shared build configuration to leverage the correct Docker image. + +1. Replace the contents of your `.github/workflows/build.yml` with: + + ``` + on: [push, pull_request, workflow_dispatch] + + jobs: + build: + uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main + ``` + +1. If it doesn't exist already, add a new file to your repository named `build.yaml`: + + ``` + # This file generates the GitHub Actions matrix + # For simple board + shield combinations, add them + # to the top level board and shield arrays, for more + # control, add individual board + shield combinations to + # the `include` property, e.g: + # + # board: [ "nice_nano_v2" ] + # shield: [ "corne_left", "corne_right" ] + # include: + # - board: bdn9_rev2 + # - board: nice_nano_v2 + # shield: reviung41 + # + --- + ``` + +and then update it as appropriate to build the right shields/boards for your configuration. + +### Upgrade a manual script + +If you have a custom GitHub Actions workflow you need to maintain for some reason, you can update the workflow to to use the `stable` Docker image tag for the build: + +- Open `.github/workflows/build.yml` in your editor/IDE +- Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found +- Locate and delete the lines for the DTS output step, which is no longer needed: + + ``` + - name: ${{ steps.variables.outputs.display-name }} DTS File + if: ${{ always() }} + run: | + if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi + if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + ``` + +### VS Code & Docker (Dev Container) + +If you build locally using VS Code & Docker then: + +- pull the latest ZMK `main` with `git pull` for your ZMK checkout +- reload the project +- if you are prompted to rebuild the remote container, click `Rebuild` +- otherwise, press `F1` and run `Remote Containers: Rebuild Container` +- Once the container has rebuilt and reloaded, run `west update` to pull the updated Zephyr version and its dependencies. + +Once the container has rebuilt, VS Code will be running the 3.2 Docker image. + +### Local Host Development + +The following steps will get you building ZMK locally against Zephyr 3.2: + +- Run the updated [toolchain installation](/docs/development/setup#toolchain-installation) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) +- Install the latest version of `west` by running `pip3 install --user --update west`. +- pull the latest ZMK `main` with `git pull` for your ZMK checkout +- run `west update` to pull the updated Zephyr version and its dependencies + +From there, you should be ready to build as normal! + +## Known Issues + +A few testers have reported inconsistent issues with bluetooth connections on Windows after upgrading, which can be resolved by re-pairing your keyboard by: + +1. Remove the device from Windows. +1. Clear the profile on your keyboard that is associated with the Windows device by triggering `&bt BT_CLR` on your keymap while that profile is active. +1. Restart Windows. +1. Re-connect Windows to your keyboard. + +## Windows Battery Reporting Fix + +Zephyr 3.2 introduced [a new Kconfig setting](https://github.com/zephyrproject-rtos/zephyr/pull/48929) that can be used to work around a bug in Windows related to battery reporting. Check out our [bluetooth config](/docs/config/bluetooth) for the full details. The key new configuration that can be set if using Windows is: + +``` +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +``` + +## Keymap Changes + +Due to conflicts with new devicetree node labels added for Zephyr's [reset system](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/reset.html), the `&reset` behavior has been renamed to `&sys_reset`. + +All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](docs/codes/keymap-upgrader) and this will get fixed for you automatically. + +## Board/Shield Changes + +The following changes have [already been completed](https://github.com/zmkfirmware/zmk/pull/1499/commits) for all boards/shields in ZMK `main` branch. For existing or new PRs, or out of tree boards, the following changes are necessary to properly work with the latest changes. + +### Move to `pinctrl` driver + +Before this change, setting up the details of pins to use them for peripherals like SPI, I2C, etc. was a mix of platform specific driver code. Zephyr has moved to the newer `pinctrl` system to unify the handling of pin configuration, with additional flexibility for things like low power modes for those pins, etc. + +#### Board specific shield overlays + +The main area this affects existing shields is those with board specific overrides, e.g. `/boards/seeeduino_xiao_ble.overlay`, that sets up additional components on custom buses, e.g. addressable RGB LEDs leveraging the SPI MOSI pin. + +#### nRF52 Pin Assignments + +Previously in ZMK, we relied on per-driver devicetree source properties to set the alternate pin functions for things like SPI or I2C. For example, here is the I2C bus setup as it was previously on the `nice_nano` board: + +``` +&i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <17>; + scl-pin = <20>; +}; +``` + +With the move to the `pinctrl` system, this setup now look like: + +``` + &i2c0 { + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + }; +``` + +which references the `pinctrl` configuration: + +``` +&pinctrl { + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; +``` + +Although slightly more _verbose_ this allows pin configuration infrastructure to be re-used, specify other modes, like sleep, etc. in a standard way across architectures. + +#### Out of Tree Boards/Shields + +All of the in-tree boards and shields have been upgraded, but if you maintain/use an out-of-tree board or shield that uses the converted boards and overrides pins for various buses, you may need to switch to `pinctrl` to match ZMK's new approach. + +The approach is the following when updating a _board_: + +1. Add an entry `CONFIG_PINCTRL=y` to the `_defconfig` file in the board directory. +1. Add a new file with the naming convention `-pinctrl.dtsi` to your board directory. +1. In the new file, add your `pinctrl` entries that set up different pin control configurations for whatever peripherals/buses are needed. Here's the nice!nano file as an example: + + ``` + /* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + + &pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + }; + ``` + +1. From the main `.dts` file, add an `#include "-pinctrl.dtsi"` to have the C-preprocessor combine the files. +1. Update the various peripheral nodes to use the new `pinctrl` configurations. For example, the following old configuration: + + ``` + &i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <15>; + scl-pin = <17>; + }; + ``` + + would be changed to: + + ``` + &i2c0 { + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + }; + ``` + +Because `pinctrl` configuration is very dependent on the specific target SoC, you will rarely need to consider it for a shield overlay that leverages a pro micro or XIAO abstraction. As noted, you're more likely to need to fix up pinctrl settings is using a board specific shield overlay, e.g. `/boards/.overlay` to set things up. + +### LVGL Kconfig changes. + +With the update to LVGL 8.x, Zephyr now leverages an upstream Kconfig file for most LVGL settings. Due to this, the naming for many existing configs has been adjusted. For any configs moved upstream, the naming mostly involves a prefix change from `LVGL_` to the shorter `LV_`. For any that are still Zephyr specific configs, they are now prefixed with `LV_Z_` prefix. + +If you maintain or use an out of tree board/shield with a display, the following will need to be changed in your Kconfig files: + +- `LVGL_VDB_SIZE` -> `LV_Z_VDB_SIZE` +- `LVGL_DPI` -> `LV_DPI_DEF` +- `LVGL_BITS_PER_PIXEL` -> `LV_Z_BITS_PER_PIXEL` + +Other than those specific examples, most other Kconfig values can simply change the `LVGL_` prefix to `LV_`. + +## Raspberry Pi Pico/RP2040 Support + +This Zephyr update allows ZMK to support the new(-ish) RP2040 SoC found in the Raspberry Pi Pico. + +:::note + +ZMK does _not_ support wired split communication yet, so RP2040 is only usable for non-split keyboards. To follow progress on wired splits, see [#1117](https://github.com/zmkfirmware/zmk/pull/1117). + +::: + +### Supported Controllers + +The following RP2040 powered controllers have board definitions for folks to test: + +- Raspberry Pi Pico (`rpi_pico`) +- SparkFun Pro Micro RP2040 (`sparkfun_pro_micro_rp2040`) +- Adafruit Keyboar/KB2040 (`adafruit_kb2040`) +- Seeeduino XIAO RP2040 (`seeeduino_xiao_rp2040`) +- Adafruit Qt PY RP2040 (`adafruit_qt_py_rp2040`) +- BoardSource blok (`boardsource_blok`) +- Elite-Pi (compatible with the `sparkfun_pro_micro_rp2040` board) + +## Upcoming Changes + +### Display re-init + +Zephyr's improved [power domain](https://docs.zephyrproject.org/3.2.0/services/pm/power_domain.html#pm-power-domain) support is a foundation +upon which we can provide a proper fix for the [longstanding display re-init bug](https://github.com/zmkfirmware/zmk/issues/674) which has prevented +ZMK from formally supporting our display code. + +There is work still remaining to fully leverage the power domain system within ZMK to fix the bug, but upgrading Zephyr is the first necessary step. + +## Thanks! + +Thanks to all the testers who have helped verify ZMK functionality on the newer Zephyr version. + +[petejohanson]: https://github.com/petejohanson +[nicell]: https://github.com/Nicell From 134b64ef5bbc67dd9f1c2a961609c62d4f226711 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 6 Apr 2023 06:14:44 +0000 Subject: [PATCH 049/134] fix(docs): Make link to keymap upgrader work. --- docs/blog/2023-04-06-zephyr-3-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/2023-04-06-zephyr-3-2.md b/docs/blog/2023-04-06-zephyr-3-2.md index b60ad27c..693d93dc 100644 --- a/docs/blog/2023-04-06-zephyr-3-2.md +++ b/docs/blog/2023-04-06-zephyr-3-2.md @@ -115,7 +115,7 @@ CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n Due to conflicts with new devicetree node labels added for Zephyr's [reset system](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/reset.html), the `&reset` behavior has been renamed to `&sys_reset`. -All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](docs/codes/keymap-upgrader) and this will get fixed for you automatically. +All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](/docs/codes/keymap-upgrader) and this will get fixed for you automatically. ## Board/Shield Changes From 9dcc3ac3753d06db752a1fa7610df1f1be376bd2 Mon Sep 17 00:00:00 2001 From: Hooky <117450225+HookyKB@users.noreply.github.com> Date: Fri, 7 Apr 2023 21:53:10 +0800 Subject: [PATCH 050/134] fix(shields): Fixup nice!view adapter pinctrl props. `pinctrl-0` setting missing `<>`. --- .../shields/nice_view_adapter/boards/bluemicro840_v1.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nice_nano.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay | 2 +- .../nice_view_adapter/boards/nrfmicro_11_flipped.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay | 2 +- .../shields/nice_view_adapter/boards/puchi_ble_v1.overlay | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 27d76b07..9667edf9 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -17,7 +17,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index fc2667f3..21383c70 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index c9a0e788..0068b5b2 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 27d76b07..9667edf9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -17,7 +17,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 5074d0f9..09b57d16 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 9a4f3170..0cdb933a 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 9a4f3170..0cdb933a 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; From 7434a6b99b01561ea20088819dd1e3cc2b989973 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 8 Apr 2023 00:30:20 -0700 Subject: [PATCH 051/134] fix(shields): Fix nice!view for deep sleep --- .../nice_view_adapter/boards/bluemicro840_v1.overlay | 12 ++++++++++-- .../nice_view_adapter/boards/mikoto_520.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nice_nano.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nice_nano_v2.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nrfmicro_11.overlay | 12 ++++++++++-- .../boards/nrfmicro_11_flipped.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nrfmicro_13.overlay | 11 ++++++++++- .../nice_view_adapter/boards/puchi_ble_v1.overlay | 11 ++++++++++- 8 files changed, 80 insertions(+), 10 deletions(-) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 9667edf9..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -12,13 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; - nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index 21383c70..d9cc0835 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 0068b5b2..2a1b757d 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 0068b5b2..2a1b757d 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 9667edf9..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -12,13 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; - nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 09b57d16..1cd19db9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 0cdb933a..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 0cdb933a..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; From b31b42018ae4368b03b72f038d4dfbbeb31a630a Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 8 Apr 2023 11:08:12 -0500 Subject: [PATCH 052/134] fix: Remove deprecated labels from zmk_uno --- app/boards/shields/zmk_uno/zmk_uno.overlay | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index f10d18af..12b5e2b3 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -16,7 +16,6 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "RGB"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ @@ -126,8 +125,6 @@ kscan_matrix: kscan_matrix { compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_MATRIX"; - diode-direction = "col2row"; col-gpios @@ -146,8 +143,6 @@ compatible = "zmk,kscan-gpio-direct"; status = "disabled"; - label = "KSCAN_DIRECT"; - input-gpios = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> @@ -161,8 +156,6 @@ compatible = "zmk,kscan-gpio-direct"; toggle-mode; - label = "KSCAN_TOGGLE"; - input-gpios = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> From 374104dec616013bd85bcdf095e1ecc4fea40954 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 9 Apr 2023 12:35:34 -0700 Subject: [PATCH 053/134] fix(underglow): Move to spi3 for underglow bus. * Workaround Zephyr bug for Nordic SPI(M) driver after the pinctrl refactor by using spi3 peripheral for the SPI bus for the WS2812 led_strip driver. --- .../shields/chalice/boards/nice_nano.overlay | 10 +++++----- .../shields/chalice/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/corne/boards/nice_nano.overlay | 10 +++++----- .../shields/corne/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/elephant42/boards/nice_nano.overlay | 10 +++++----- .../elephant42/boards/nice_nano_v2.overlay | 10 +++++----- .../eternal_keypad/boards/nice_nano.overlay | 10 +++++----- .../eternal_keypad/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/helix/boards/nice_nano.overlay | 10 +++++----- .../shields/helix/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/jorne/boards/nice_nano.overlay | 10 +++++----- .../shields/jorne/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/kyria/boards/nice_nano.overlay | 10 +++++----- .../shields/kyria/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/lily58/boards/nice_nano.overlay | 10 +++++----- .../shields/lily58/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/microdox/boards/nice_nano.overlay | 10 +++++----- .../shields/microdox/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/murphpad/boards/nice_nano.overlay | 10 +++++----- .../shields/murphpad/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/nibble/boards/nice_nano.overlay | 10 +++++----- .../shields/nibble/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/redox/boards/nice_nano.overlay | 10 +++++----- .../shields/redox/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/reviung41/boards/nice_nano.overlay | 12 ++++++------ .../reviung41/boards/nice_nano_v2.overlay | 12 ++++++------ .../shields/romac_plus/boards/nice_nano.overlay | 10 +++++----- .../romac_plus/boards/nice_nano_v2.overlay | 10 +++++----- app/boards/shields/snap/boards/nice_nano.overlay | 10 +++++----- .../shields/snap/boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- app/boards/shields/tg4x/boards/nice_nano.overlay | 10 +++++----- .../shields/tg4x/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/tidbit/boards/nice_nano.overlay | 10 +++++----- .../shields/tidbit/boards/nice_nano_v2.overlay | 10 +++++----- .../two_percent_milk/boards/nice_nano.overlay | 10 +++++----- .../two_percent_milk/boards/nice_nano_v2.overlay | 10 +++++----- docs/docs/features/underglow.md | 16 ++++++++-------- 43 files changed, 220 insertions(+), 220 deletions(-) diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/elephant42/boards/nice_nano.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/helix/boards/nice_nano_v2.overlay +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/jorne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/microdox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index 89ba4f9d..3e2241a2 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay index 89ba4f9d..3e2241a2 100644 --- a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index ece699e2..54ab9fec 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay index ece699e2..54ab9fec 100644 --- a/app/boards/shields/nibble/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/redox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index 172859ae..741237e1 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -32,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ + chain-length = <11>; spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay index 172859ae..741237e1 100644 --- a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -32,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ + chain-length = <11>; spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index 15c5801e..28e9ce69 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index 15c5801e..28e9ce69 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index 4a6b717d..5b9ce4a8 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -2,13 +2,13 @@ &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -16,12 +16,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index ed03ed0d..9e168625 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index 62f20140..54046bf5 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay index 62f20140..54046bf5 100644 --- a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index c70ffffb..c1dc68d3 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -52,7 +52,7 @@ For example, the Kyria shield has a `boards/nice_nano.overlay` file that defines ### nRF52-based boards -With nRF52 boards, you can just use `&spi1` and define the pins you want to use. +With nRF52 boards, you can just use `&spi3` and define the pins you want to use. Here's an example on a definition that uses P0.06: @@ -60,13 +60,13 @@ Here's an example on a definition that uses P0.06: #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -74,12 +74,12 @@ Here's an example on a definition that uses P0.06: }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -119,12 +119,12 @@ If your board/shield uses LEDs that require the data sent in a different order, For other boards, you must select an SPI definition that has the `MOSI` pin as your data pin going to your LED strip. -Here's another example for a non-nRF52 board on `spi1`: +Here's another example for a non-nRF52 board on `spi3`: ``` #include -&spi1 { +&spi3 { led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; From 064aff6bc074febd394a288403129e95c386395d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 8 Apr 2023 16:32:29 -0500 Subject: [PATCH 054/134] fix(behaviors): Fix use after free in sticky key Fixed an issue where the sticky key behavior would call ZMK_EVENT_RAISE_AFTER(), which would free the provided event, but then it would keep using that now-freed event data. --- app/src/behaviors/behavior_sticky_key.c | 30 +++++++++++++++---------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 22936086..6697b9b1 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -191,6 +191,11 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { // keep track whether the event has been reraised, so we only reraise it once bool event_reraised = false; + + // reraising the event frees it, so make a copy of any event data we might + // need after it's been freed. + const struct zmk_keycode_state_changed ev_copy = *ev; + for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { struct active_sticky_key *sticky_key = &active_sticky_keys[i]; if (sticky_key->position == ZMK_BHV_STICKY_KEY_POSITION_FREE) { @@ -198,23 +203,24 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { } if (strcmp(sticky_key->config->behavior.behavior_dev, "KEY_PRESS") == 0 && - ZMK_HID_USAGE_ID(sticky_key->param1) == ev->keycode && - ZMK_HID_USAGE_PAGE(sticky_key->param1) == ev->usage_page && - SELECT_MODS(sticky_key->param1) == ev->implicit_modifiers) { + ZMK_HID_USAGE_ID(sticky_key->param1) == ev_copy.keycode && + ZMK_HID_USAGE_PAGE(sticky_key->param1) == ev_copy.usage_page && + SELECT_MODS(sticky_key->param1) == ev_copy.implicit_modifiers) { // don't catch key down events generated by the sticky key behavior itself continue; } // If this event was queued, the timer may be triggered late or not at all. // Release the sticky key if the timer should've run out in the meantime. - if (sticky_key->release_at != 0 && ev->timestamp > sticky_key->release_at) { + if (sticky_key->release_at != 0 && ev_copy.timestamp > sticky_key->release_at) { stop_timer(sticky_key); release_sticky_key_behavior(sticky_key, sticky_key->release_at); continue; } - if (ev->state) { // key down - if (sticky_key->config->ignore_modifiers && is_mod(ev->usage_page, ev->keycode)) { + if (ev_copy.state) { // key down + if (sticky_key->config->ignore_modifiers && + is_mod(ev_copy.usage_page, ev_copy.keycode)) { // ignore modifier key press so we can stack sticky keys and combine with other // modifiers continue; @@ -231,17 +237,17 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { ZMK_EVENT_RAISE_AFTER(eh, behavior_sticky_key); event_reraised = true; } - release_sticky_key_behavior(sticky_key, ev->timestamp); + release_sticky_key_behavior(sticky_key, ev_copy.timestamp); } } - sticky_key->modified_key_usage_page = ev->usage_page; - sticky_key->modified_key_keycode = ev->keycode; + sticky_key->modified_key_usage_page = ev_copy.usage_page; + sticky_key->modified_key_keycode = ev_copy.keycode; } else { // key up if (sticky_key->timer_started && - sticky_key->modified_key_usage_page == ev->usage_page && - sticky_key->modified_key_keycode == ev->keycode) { + sticky_key->modified_key_usage_page == ev_copy.usage_page && + sticky_key->modified_key_keycode == ev_copy.keycode) { stop_timer(sticky_key); - release_sticky_key_behavior(sticky_key, ev->timestamp); + release_sticky_key_behavior(sticky_key, ev_copy.timestamp); } } } From 3c8f55ede0a8f08f0cc11e500c0f2e3d05a87f7c Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 9 Apr 2023 18:08:35 -0700 Subject: [PATCH 055/134] fix(display): Do not override font size in status screen --- app/src/display/status_screen.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 7c3870a8..58de09ae 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -34,16 +34,9 @@ static struct zmk_widget_layer_status layer_status_widget; static struct zmk_widget_wpm_status wpm_status_widget; #endif -lv_style_t global_style; - lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - - lv_style_init(&global_style); - lv_style_set_text_font(&global_style, &lv_font_montserrat_12); - screen = lv_obj_create(NULL); - lv_obj_add_style(screen, &global_style, LV_PART_MAIN); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); From 702d79c108bfd02d85dda3dda55f31ce8316cfd8 Mon Sep 17 00:00:00 2001 From: nguyendown <50001260+nguyendown@users.noreply.github.com> Date: Mon, 10 Apr 2023 12:50:57 +0700 Subject: [PATCH 056/134] test(behaviors): add unit tests for sticky key `quick-release` Duplicate the existing tests with `quick-release` enabled: - 8-lsk-osk-combination-quick-release - 10-callum-mods-quick-release --- .../events.patterns | 1 + .../keycode_events.snapshot | 10 ++++ .../native_posix_64.keymap | 40 +++++++++++++ .../events.patterns | 1 + .../keycode_events.snapshot | 12 ++++ .../native_posix_64.keymap | 56 +++++++++++++++++++ 6 files changed, 120 insertions(+) create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns b/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns new file mode 100644 index 00000000..b1342af4 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot b/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot new file mode 100644 index 00000000..5ee7c103 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot @@ -0,0 +1,10 @@ +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap new file mode 100644 index 00000000..5c1c2264 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap @@ -0,0 +1,40 @@ +#include +#include +#include + +&sk { + quick-release; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &sk LEFT_CONTROL &kp A + &sk LEFT_SHIFT &sk LEFT_ALT>; + }; + }; +}; + +&kscan { + events = < + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap sk LEFT_ALT */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* tap A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns new file mode 100644 index 00000000..b1342af4 --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot new file mode 100644 index 00000000..d71c3968 --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap new file mode 100644 index 00000000..6d88a9ea --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap @@ -0,0 +1,56 @@ +#include +#include +#include + +&sk { + quick-release; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &sk LEFT_SHIFT &sl 1 + &kp A &kp B>; + }; + + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; +}; + +&kscan { + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; +}; From 3f48062225e0382de35cecc3da6914be89a2c91e Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:11:46 -0500 Subject: [PATCH 057/134] feat(core): Add Kconfig option to exclude debug log messages --- app/Kconfig | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 824d2700..794b6762 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -402,6 +402,17 @@ endmenu menu "USB Logging" +config ZMK_LOGGING_MINIMAL + bool "Suppress all ZMK debug log messages" + default false + +if !ZMK_LOGGING_MINIMAL + +config ZMK_LOG_LEVEL + default 4 + +endif + config ZMK_USB_LOGGING bool "Enable USB CDC ACM logging to help debug" select LOG @@ -417,16 +428,12 @@ config ZMK_USB_LOGGING if ZMK_USB_LOGGING -config ZMK_LOG_LEVEL - default 4 - choice USB_CDC_ACM_LOG_LEVEL_CHOICE default USB_CDC_ACM_LOG_LEVEL_OFF endchoice choice USB_DRIVER_LOG_LEVEL_CHOICE default USB_DRIVER_LOG_LEVEL_OFF - endchoice # We do this to avoid log loop where logging to USB generates more log messages. From a20b9502bc069cac94a55243cf091e3174a9992b Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:14:23 -0500 Subject: [PATCH 058/134] feat(core): Add RTT logging Kconfig option --- app/Kconfig | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 794b6762..75a37f63 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -400,7 +400,7 @@ config ZMK_KSCAN_EVENT_QUEUE_SIZE #KSCAN Settings endmenu -menu "USB Logging" +menu "Logging" config ZMK_LOGGING_MINIMAL bool "Suppress all ZMK debug log messages" @@ -441,16 +441,38 @@ endchoice config USB_CDC_ACM_RINGBUF_SIZE default 1024 -config LOG_BUFFER_SIZE - default 8192 - config LOG_PROCESS_THREAD_STARTUP_DELAY_MS default 1000 #ZMK_USB_LOGGING endif -#USB Logging +config ZMK_RTT_LOGGING + bool "Enable RTT logging to help debug" + select LOG + select DEBUG + select ASSERT + select USE_SEGGER_RTT + select CONSOLE + select RTT_CONSOLE + +if ZMK_RTT_LOGGING + +config SEGGER_RTT_BUFFER_SIZE_UP + default 8192 + +#ZMK_RTT_LOGGING +endif + +if ZMK_USB_LOGGING || ZMK_RTT_LOGGING + +config LOG_BUFFER_SIZE + default 8192 + +#ZMK_USB_LOGGING || ZMK_RTT_LOGGING +endif + +#Logging endmenu if SETTINGS From ee9fcec3c97c23e15a2369b95cc0a590f04f1875 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:16:18 -0500 Subject: [PATCH 059/134] feat(core): Process log every 100ms --- app/Kconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 75a37f63..431a1bb1 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -469,6 +469,9 @@ if ZMK_USB_LOGGING || ZMK_RTT_LOGGING config LOG_BUFFER_SIZE default 8192 +config LOG_PROCESS_THREAD_SLEEP_MS + default 100 + #ZMK_USB_LOGGING || ZMK_RTT_LOGGING endif From 309359b32f2ce46adc2b720b1cca20d9ac333d6c Mon Sep 17 00:00:00 2001 From: Purdea Andrei Date: Mon, 10 Apr 2023 10:27:19 +0300 Subject: [PATCH 060/134] fix(keymaps): fix keypresses that are not in the transform Before this change, if a matrix position was not present in the transform, various incorrect behaviors would happen: 1) In some cases out-of-bounds accesses: Note that the size of the`transform[]` array does not necessarily match the size of the matrix. So for example if key position (ZMK_MATRIX_COLS-1, ZMK_MATRIX_ROWS-1) is not present in the transform, but ends up being pressed, then the array will be accessed beyond its size, and any data could be returned. 2) In other cases the 0th position in the keymap will be used because the `transform[]` array is initialized to all zeros. --- app/include/zmk/matrix_transform.h | 2 +- app/src/kscan.c | 9 ++++++- app/src/matrix_transform.c | 43 +++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/include/zmk/matrix_transform.h b/app/include/zmk/matrix_transform.h index 413678a7..ffd3e3f1 100644 --- a/app/include/zmk/matrix_transform.h +++ b/app/include/zmk/matrix_transform.h @@ -6,4 +6,4 @@ #pragma once -uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column); \ No newline at end of file +int32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column); \ No newline at end of file diff --git a/app/src/kscan.c b/app/src/kscan.c index b0713320..62d0cf07 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -47,7 +47,14 @@ void zmk_kscan_process_msgq(struct k_work *item) { while (k_msgq_get(&zmk_kscan_msgq, &ev, K_NO_WAIT) == 0) { bool pressed = (ev.state == ZMK_KSCAN_EVENT_STATE_PRESSED); - uint32_t position = zmk_matrix_transform_row_column_to_position(ev.row, ev.column); + int32_t position = zmk_matrix_transform_row_column_to_position(ev.row, ev.column); + + if (position < 0) { + LOG_WRN("Not found in transform: row: %d, col: %d, pressed: %s", ev.row, ev.column, + (pressed ? "true" : "false")); + continue; + } + LOG_DBG("Row: %d, col: %d, position: %d, pressed: %s", ev.row, ev.column, position, (pressed ? "true" : "false")); ZMK_EVENT_RAISE(new_zmk_position_state_changed( diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index 47256608..6c616d5e 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -11,17 +11,32 @@ #ifdef ZMK_KEYMAP_TRANSFORM_NODE -#define _TRANSFORM_ENTRY(i, _) \ - [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ - KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i +/* the transform in the device tree is a list of (row,column) pairs that is + * indexed by by the keymap position of that key. We want to invert this in + * order to be able to quickly determine what keymap position a particular + * row,column pair is associated with, using a single lookup. + * + * We do this by creating the `transform` array at compile time, which is + * indexed by (row * ZMK_MATRIX_COLS) + column, and the value contains an + * encoded keymap index it is associated with. The keymap index is encoded + * by adding INDEX_OFFSET to it, because not all row,column pairs have an + * associated keymap index (some matrices are sparse), C globals are + * initialized to 0, and the keymap index of 0 is a valid index. We want to + * be able to detect the condition when an unassigned matrix position is + * pressed and we want to return an error. + */ -static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (, ), 0)}; +#define INDEX_OFFSET 1 + +#define TRANSFORM_ENTRY(i, _) \ + [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ + KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i + INDEX_OFFSET + +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, TRANSFORM_ENTRY, (, ), 0)}; #endif -uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column) { - uint32_t matrix_index; - +int32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column) { #if DT_NODE_HAS_PROP(ZMK_KEYMAP_TRANSFORM_NODE, col_offset) column += DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, col_offset); #endif @@ -30,10 +45,20 @@ uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t colu row += DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, row_offset); #endif - matrix_index = (row * ZMK_MATRIX_COLS) + column; + const uint32_t matrix_index = (row * ZMK_MATRIX_COLS) + column; #ifdef ZMK_KEYMAP_TRANSFORM_NODE - return transform[matrix_index]; + if (matrix_index >= ARRAY_SIZE(transform)) { + return -EINVAL; + } + + const uint32_t value = transform[matrix_index]; + + if (!value) { + return -EINVAL; + } + + return value - INDEX_OFFSET; #else return matrix_index; #endif /* ZMK_KEYMAP_TRANSFORM_NODE */ From f1b138cbf0a37147f24150af2721899fa17e9fd4 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 14 Apr 2023 14:22:53 -0700 Subject: [PATCH 061/134] fix(boards): Fix Zen logo alignment --- app/boards/arm/corneish_zen/custom_status_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/arm/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c index c45a6243..492239c8 100644 --- a/app/boards/arm/corneish_zen/custom_status_screen.c +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -70,7 +70,7 @@ lv_obj_t *zmk_display_status_screen() { lv_obj_t *zenlogo_icon; zenlogo_icon = lv_img_create(screen); lv_img_set_src(zenlogo_icon, &zenlogo); - lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 2, -5); + lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 0, -5); #endif return screen; From 71855af14fa079606d4cbdd3d6403e8956c136f8 Mon Sep 17 00:00:00 2001 From: Josep Roca Date: Sun, 16 Apr 2023 10:04:49 +0300 Subject: [PATCH 062/134] fix(docs): ignore-modifiers clarification * Clarify the potential need of adding the ignore-modifiers setting for new sticky key behaviors. * Add ignore-modifiers setting to skq example * Update docs/docs/behaviors/sticky-key.md Co-authored-by: Cem Aksoylar --- docs/docs/behaviors/sticky-key.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/docs/behaviors/sticky-key.md b/docs/docs/behaviors/sticky-key.md index 12541ed8..d881e6b0 100644 --- a/docs/docs/behaviors/sticky-key.md +++ b/docs/docs/behaviors/sticky-key.md @@ -36,7 +36,7 @@ Some typists may find that using a sticky shift key interspersed with rapid typi #### `ignore-modifiers` -This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. +This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. Please note that activating multiple modifiers via [modifier functions](https://zmk.dev/docs/codes/modifiers#modifier-functions) such as `&sk LS(LALT)`, require `ignore-modifiers` enabled in order to function properly. #### Example @@ -66,6 +66,7 @@ This configuration would apply to all sticky keys. This may not be appropriate i bindings = <&kp>; release-after-ms = <1000>; quick-release; + ignore-modifiers; }; }; From 83a151890cd9491036ef2d73cd22db86a7a55f5c Mon Sep 17 00:00:00 2001 From: sporkus <102923689+sporkus@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:28:08 -0700 Subject: [PATCH 063/134] fix(docs): Correct example keymap filename --- docs/docs/development/boards-shields-keymaps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/development/boards-shields-keymaps.md b/docs/docs/development/boards-shields-keymaps.md index 4644ee79..77d8361a 100644 --- a/docs/docs/development/boards-shields-keymaps.md +++ b/docs/docs/development/boards-shields-keymaps.md @@ -30,7 +30,7 @@ in the `app/boards/${arch}/${board_name}` directory, e.g. `app/boards/arm/planck - A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,kscan` which references the configured KSCAN driver (usually a GPIO matrix) - (Optional) A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,matrix_transform` that defines the mapping from KSCAN row/column values to the logical key position for the keyboard. - A `board.cmake` file with CMake directives for how to flash to the device. -- A `keymap/keymap.overlay` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. +- A `${board_name}.keymap` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. ## Pro Micro Compatible Keyboard From e7a6e4016d757d37f0b8df28d7b78f38554e0b27 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 29 Oct 2022 23:17:12 -0500 Subject: [PATCH 064/134] feat(behaviors): Add key position to key events Extended the virtual key position system from combos so that each sensor also gets a virtual key position. This allows sensor behaviors to use the behavior queue API. --- app/include/drivers/behavior.h | 13 +++++++----- app/include/zmk/sensors.h | 7 ++++++- app/include/zmk/virtual_key_position.h | 20 +++++++++++++++++++ .../behavior_sensor_rotate_key_press.c | 3 ++- app/src/combo.c | 3 ++- app/src/keymap.c | 10 ++++++---- 6 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 app/include/zmk/virtual_key_position.h diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 71df7344..df18385f 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -26,6 +26,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b struct zmk_behavior_binding_event event); typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp); enum behavior_locality { @@ -150,21 +151,23 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi /** * @brief Handle the a sensor keymap binding being triggered - * @param dev Pointer to the device structure for the driver instance. + * @param binding Sensor keymap binding which was triggered. * @param sensor Pointer to the sensor device structure for the sensor driver instance. - * @param param1 User parameter specified at time of behavior binding. - * @param param2 User parameter specified at time of behavior binding. + * @param virtual_key_position ZMK_KEYMAP_LEN + sensor number + * @param timestamp Time at which the binding was triggered. * * @retval 0 If successful. * @retval Negative errno code if failure. */ __syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp); static inline int z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, int64_t timestamp) { + const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -177,7 +180,7 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, timestamp); + return api->sensor_binding_triggered(binding, sensor, virtual_key_position, timestamp); } /** diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 8c6c28b3..9e54695f 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -8,5 +8,10 @@ #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) -#define ZMK_KEYMAP_SENSORS_LEN DT_PROP_LEN(ZMK_KEYMAP_SENSORS_NODE, sensors) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) + +#if ZMK_KEYMAP_HAS_SENSORS +#define ZMK_KEYMAP_SENSORS_LEN DT_PROP_LEN(ZMK_KEYMAP_SENSORS_NODE, sensors) +#else +#define ZMK_KEYMAP_SENSORS_LEN 0 +#endif diff --git a/app/include/zmk/virtual_key_position.h b/app/include/zmk/virtual_key_position.h new file mode 100644 index 00000000..48deee5c --- /dev/null +++ b/app/include/zmk/virtual_key_position.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include + +/** + * Gets the virtual key position to use for the sensor with the given index. + */ +#define ZMK_VIRTUAL_KEY_POSITION_SENSOR(index) (ZMK_KEYMAP_LEN + (index)) + +/** + * Gets the virtual key position to use for the combo with the given index. + */ +#define ZMK_VIRTUAL_KEY_POSITION_COMBO(index) (ZMK_KEYMAP_LEN + ZMK_KEYMAP_SENSORS_LEN + (index)) diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c index ed6eedae..72e33ea4 100644 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -21,7 +21,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static int behavior_sensor_rotate_key_press_init(const struct device *dev) { return 0; }; static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, int64_t timestamp) { + const struct device *sensor, uint32_t virtual_key_position, + int64_t timestamp) { struct sensor_value value; int err; uint32_t keycode; diff --git a/app/src/combo.c b/app/src/combo.c index 2e237330..90c89c15 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -19,6 +19,7 @@ #include #include #include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -476,7 +477,7 @@ ZMK_SUBSCRIPTION(combo, zmk_position_state_changed); .key_positions = DT_PROP(n, key_positions), \ .key_position_len = DT_PROP_LEN(n, key_positions), \ .behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, n), \ - .virtual_key_position = ZMK_KEYMAP_LEN + __COUNTER__, \ + .virtual_key_position = ZMK_VIRTUAL_KEY_POSITION_COMBO(__COUNTER__), \ .slow_release = DT_PROP(n, slow_release), \ .layers = DT_PROP(n, layers), \ .layers_len = DT_PROP_LEN(n, layers), \ diff --git a/app/src/keymap.c b/app/src/keymap.c index c4e304d4..825246fa 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -4,16 +4,17 @@ * SPDX-License-Identifier: MIT */ +#include #include #include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); +#include +#include #include #include -#include -#include -#include +#include #include #if ZMK_BLE_IS_CENTRAL @@ -269,7 +270,8 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens continue; } - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, timestamp); + const uint32_t position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number); + ret = behavior_sensor_keymap_binding_triggered(binding, sensor, position, timestamp); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); From 5c6f21b0e0fe0e85b43056e1ec8b6087b5d31e29 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 29 Oct 2022 23:26:25 -0500 Subject: [PATCH 065/134] fix: Fix compiler warnings in sensor code --- app/src/keymap.c | 2 +- app/src/sensors.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/keymap.c b/app/src/keymap.c index 825246fa..1f55ad03 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -255,7 +255,7 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sensor, int64_t timestamp) { for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { - if (zmk_keymap_layer_active(layer) && zmk_sensor_keymap[layer] != NULL) { + if (zmk_keymap_layer_active(layer)) { struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_number]; const struct device *behavior; int ret; diff --git a/app/src/sensors.c b/app/src/sensors.c index efae2bd9..1b92147f 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -35,9 +35,10 @@ struct sensors_data_item { static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; -static void zmk_sensors_trigger_handler(const struct device *dev, struct sensor_trigger *trigger) { +static void zmk_sensors_trigger_handler(const struct device *dev, + const struct sensor_trigger *trigger) { int err; - struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); + const struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); LOG_DBG("sensor %d", item->sensor_number); From 9a73650041da7008fa2df7bd8bbb02ecc8efd9b4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 21 Apr 2023 09:16:28 -0700 Subject: [PATCH 066/134] fix(boards): Move nice!60 to SPI3 for underglow * Move to SPI3 for underglow peripheral, needed after the move to pinctrl. --- app/boards/arm/nice60/nice60-pinctrl.dtsi | 2 +- app/boards/arm/nice60/nice60.dts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi index aced76b4..ace80f10 100644 --- a/app/boards/arm/nice60/nice60-pinctrl.dtsi +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -4,7 +4,7 @@ */ &pinctrl { - spi0_default: spi0_default { + spi3_default: spi3_default { group1 { psels = ; }; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index c982f88e..fdc65d6b 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -109,10 +109,10 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R status = "okay"; }; -&spi0 { +&spi3 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ - pinctrl-0 = <&spi0_default>; + + pinctrl-0 = <&spi3_default>; pinctrl-names = "default"; status = "okay"; From 3db163aa2cf7db2bd710ba93b57f3eb804b086c7 Mon Sep 17 00:00:00 2001 From: Nick Conway Date: Mon, 23 May 2022 16:33:08 -0400 Subject: [PATCH 067/134] feat(behaviors): Add reusable sensor behaviors. * Add new sensor behaviors that either take full bindings add definition, or accept parameters when bound in the keymap. * Remove existing hard-coded key press sensor behavior and instead leverage new generic sensor behaviors to achieve the same functionality. Co-authored-by: nick@conway.dev --- app/CMakeLists.txt | 4 +- app/Kconfig | 6 +- app/Kconfig.behaviors | 24 ++++++ .../behaviors/sensor_rotate_key_press.dtsi | 3 +- .../zmk,behavior-sensor-rotate-key-press.yaml | 19 ----- .../zmk,behavior-sensor-rotate-var.yaml | 25 ++++++ .../behaviors/zmk,behavior-sensor-rotate.yaml | 21 +++++ app/include/drivers/behavior.h | 10 +-- app/src/behaviors/behavior_sensor_rotate.c | 40 ++++++++++ .../behaviors/behavior_sensor_rotate_common.c | 52 +++++++++++++ .../behaviors/behavior_sensor_rotate_common.h | 13 ++++ .../behavior_sensor_rotate_key_press.c | 69 ----------------- .../behaviors/behavior_sensor_rotate_var.c | 31 ++++++++ app/src/keymap.c | 5 +- docs/docs/behaviors/sensor-rotate.md | 77 +++++++++++++++++++ docs/docs/features/encoders.md | 8 +- docs/sidebars.js | 1 + 17 files changed, 301 insertions(+), 107 deletions(-) create mode 100644 app/Kconfig.behaviors delete mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml create mode 100644 app/src/behaviors/behavior_sensor_rotate.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_common.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_common.h delete mode 100644 app/src/behaviors/behavior_sensor_rotate_key_press.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_var.c create mode 100644 docs/docs/behaviors/sensor-rotate.md diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 3da50b57..a647e883 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -51,7 +51,9 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behaviors/behavior_to_layer.c) target_sources(app PRIVATE src/behaviors/behavior_transparent.c) target_sources(app PRIVATE src/behaviors/behavior_none.c) - target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE app PRIVATE src/behaviors/behavior_sensor_rotate.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR app PRIVATE src/behaviors/behavior_sensor_rotate_var.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON app PRIVATE src/behaviors/behavior_sensor_rotate_common.c) target_sources(app PRIVATE src/combo.c) target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behavior_queue.c) diff --git a/app/Kconfig b/app/Kconfig index 431a1bb1..ccc5f42d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -350,11 +350,7 @@ config ZMK_BEHAVIORS_QUEUE_SIZE int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" default 64 -DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE := zmk,behavior-key-toggle - -config ZMK_BEHAVIOR_KEY_TOGGLE - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE)) +rsource "Kconfig.behaviors" config ZMK_MACRO_DEFAULT_WAIT_MS int "Default time to wait (in milliseconds) before triggering the next behavior in macros" diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors new file mode 100644 index 00000000..17850eae --- /dev/null +++ b/app/Kconfig.behaviors @@ -0,0 +1,24 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config ZMK_BEHAVIOR_KEY_TOGGLE + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_KEY_TOGGLE_ENABLED + + +config ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + bool + default n + +config ZMK_BEHAVIOR_SENSOR_ROTATE + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_ENABLED + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + +config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON \ No newline at end of file diff --git a/app/dts/behaviors/sensor_rotate_key_press.dtsi b/app/dts/behaviors/sensor_rotate_key_press.dtsi index d3f084b0..ed1b4cd0 100644 --- a/app/dts/behaviors/sensor_rotate_key_press.dtsi +++ b/app/dts/behaviors/sensor_rotate_key_press.dtsi @@ -8,9 +8,10 @@ behaviors { /* DEPRECATED: `inc_dec_cp` will be removed in the future */ /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { - compatible = "zmk,behavior-sensor-rotate-key-press"; + compatible = "zmk,behavior-sensor-rotate-var"; label = "ENC_KEY_PRESS"; #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; }; }; }; diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml deleted file mode 100644 index 1fc60fcf..00000000 --- a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Sensor rotate key press/release behavior - -compatible: "zmk,behavior-sensor-rotate-key-press" - -properties: - label: - type: string - required: true - "#sensor-binding-cells": - type: int - required: true - const: 2 - -sensor-binding-cells: - - param1 - - param2 diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml new file mode 100644 index 00000000..0da3b4db --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml @@ -0,0 +1,25 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Sensor rotate behavior + +compatible: "zmk,behavior-sensor-rotate-var" + +properties: + label: + type: string + required: true + "#sensor-binding-cells": + type: int + required: true + const: 2 + bindings: + type: phandles + required: true + tap-ms: + type: int + default: 5 + +sensor-binding-cells: + - param1 + - param2 diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml new file mode 100644 index 00000000..d20777b8 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml @@ -0,0 +1,21 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Sensor rotate behavior + +compatible: "zmk,behavior-sensor-rotate" + +properties: + label: + type: string + required: true + "#sensor-binding-cells": + type: int + required: true + const: 0 + bindings: + type: phandle-array + required: true + tap-ms: + type: int + default: 5 diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index df18385f..380fc76f 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -26,8 +26,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b struct zmk_behavior_binding_event event); typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, - int64_t timestamp); + struct zmk_behavior_binding_event event); enum behavior_locality { BEHAVIOR_LOCALITY_CENTRAL, @@ -161,13 +160,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi */ __syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, - int64_t timestamp); + struct zmk_behavior_binding_event event); static inline int z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, int64_t timestamp) { + struct zmk_behavior_binding_event event) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -180,7 +178,7 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, virtual_key_position, timestamp); + return api->sensor_binding_triggered(binding, sensor, event); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c new file mode 100644 index 00000000..e12278bb --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_sensor_rotate + +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { + .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + +static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; + +#define _TRANSFORM_ENTRY(idx, node) \ + { \ + .behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(node, bindings, idx), label), \ + .param1 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param1), (0), \ + (DT_INST_PHA_BY_IDX(node, bindings, idx, param1))), \ + .param2 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param2), (0), \ + (DT_INST_PHA_BY_IDX(node, bindings, idx, param2))), \ + } + +#define SENSOR_ROTATE_INST(n) \ + static struct behavior_sensor_rotate_config behavior_sensor_rotate_config_##n = { \ + .cw_binding = _TRANSFORM_ENTRY(0, n), \ + .ccw_binding = _TRANSFORM_ENTRY(1, n), \ + .tap_ms = DT_INST_PROP_OR(n, tap_ms, 5), \ + .override_params = false, \ + }; \ + DEVICE_DT_INST_DEFINE( \ + n, behavior_sensor_rotate_init, NULL, NULL, &behavior_sensor_rotate_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_INST) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c new file mode 100644 index 00000000..bd31170e --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -0,0 +1,52 @@ + +#include +#include +#include +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, + const struct device *sensor, + struct zmk_behavior_binding_event event) { + const struct device *dev = device_get_binding(binding->behavior_dev); + const struct behavior_sensor_rotate_config *cfg = dev->config; + + struct sensor_value value; + + const int err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); + + if (err < 0) { + LOG_WRN("Failed to get sensor rotation value: %d", err); + return err; + } + + struct zmk_behavior_binding triggered_binding; + switch (value.val1) { + case 1: + triggered_binding = cfg->cw_binding; + if (cfg->override_params) { + triggered_binding.param1 = binding->param1; + } + break; + case -1: + triggered_binding = cfg->ccw_binding; + if (cfg->override_params) { + triggered_binding.param1 = binding->param2; + } + break; + default: + return -ENOTSUP; + } + + LOG_DBG("Sensor binding: %s", binding->behavior_dev); + + zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); + zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + + return ZMK_BEHAVIOR_OPAQUE; +} diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h new file mode 100644 index 00000000..2d58218d --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -0,0 +1,13 @@ + +#include + +struct behavior_sensor_rotate_config { + struct zmk_behavior_binding cw_binding; + struct zmk_behavior_binding ccw_binding; + int tap_ms; + bool override_params; +}; + +int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, + const struct device *sensor, + struct zmk_behavior_binding_event event); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c deleted file mode 100644 index 72e33ea4..00000000 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_sensor_rotate_key_press - -#include -#include -#include - -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -static int behavior_sensor_rotate_key_press_init(const struct device *dev) { return 0; }; - -static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, uint32_t virtual_key_position, - int64_t timestamp) { - struct sensor_value value; - int err; - uint32_t keycode; - LOG_DBG("inc keycode 0x%02X dec keycode 0x%02X", binding->param1, binding->param2); - - err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); - - if (err) { - LOG_WRN("Failed to ge sensor rotation value: %d", err); - return err; - } - - switch (value.val1) { - case 1: - keycode = binding->param1; - break; - case -1: - keycode = binding->param2; - break; - default: - return -ENOTSUP; - } - - LOG_DBG("SEND %d", keycode); - - ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, true, timestamp)); - - // TODO: Better way to do this? - k_msleep(5); - - return ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, false, timestamp)); -} - -static const struct behavior_driver_api behavior_sensor_rotate_key_press_driver_api = { - .sensor_binding_triggered = on_sensor_binding_triggered}; - -#define KP_INST(n) \ - DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_key_press_init, NULL, NULL, NULL, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_sensor_rotate_key_press_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(KP_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c new file mode 100644 index 00000000..a82267a5 --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_sensor_rotate_var + +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { + .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + +static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; + +#define SENSOR_ROTATE_VAR_INST(n) \ + static struct behavior_sensor_rotate_config behavior_sensor_rotate_var_config_##n = { \ + .cw_binding = {.behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label)}, \ + .ccw_binding = {.behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label)}, \ + .tap_ms = DT_INST_PROP(n, tap_ms), \ + .override_params = true, \ + }; \ + DEVICE_DT_INST_DEFINE( \ + n, behavior_sensor_rotate_var_init, NULL, NULL, &behavior_sensor_rotate_var_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_var_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_VAR_INST) diff --git a/app/src/keymap.c b/app/src/keymap.c index 1f55ad03..909fd20d 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -270,8 +270,9 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens continue; } - const uint32_t position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number); - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, position, timestamp); + struct zmk_behavior_binding_event event = { + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number), .timestamp = timestamp}; + ret = behavior_sensor_keymap_binding_triggered(binding, sensor, event); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); diff --git a/docs/docs/behaviors/sensor-rotate.md b/docs/docs/behaviors/sensor-rotate.md new file mode 100644 index 00000000..bd8a50bc --- /dev/null +++ b/docs/docs/behaviors/sensor-rotate.md @@ -0,0 +1,77 @@ +--- +title: Sensor Rotation +sidebar_label: Sensor Rotation +--- + +## Summary + +The Sensor Rotation behavior triggers a different behavior, depending on whether the sensor is rotated clockwise or counter-clockwise. Two variants of this behavior are available, allowing either fully specifying the +two behaviors and their parameters together, or allowing binding the sensor rotation with different clockwise and counterclockwise parameters in the keymap itself. + +## Sensor Rotation + +The standard sensor rotation behavior allows fully binding behaviors to be invoked: + +- If rotated counter-clockwise, the first bound behavior is triggered. +- If rotated clockwise, the second bound behavior is triggered. + +### Configuration + +Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/underglow.md) to change the RGB brightness: + +``` +/ { + behaviors { + rgb_encoder: rgb_encoder { + compatible = "zmk,behavior-sensor-rotate"; + label = "RGB_ENCODER"; + #sensor-binding-cells = <0>; + bindings = <&rgb_ug RGB_BRD>, <&rgb_ug RGB_BRI>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + base { + ... + sensor-bindings = <&rgb_encoder>; + } + }; +}; +``` + +## Variable Sensor Rotation + +The variable sensor rotation behavior is configured with two behaviors that each expect a single parameter, +allowing the sensor rotation instance to be bound with two parameters at usage time. + +- If rotated counter-clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. +- If rotated clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. + +### Configuration + +Here is an example, showing how send key presses on rotation: + +First, defining the sensor rotation itself, binding the [Key Press Behavior](/docs/behaviors/key-press.md) twice, then binding it in the `sensor-bindings` property of a keymap layer: + +``` +/ { + behaviors { + rot_kp: behavior_sensor_rotate_kp { + compatible = "zmk,behavior-sensor-rotate-var"; + label = "ENC_KP"; + #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + base { + ... + sensor-bindings = <&rot_kp PG_DN PG_UP>; + } + } +}; +``` diff --git a/docs/docs/features/encoders.md b/docs/docs/features/encoders.md index 225ee6f3..29906c90 100644 --- a/docs/docs/features/encoders.md +++ b/docs/docs/features/encoders.md @@ -23,17 +23,17 @@ Keyboards and macropads with encoder support will typically take the two EC11 pi ### Rotation -Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`, which is defined in each keymap layer in the following format: +Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`. See [Sensor Rotation](../behaviors/sensor-rotate.md) for customizing this behavior. ``` -sensor-bindings = ; +sensor-bindings = ; ``` -- `BINDING`, for now, has only one behavior available; `&inc_dec_kp` for key presses (see [Key Press](../behaviors/key-press.md) for details on available keycodes). +- `BINDING` is either a user-defined behavior, or `&inc_dec_kp` for key presses (see [Key Press](../behaviors/key-press.md) for details on available keycodes). - `CW_KEY` is the keycode activated by a clockwise turn. - `CCW_KEY` is the keycode activated by a counter-clockwise turn. -Additional encoders can be configured by adding more `BINDING CW_KEY CCW_KEY` sets immediately after the first. +Additional encoders can be configured by adding more bindings immediately after the first. As an example, a complete `sensor-bindings` for a Kyria with two encoders could look like: diff --git a/docs/sidebars.js b/docs/sidebars.js index a52f3302..21585747 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -35,6 +35,7 @@ module.exports = { "behaviors/tap-dance", "behaviors/caps-word", "behaviors/key-repeat", + "behaviors/sensor-rotate", "behaviors/reset", "behaviors/bluetooth", "behaviors/outputs", From 9d64c2a3a0bdd3d092585be1c6ba86fc8e26d084 Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Sat, 22 Apr 2023 20:14:08 -0400 Subject: [PATCH 068/134] fix(docs): switch sensor rotate parameter order --- docs/docs/behaviors/sensor-rotate.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/docs/behaviors/sensor-rotate.md b/docs/docs/behaviors/sensor-rotate.md index bd8a50bc..02e56924 100644 --- a/docs/docs/behaviors/sensor-rotate.md +++ b/docs/docs/behaviors/sensor-rotate.md @@ -12,8 +12,8 @@ two behaviors and their parameters together, or allowing binding the sensor rota The standard sensor rotation behavior allows fully binding behaviors to be invoked: -- If rotated counter-clockwise, the first bound behavior is triggered. -- If rotated clockwise, the second bound behavior is triggered. +- If rotated clockwise, the first bound behavior is triggered. +- If rotated counter-clockwise, the second bound behavior is triggered. ### Configuration @@ -26,7 +26,7 @@ Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/under compatible = "zmk,behavior-sensor-rotate"; label = "RGB_ENCODER"; #sensor-binding-cells = <0>; - bindings = <&rgb_ug RGB_BRD>, <&rgb_ug RGB_BRI>; + bindings = <&rgb_ug RGB_BRI>, <&rgb_ug RGB_BRD>; }; }; @@ -46,8 +46,8 @@ Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/under The variable sensor rotation behavior is configured with two behaviors that each expect a single parameter, allowing the sensor rotation instance to be bound with two parameters at usage time. -- If rotated counter-clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. -- If rotated clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. +- If rotated clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. +- If rotated counter-clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. ### Configuration @@ -70,7 +70,7 @@ First, defining the sensor rotation itself, binding the [Key Press Behavior](/do compatible = "zmk,keymap"; base { ... - sensor-bindings = <&rot_kp PG_DN PG_UP>; + sensor-bindings = <&rot_kp PG_UP PG_DN>; } } }; From 53dea223b73922e385ecf11883e5327a4f328eae Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 14 Jan 2023 12:01:33 -0500 Subject: [PATCH 069/134] feat(shields): Add splitkb.com Kyria Rev3. --- app/boards/shields/kyria/Kconfig.defconfig | 2 +- app/boards/shields/kyria/Kconfig.shield | 8 ++++ app/boards/shields/kyria/kyria_rev3.conf | 10 +++++ app/boards/shields/kyria/kyria_rev3.dtsi | 41 +++++++++++++++++++ app/boards/shields/kyria/kyria_rev3.keymap | 38 +++++++++++++++++ app/boards/shields/kyria/kyria_rev3.zmk.yml | 15 +++++++ .../shields/kyria/kyria_rev3_left.overlay | 29 +++++++++++++ .../shields/kyria/kyria_rev3_right.overlay | 33 +++++++++++++++ 8 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 app/boards/shields/kyria/kyria_rev3.conf create mode 100644 app/boards/shields/kyria/kyria_rev3.dtsi create mode 100644 app/boards/shields/kyria/kyria_rev3.keymap create mode 100644 app/boards/shields/kyria/kyria_rev3.zmk.yml create mode 100644 app/boards/shields/kyria/kyria_rev3_left.overlay create mode 100644 app/boards/shields/kyria/kyria_rev3_right.overlay diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index cdb57b6b..53b441cb 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -1,5 +1,5 @@ -if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT +if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT || SHIELD_KYRIA_REV3_LEFT config ZMK_KEYBOARD_NAME default "Kyria" diff --git a/app/boards/shields/kyria/Kconfig.shield b/app/boards/shields/kyria/Kconfig.shield index 6304f5d5..52df9378 100644 --- a/app/boards/shields/kyria/Kconfig.shield +++ b/app/boards/shields/kyria/Kconfig.shield @@ -19,3 +19,11 @@ config SHIELD_KYRIA_REV2_LEFT config SHIELD_KYRIA_REV2_RIGHT def_bool $(shields_list_contains,kyria_rev2_right) select SHIELD_KYRIA + +config SHIELD_KYRIA_REV3_LEFT + def_bool $(shields_list_contains,kyria_rev3_left) + select SHIELD_KYRIA + +config SHIELD_KYRIA_REV3_RIGHT + def_bool $(shields_list_contains,kyria_rev3_right) + select SHIELD_KYRIA diff --git a/app/boards/shields/kyria/kyria_rev3.conf b/app/boards/shields/kyria/kyria_rev3.conf new file mode 100644 index 00000000..7a0b5b6c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.conf @@ -0,0 +1,10 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Kyria OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/kyria/kyria_rev3.dtsi b/app/boards/shields/kyria/kyria_rev3.dtsi new file mode 100644 index 00000000..4a500006 --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.dtsi @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_common.dtsi" + +/ { + chosen { + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | + // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | + // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | + // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) + >; + }; +}; + +&left_encoder { + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; +}; + +&right_encoder { + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; +}; diff --git a/app/boards/shields/kyria/kyria_rev3.keymap b/app/boards/shields/kyria/kyria_rev3.keymap new file mode 100644 index 00000000..fff2e051 --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +/* Uncomment this block if using RGB +&led_strip { + chain-length = <6>; + // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <25>; // Uncomment if using only per-key LEDs. +}; + */ + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | + // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; +}; diff --git a/app/boards/shields/kyria/kyria_rev3.zmk.yml b/app/boards/shields/kyria/kyria_rev3.zmk.yml new file mode 100644 index 00000000..bf84c82c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: kyria_rev3 +name: Kyria Rev3 +type: shield +url: https://splitkb.com/products/kyria-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - kyria_rev3_left + - kyria_rev3_right diff --git a/app/boards/shields/kyria/kyria_rev3_left.overlay b/app/boards/shields/kyria/kyria_rev3_left.overlay new file mode 100644 index 00000000..d00b9e4a --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3_left.overlay @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_rev3.dtsi" + +&kscan0 { + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; diff --git a/app/boards/shields/kyria/kyria_rev3_right.overlay b/app/boards/shields/kyria/kyria_rev3_right.overlay new file mode 100644 index 00000000..ee69730c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3_right.overlay @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_rev3.dtsi" + +&default_transform { + col-offset = <7>; +}; + +&kscan0 { + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + status = "okay"; +}; From 9c4f1e02d14e2903d7ec377fc3042bb704cc7253 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:24:36 +0800 Subject: [PATCH 070/134] fix(docs): Update references to QMK settings * Remove TAPPING_FORCE_HOLD reference * Remove IGNORE_MOD_TAP_INTERRUPT reference --- docs/docs/behaviors/hold-tap.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 1dfb8e5d..f267e4a4 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -49,8 +49,6 @@ Defines how long a key must be pressed to trigger Hold behavior. If you press a tapped hold-tap again within `quick-tap-ms` milliseconds, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled). -In QMK, unlike ZMK, this functionality is enabled by default, and you turn it off using `TAPPING_FORCE_HOLD`. - #### `global-quick-tap` If `global-quick-tap` is enabled, then `quick-tap-ms` will apply not only when the given hold-tap is tapped, but for any key tapped before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. @@ -319,4 +317,4 @@ This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) ### Comparison to QMK -The hold-preferred flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The 'balanced' flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is similar to `IGNORE_MOD_TAP_INTERRUPT`. +The `hold-preferred` flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The `balanced` flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is the QMK default. From 32ae776c42215d7302ab47787cbfb47298ccb532 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:16:36 -0500 Subject: [PATCH 071/134] refactor: Add more checks to pre-commit Updated existing pre-commit hooks and added some new hooks: - Remove trailing whitespace - Ensure every non-empty file ends with a new line - Check YAML file validity - Prevent adding large files - Ensure any scripts with shebangs are executable Added a GitHub action to run pre-commit on every commit. Removed any existing actions which duplicate pre-commit. Ran pre-commit on the codebase. --- .github/pull_request_template.md | 24 +++--- .github/workflows/build-user-config.yml | 4 +- .github/workflows/build.yml | 6 +- .github/workflows/clang-format-lint.yml | 29 ------- .github/workflows/doc-checks.yml | 10 --- .../hardware-metadata-validation.yml | 11 --- .github/workflows/pre-commit.yml | 15 ++++ .pre-commit-config.yaml | 12 ++- .vscode/settings.json | 2 +- app/.prettierrc.js | 2 +- .../bluemicro840/arduino_pro_micro_pins.dtsi | 10 +-- .../arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- .../corneish_zen/corneish_zen_v2_right.dts | 2 +- app/boards/arm/ferris/README.md | 1 - app/boards/arm/nice60/README.md | 2 + app/boards/arm/nice60/nice60.keymap | 4 +- app/boards/arm/pillbug/pillbug.dts | 2 +- app/boards/arm/preonic/preonic_rev3.yaml | 2 +- app/boards/arm/s40nc/README.md | 2 + app/boards/arm/s40nc/s40nc.keymap | 8 +- app/boards/shields/bfo9000/README.md | 8 +- .../boardsource5x12/boardsource5x12.keymap | 6 +- .../boardsource5x12/boardsource5x12.overlay | 2 +- app/boards/shields/chalice/chalice.keymap | 8 +- app/boards/shields/chalice/chalice.overlay | 4 +- app/boards/shields/clog/clog.dtsi | 2 +- app/boards/shields/corne/corne.dtsi | 2 +- app/boards/shields/eek/eek.keymap | 12 +-- app/boards/shields/eek/eek.overlay | 2 +- .../shields/elephant42/Kconfig.defconfig | 2 +- app/boards/shields/elephant42/elephant42.dtsi | 4 +- .../shields/elephant42/elephant42.keymap | 4 +- .../elephant42/elephant42_left.overlay | 2 +- .../elephant42/elephant42_right.overlay | 2 +- app/boards/shields/helix/helix.dtsi | 2 +- app/boards/shields/helix/helix.keymap | 4 +- app/boards/shields/helix/helix_left.overlay | 2 +- .../shields/hummingbird/hummingbird.overlay | 2 +- app/boards/shields/iris/Kconfig.defconfig | 2 +- app/boards/shields/iris/iris.dtsi | 2 +- app/boards/shields/jian/jian.dtsi | 2 +- app/boards/shields/jiran/jiran.dtsi | 2 +- app/boards/shields/jorne/Kconfig.defconfig | 2 +- app/boards/shields/jorne/jorne.dtsi | 2 +- app/boards/shields/kyria/Kconfig.defconfig | 2 +- app/boards/shields/kyria/kyria_common.dtsi | 2 +- app/boards/shields/leeloo/Kconfig.defconfig | 2 +- app/boards/shields/leeloo/README.md | 19 +++-- app/boards/shields/lily58/lily58.dtsi | 2 +- app/boards/shields/lotus58/Kconfig.defconfig | 2 +- app/boards/shields/lotus58/lotus58.dtsi | 2 +- app/boards/shields/lotus58/lotus58.keymap | 10 +-- .../shields/lotus58/lotus58_left.overlay | 2 +- app/boards/shields/microdox/Kconfig.defconfig | 2 +- app/boards/shields/microdox/microdox.dtsi | 2 +- app/boards/shields/murphpad/murphpad.keymap | 26 +++--- app/boards/shields/murphpad/murphpad.overlay | 2 +- app/boards/shields/naked60/naked60.keymap | 4 +- app/boards/shields/nibble/nibble.keymap | 2 +- app/boards/shields/nibble/nibble.overlay | 2 +- app/boards/shields/nice_view/README.md | 2 +- .../shields/nice_view_adapter/README.md | 2 +- app/boards/shields/pancake/pancake.keymap | 12 +-- app/boards/shields/pancake/pancake.overlay | 4 +- app/boards/shields/qaz/qaz.overlay | 2 +- .../shields/quefrency/Kconfig.defconfig | 4 +- app/boards/shields/quefrency/quefrency.dtsi | 10 +-- .../shields/quefrency/quefrency_right.overlay | 2 +- app/boards/shields/redox/redox.dtsi | 4 +- app/boards/shields/redox/redox.keymap | 4 +- app/boards/shields/snap/Kconfig.defconfig | 2 +- app/boards/shields/snap/snap.dtsi | 2 +- app/boards/shields/snap/snap.keymap | 2 +- app/boards/shields/snap/snap_left.overlay | 2 +- app/boards/shields/snap/snap_right.overlay | 2 +- app/boards/shields/sofle/Kconfig.defconfig | 2 +- .../splitkb_aurora_corne/Kconfig.defconfig | 2 +- .../splitkb_aurora_corne_left.overlay | 2 +- .../splitkb_aurora_corne_right.overlay | 2 +- .../splitkb_aurora_lily58/Kconfig.defconfig | 2 +- .../splitkb_aurora_lily58_left.overlay | 2 +- .../splitkb_aurora_lily58_right.overlay | 2 +- .../splitkb_aurora_sweep/Kconfig.defconfig | 2 +- .../splitkb_aurora_sweep.keymap | 52 ++++++------ .../splitkb_aurora_sweep_left.overlay | 2 +- .../splitkb_aurora_sweep_right.overlay | 2 +- .../shields/splitreus62/Kconfig.defconfig | 6 +- .../shields/splitreus62/splitreus62.dtsi | 2 +- .../splitreus62/splitreus62_right.overlay | 2 +- app/boards/shields/tg4x/README.md | 6 +- app/boards/shields/tg4x/tg4x.overlay | 2 +- app/boards/shields/tidbit/tidbit.keymap | 2 +- app/boards/shields/tidbit/tidbit_19key.keymap | 2 +- .../two_percent_milk/two_percent_milk.keymap | 4 +- .../shields/waterfowl/Kconfig.defconfig | 2 +- app/boards/shields/waterfowl/waterfowl.dtsi | 2 +- app/boards/shields/waterfowl/waterfowl.keymap | 12 +-- app/boards/shields/zmk_uno/zmk_uno.keymap | 8 +- app/boards/shields/zodiark/Kconfig.defconfig | 2 +- app/boards/shields/zodiark/zodiark.keymap | 2 +- app/core-coverage.yml | 64 +++++++-------- .../dts/bindings/gpio/maxim,max7318.yaml | 20 ++--- .../behaviors/zmk,behavior-macro.yaml | 2 +- .../behaviors/zmk,behavior-tap-dance.yaml | 2 +- .../bindings/display/gooddisplay,il0323.yaml | 82 +++++++++---------- .../macros/zmk,macro-control-mode-press.yaml | 2 +- .../zmk,macro-control-mode-release.yaml | 2 +- .../macros/zmk,macro-control-tap-time.yaml | 2 +- .../macros/zmk,macro-control-wait-time.yaml | 2 +- .../macros/zmk,macro-pause-for-release.yaml | 2 +- app/dts/bindings/zmk,combos.yaml | 2 +- app/include/linker/zmk-events.ld | 2 +- app/package.json | 4 +- app/src/activity.c | 4 +- app/src/display/widgets/Kconfig | 2 +- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 10 +-- .../layer-filter-0/native_posix_64.keymap | 26 +++--- .../layer-filter-1/native_posix_64.keymap | 6 +- .../multiple-timeouts/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 76 ++++++++--------- .../native_posix_64.keymap | 24 +++--- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 46 +++++------ .../native_posix_64.keymap | 8 +- .../press-release/native_posix_64.keymap | 26 +++--- .../press-timeout/native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 18 ++-- .../native_posix_64.keymap | 6 +- .../balanced/1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-retro-tap/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../many-nested/native_posix_64.keymap | 16 ++-- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-retro-tap/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-nested-timeouts/native_posix_64.keymap | 10 +-- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../1-basic/native_posix_64.keymap | 4 +- .../kp-press-release/native_posix_64.keymap | 2 +- .../kt-alt-tab/native_posix_64.keymap | 18 ++-- .../kt-modded-alpha/native_posix_64.keymap | 10 +-- .../native_posix_64.keymap | 4 +- .../kt-press-release/native_posix_64.keymap | 4 +- app/tests/macros/basic/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../press-mid-macro/native_posix_64.keymap | 2 +- .../press-release/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../kp-lctl-dn-lctl-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 6 +- .../pending | 4 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../1-normal/native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../3-covered/native_posix_64.keymap | 2 +- .../1-os-dn-up/native_posix_64.keymap | 4 +- .../10-callum-mods/native_posix_64.keymap | 12 +-- .../10-sl-sl-kp/native_posix_64.keymap | 16 ++-- .../native_posix_64.keymap | 10 +-- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 18 ++-- .../9-sk-dn-up-dn-up/native_posix_64.keymap | 6 +- .../tap-dance/1b-tap2/native_posix_64.keymap | 4 +- .../tap-dance/1c-tap3/native_posix_64.keymap | 4 +- .../tap-dance/2a-hold1/native_posix_64.keymap | 2 +- .../tap-dance/2b-hold2/native_posix_64.keymap | 4 +- .../tap-dance/2c-hold3/native_posix_64.keymap | 4 +- .../1-single_keypress/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 6 +- docs/package-lock.json | 17 ++-- docs/package.json | 2 +- docs/src/templates/setup.ps1.mustache | 4 +- docs/src/templates/setup.sh.mustache | 2 +- schema/hardware-metadata.schema.json | 32 ++------ 247 files changed, 759 insertions(+), 797 deletions(-) delete mode 100644 .github/workflows/clang-format-lint.yml create mode 100644 .github/workflows/pre-commit.yml diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9c3543dd..9e523a36 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,13 +1,15 @@ + ## Board/Shield Check-list - - [ ] This board/shield is tested working on real hardware - - [ ] Definitions follow the general style of other shields/boards upstream ([Reference](https://zmk.dev/docs/development/new-shield)) - - [ ] `.zmk.yml` metadata file added - - [ ] 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) - - [ ] General consistent formatting of DeviceTree files - - [ ] Keymaps do not use deprecated key defines (Check using the [upgrader tool](https://zmk.dev/docs/codes/keymap-upgrader)) - - [ ] `&pro_micro` used in favor of `&pro_micro_d/a` if applicable - - [ ] If split, no name added for the right/peripheral half - - [ ] Kconfig.defconfig file correctly wraps *all* configuration in conditional on the shield symbol - - [ ] `.conf` file has optional extra features commented out - - [ ] Keyboard/PCB is part of a shipped group buy or is generally available in stock to purchase (OSH/personal projects without general availability should create a zmk-config repo instead) + +- [ ] This board/shield is tested working on real hardware +- [ ] Definitions follow the general style of other shields/boards upstream ([Reference](https://zmk.dev/docs/development/new-shield)) +- [ ] `.zmk.yml` metadata file added +- [ ] 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) +- [ ] General consistent formatting of DeviceTree files +- [ ] Keymaps do not use deprecated key defines (Check using the [upgrader tool](https://zmk.dev/docs/codes/keymap-upgrader)) +- [ ] `&pro_micro` used in favor of `&pro_micro_d/a` if applicable +- [ ] If split, no name added for the right/peripheral half +- [ ] Kconfig.defconfig file correctly wraps _all_ configuration in conditional on the shield symbol +- [ ] `.conf` file has optional extra features commented out +- [ ] Keyboard/PCB is part of a shipped group buy or is generally available in stock to purchase (OSH/personal projects without general availability should create a zmk-config repo instead) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 3d89ed7b..b1e0602d 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -19,8 +19,8 @@ on: required: false type: string archive_name: - description: 'Archive output file name' - default: 'firmware' + description: "Archive output file name" + default: "firmware" required: false type: string diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f472f755..82b156e1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -131,7 +131,7 @@ jobs: for (const configuration of combinedUnique) { if (!perBoard[configuration.board]) perBoard[configuration.board] = []; - + perBoard[configuration.board].push({ shield: configuration.shield, 'cmake-args': configuration['cmake-args'], @@ -234,7 +234,7 @@ jobs: }; } } else if (hm.exposes) { - return hm.exposes.flatMap(i => + return hm.exposes.flatMap(i => metadata.interconnects[i].shields.flatMap(s => boardAndShield(hm, s)) ); } else { @@ -243,7 +243,7 @@ jobs: break; case "shield": if (hm.features && hm.features.includes("keys")) { - return hm.requires.flatMap(i => + return hm.requires.flatMap(i => metadata.interconnects[i].boards.flatMap(b => boardAndShield(b, hm)) ); } else { diff --git a/.github/workflows/clang-format-lint.yml b/.github/workflows/clang-format-lint.yml deleted file mode 100644 index 8c2cfbcf..00000000 --- a/.github/workflows/clang-format-lint.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Clang Format - -on: - push: - paths: - - ".github/workflows/clang-format-lint.yml" - - "app/boards/**/*.c" - - "app/include/**/*.h" - - "app/src/**" - - "app/drivers/**/*.c" - - "app/drivers/**/*.h" - pull_request: - paths: - - ".github/workflows/clang-format-lint.yml" - - "app/boards/**/*.c" - - "app/include/**/*.h" - - "app/src/**" - - "app/drivers/**/*.c" - - "app/drivers/**/*.h" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: DoozyX/clang-format-lint-action@v0.13 - with: - source: "./app" - extensions: "h,c" diff --git a/.github/workflows/doc-checks.yml b/.github/workflows/doc-checks.yml index d048a03e..91e65e6d 100644 --- a/.github/workflows/doc-checks.yml +++ b/.github/workflows/doc-checks.yml @@ -21,16 +21,6 @@ jobs: - name: ESLint run: npm run lint working-directory: docs - prettier: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: bahmutov/npm-install@v1 - with: - working-directory: docs - - name: Prettier check - run: npm run prettier:check - working-directory: docs typecheck: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index 4b10a28b..10092836 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -15,17 +15,6 @@ on: - "app/scripts/west_commands/metadata.py" jobs: - check-metadata-format: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/checkout@v3 - - uses: bahmutov/npm-install@v1 - with: - working-directory: app - - name: Prettier Check - run: npm run prettier:check - working-directory: app validate-metadata: runs-on: ubuntu-latest container: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 00000000..a6583d4f --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,15 @@ +name: pre-commit + +on: + pull_request: + push: + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - uses: pre-commit/action@v3.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02adf09c..7687fc6e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,12 +1,20 @@ fail_fast: false repos: - repo: https://github.com/pocc/pre-commit-hooks - rev: v1.1.1 + rev: v1.3.5 hooks: - id: clang-format args: - -i - repo: https://github.com/pre-commit/mirrors-prettier - rev: v2.2.1 + rev: v2.7.1 hooks: - id: prettier + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: check-yaml + - id: check-added-large-files + - id: check-shebang-scripts-are-executable + exclude: "\\.mustache$" diff --git a/.vscode/settings.json b/.vscode/settings.json index 2730549a..aea29cf0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,4 +4,4 @@ "*.keymap": "dts" }, "python.formatting.provider": "black" -} \ No newline at end of file +} diff --git a/app/.prettierrc.js b/app/.prettierrc.js index 806328d9..2a1f0b48 100644 --- a/app/.prettierrc.js +++ b/app/.prettierrc.js @@ -1,3 +1,3 @@ module.exports = { - endOfLine: "auto", + endOfLine: "auto", }; diff --git a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi index 237f5c45..53514d64 100644 --- a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi @@ -11,11 +11,11 @@ gpio-map-mask = <0xffffffff 0xffffffc0>; gpio-map-pass-thru = <0 0x3f>; gpio-map - = <0 0 &gpio0 8 0> /* D0 D2 */ - , <1 0 &gpio0 6 0> /* D1 D3*/ - , <2 0 &gpio0 15 0> /* D2 D1*/ - , <3 0 &gpio0 17 0> /* D3 D0*/ - , <4 0 &gpio0 20 0> /* D4/A6 D4*/ + = <0 0 &gpio0 8 0> /* D0 D2 */ + , <1 0 &gpio0 6 0> /* D1 D3*/ + , <2 0 &gpio0 15 0> /* D2 D1*/ + , <3 0 &gpio0 17 0> /* D3 D0*/ + , <4 0 &gpio0 20 0> /* D4/A6 D4*/ , <5 0 &gpio0 13 0> /* D5 C6*/ , <6 0 &gpio0 24 0> /* D6/A7 D7*/ , <7 0 &gpio0 9 0> /* D7 E6*/ diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 4dbdaef5..65092dc5 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -32,7 +32,7 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> , <&gpio0 5 GPIO_ACTIVE_HIGH> - ; + ; }; leds { diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 52439e4f..980c9900 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -33,7 +33,7 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> ; - + }; leds { diff --git a/app/boards/arm/ferris/README.md b/app/boards/arm/ferris/README.md index 2793c6fa..b6fdcdf2 100644 --- a/app/boards/arm/ferris/README.md +++ b/app/boards/arm/ferris/README.md @@ -1,6 +1,5 @@ # Building ZMK for the Ferris 0.2 - ## Standard Build ``` diff --git a/app/boards/arm/nice60/README.md b/app/boards/arm/nice60/README.md index 49433df8..dce230ae 100644 --- a/app/boards/arm/nice60/README.md +++ b/app/boards/arm/nice60/README.md @@ -1,9 +1,11 @@ # nice!60 + ![nice!60](https://i.imgur.com/0YWv5PE.png) The nice!60 is a hotswap 60% made by Nice Keyboards. https://nicekeyboards.com/nice-60 ## Building nice!60 ZMK firmware + ``` west build -p -b nice60 ``` diff --git a/app/boards/arm/nice60/nice60.keymap b/app/boards/arm/nice60/nice60.keymap index bdb188df..edfec32e 100644 --- a/app/boards/arm/nice60/nice60.keymap +++ b/app/boards/arm/nice60/nice60.keymap @@ -12,7 +12,7 @@ / { keymap { compatible = "zmk,keymap"; - + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | @@ -40,7 +40,7 @@ // ------------------------------------------------------------------------------------------------ bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR - &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans + &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts index c1330319..a2e56df3 100644 --- a/app/boards/arm/pillbug/pillbug.dts +++ b/app/boards/arm/pillbug/pillbug.dts @@ -29,7 +29,7 @@ label = "Blue LED"; }; }; - + ext-power { compatible = "zmk,ext-power-generic"; label = "EXT_POWER"; diff --git a/app/boards/arm/preonic/preonic_rev3.yaml b/app/boards/arm/preonic/preonic_rev3.yaml index 679e1464..861f1d2d 100644 --- a/app/boards/arm/preonic/preonic_rev3.yaml +++ b/app/boards/arm/preonic/preonic_rev3.yaml @@ -16,4 +16,4 @@ supported: - lsm303dlhc - nvs - can - - kscan \ No newline at end of file + - kscan diff --git a/app/boards/arm/s40nc/README.md b/app/boards/arm/s40nc/README.md index 32db57e9..96bebb33 100644 --- a/app/boards/arm/s40nc/README.md +++ b/app/boards/arm/s40nc/README.md @@ -1,9 +1,11 @@ # S40NC + ![S40NC](https://i.imgur.com/fk8587n.jpg) Shorty40NoCordy (S40NC) is a limited run 40% bluetooth keyboard originally made and sold by MechWild. ## Building S40NC ZMK firmware + ``` west build -p -b s40nc ``` diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index c43bc671..f0e60e7d 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -17,7 +17,7 @@ / { keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC @@ -35,7 +35,7 @@ &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END >; }; - + raise_layer { bindings = < &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &trans @@ -44,7 +44,7 @@ &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END >; }; - + control_layer { bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP @@ -55,4 +55,4 @@ }; }; }; - + diff --git a/app/boards/shields/bfo9000/README.md b/app/boards/shields/bfo9000/README.md index 1e91fdcf..54893aed 100644 --- a/app/boards/shields/bfo9000/README.md +++ b/app/boards/shields/bfo9000/README.md @@ -4,10 +4,10 @@ Customizable full-size split ortholinear. ## Features -* Compatible with MX-compatible, Alps-compatible, and Kailh Low-Profile Choc switches. -* Breakoff pieces to allow for 4 to 6 rows and 7 to 9 columns. -* RGB LED connections +- Compatible with MX-compatible, Alps-compatible, and Kailh Low-Profile Choc switches. +- Breakoff pieces to allow for 4 to 6 rows and 7 to 9 columns. +- RGB LED connections ## Hardware Notes -[Included default keymap](http://www.keyboard-layout-editor.com/#/gists/51293c31afcd5f1765e8f413a46bfcf8) \ No newline at end of file +[Included default keymap](http://www.keyboard-layout-editor.com/#/gists/51293c31afcd5f1765e8f413a46bfcf8) diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.keymap b/app/boards/shields/boardsource5x12/boardsource5x12.keymap index 8956ca98..cb851c35 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.keymap +++ b/app/boards/shields/boardsource5x12/boardsource5x12.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include @@ -28,7 +28,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LSHFT &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RET - &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; }; @@ -44,7 +44,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(NON_US_HASH) &kp LS(NON_US_BSLH) &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE >; }; diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.overlay b/app/boards/shields/boardsource5x12/boardsource5x12.overlay index 0fafe8a1..080a2392 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.overlay +++ b/app/boards/shields/boardsource5x12/boardsource5x12.overlay @@ -39,4 +39,4 @@ , <&pro_micro 6 GPIO_ACTIVE_HIGH> ; }; -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/app/boards/shields/chalice/chalice.keymap b/app/boards/shields/chalice/chalice.keymap index cba93d03..c72e3ee1 100644 --- a/app/boards/shields/chalice/chalice.keymap +++ b/app/boards/shields/chalice/chalice.keymap @@ -19,9 +19,9 @@ bindings = < &kp ESC &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp INSERT &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp DELETE &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER + &kp DELETE &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP - &kp LCTRL &kp LALT &kp SPACE &mo 1 &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + &kp LCTRL &kp LALT &kp SPACE &mo 1 &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT >; }; @@ -30,9 +30,9 @@ bindings = < &bootloader &out OUT_TOG &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &bt BT_CLR &rgb_ug RGB_TOG &rgb_ug RGB_HUD &rgb_ug RGB_HUI &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &bt BT_SEL 0 &rgb_ug RGB_EFF &rgb_ug RGB_SAD &rgb_ug RGB_SAI &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &bt BT_SEL 0 &rgb_ug RGB_EFF &rgb_ug RGB_SAD &rgb_ug RGB_SAI &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 1 &rgb_ug RGB_EFR &rgb_ug RGB_BRD &rgb_ug RGB_BRI &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp PG_UP - &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp END + &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp END >; }; }; diff --git a/app/boards/shields/chalice/chalice.overlay b/app/boards/shields/chalice/chalice.overlay index 34cbd34e..6778588b 100644 --- a/app/boards/shields/chalice/chalice.overlay +++ b/app/boards/shields/chalice/chalice.overlay @@ -21,7 +21,7 @@ map = < RC(0,0) RC(1,0) RC(0,1) RC(1,1) RC(0,2) RC(1,2) RC(0,3) RC(1,3) RC(0,4) RC(1,4) RC(0,5) RC(1,5) RC(0,6) RC(1,6) RC(4,6) RC(2,0) RC(3,0) RC(2,1) RC(3,1) RC(2,2) RC(3,2) RC(2,3) RC(3,3) RC(2,4) RC(3,4) RC(2,5) RC(3,5) RC(2,6) RC(3,6) RC(5,6) - RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) + RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) RC(6,0) RC(7,0) RC(6,1) RC(7,1) RC(6,2) RC(7,2) RC(6,3) RC(7,3) RC(6,4) RC(7,4) RC(6,5) RC(7,5) RC(8,6) RC(9,6) RC(8,0) RC(9,1) RC(8,2) RC(9,2) RC(8,3) RC(9,3) RC(8,4) RC(9,4) RC(8,5) RC(9,5) >; @@ -35,7 +35,7 @@ map = < RC(0,0) RC(1,0) RC(0,1) RC(1,1) RC(0,2) RC(1,2) RC(0,3) RC(1,3) RC(0,4) RC(1,4) RC(0,5) RC(1,5) RC(0,6) RC(1,6) RC(4,6) RC(8,1) RC(2,0) RC(3,0) RC(2,1) RC(3,1) RC(2,2) RC(3,2) RC(2,3) RC(3,3) RC(2,4) RC(3,4) RC(2,5) RC(3,5) RC(2,6) RC(3,6) RC(5,6) - RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) + RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) RC(6,0) RC(7,0) RC(6,1) RC(7,1) RC(6,2) RC(7,2) RC(6,3) RC(7,3) RC(6,4) RC(7,4) RC(6,5) RC(7,5) RC(8,6) RC(9,6) RC(8,0) RC(9,1) RC(8,2) RC(9,2) RC(8,3) RC(9,3) RC(8,4) RC(9,4) RC(8,5) RC(9,5) >; diff --git a/app/boards/shields/clog/clog.dtsi b/app/boards/shields/clog/clog.dtsi index 27943100..ccad150c 100644 --- a/app/boards/shields/clog/clog.dtsi +++ b/app/boards/shields/clog/clog.dtsi @@ -27,7 +27,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; label = "KSCAN"; - + input-gpios = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> diff --git a/app/boards/shields/corne/corne.dtsi b/app/boards/shields/corne/corne.dtsi index e81afcf8..a9c1c287 100644 --- a/app/boards/shields/corne/corne.dtsi +++ b/app/boards/shields/corne/corne.dtsi @@ -56,7 +56,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index d250cb01..74ecc407 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -15,9 +15,9 @@ default { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Q | W | E | R | T | | Y | U | I | O | P | -// A | S | D | F | G | | H | J | K | L | ; | -// Lsft/Z| X | C | V | B | | N | M | , | . |Rsft//| +// Q | W | E | R | T | | Y | U | I | O | P | +// A | S | D | F | G | | H | J | K | L | ; | +// Lsft/Z| X | C | V | B | | N | M | , | . |Rsft//| // | LCTL | Bspc/LMOD | SPC | | Del/Num | Ent | Sym | bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P @@ -28,7 +28,7 @@ }; numbers { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | +// 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | // TAB | BT_PRV | BT_NXT | VOL-| VOL+| | < | v | ∧ | > | ' | // Lsft| BT_SEL0| BT_CLR | MUTE| | | HOME| END | PGUP| PGDN| Rsft| // | LCTL | LMOD| LALT | | Num | | BL-reset | @@ -41,8 +41,8 @@ }; symbols { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - | -// CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ | +// ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - | +// CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ | // LSFT| F9 | F10 | F11 | F12 | | | | | | RSFT | // | LCTL | LMOD| LALT | | RESET | | SYM | bindings = < diff --git a/app/boards/shields/eek/eek.overlay b/app/boards/shields/eek/eek.overlay index 3f830f07..f53c6b5b 100644 --- a/app/boards/shields/eek/eek.overlay +++ b/app/boards/shields/eek/eek.overlay @@ -20,7 +20,7 @@ RC(0,9) RC(0,8) RC(0,7) RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(1,9) RC(1,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(2,9) RC(2,8) RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) - RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) + RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) >; }; diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index e507f2c6..55ee6c87 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_ELEPHANT42_LEFT || SHIELD_ELEPHANT42_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/elephant42/elephant42.dtsi b/app/boards/shields/elephant42/elephant42.dtsi index e2b708ca..2d3f5166 100644 --- a/app/boards/shields/elephant42/elephant42.dtsi +++ b/app/boards/shields/elephant42/elephant42.dtsi @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include / { @@ -36,7 +36,7 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - }; + }; }; &pro_micro_i2c { diff --git a/app/boards/shields/elephant42/elephant42.keymap b/app/boards/shields/elephant42/elephant42.keymap index 8594c117..62484728 100644 --- a/app/boards/shields/elephant42/elephant42.keymap +++ b/app/boards/shields/elephant42/elephant42.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include @@ -19,7 +19,7 @@ default_layer { bindings = < - < ADJT ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL + < ADJT ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL &mt LCTRL TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp LSHFT &mo LOWR &kp LGUI &kp BSPC &kp SPACE &kp ENTER &mo RAIS &kp LALT diff --git a/app/boards/shields/elephant42/elephant42_left.overlay b/app/boards/shields/elephant42/elephant42_left.overlay index 72fe2251..10473438 100644 --- a/app/boards/shields/elephant42/elephant42_left.overlay +++ b/app/boards/shields/elephant42/elephant42_left.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "elephant42.dtsi" &kscan0 { diff --git a/app/boards/shields/elephant42/elephant42_right.overlay b/app/boards/shields/elephant42/elephant42_right.overlay index 35bd5895..c8f69a04 100644 --- a/app/boards/shields/elephant42/elephant42_right.overlay +++ b/app/boards/shields/elephant42/elephant42_right.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "elephant42.dtsi" &default_transform { diff --git a/app/boards/shields/helix/helix.dtsi b/app/boards/shields/helix/helix.dtsi index 45457560..bbaec636 100644 --- a/app/boards/shields/helix/helix.dtsi +++ b/app/boards/shields/helix/helix.dtsi @@ -42,6 +42,6 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9 , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; \ No newline at end of file diff --git a/app/boards/shields/helix/helix.keymap b/app/boards/shields/helix/helix.keymap index 82327c32..80678fe6 100644 --- a/app/boards/shields/helix/helix.keymap +++ b/app/boards/shields/helix/helix.keymap @@ -23,7 +23,7 @@ As such, those are in use within the default layer at this time.*/ / { keymap { compatible = "zmk,keymap"; - + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | @@ -78,7 +78,7 @@ As such, those are in use within the default layer at this time.*/ // | | | | | | | | | | | | | | | | bindings = < &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &ext_power EP_TOG - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &rgb_ug RGB_EFF &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_SPI &rgb_ug RGB_BRI &rgb_ug RGB_TOG + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &rgb_ug RGB_EFF &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_SPI &rgb_ug RGB_BRI &rgb_ug RGB_TOG &bt BT_NXT &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &trans &rgb_ug RGB_EFR &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_SPD &rgb_ug RGB_BRD &trans &bt BT_PRV &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/helix/helix_left.overlay b/app/boards/shields/helix/helix_left.overlay index 5b0c7623..2a7ac805 100644 --- a/app/boards/shields/helix/helix_left.overlay +++ b/app/boards/shields/helix/helix_left.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "helix.dtsi" &kscan0 { diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 4af9cbdf..0c48c128 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -49,7 +49,7 @@ , <&xiao_d 5 GPIO_ACTIVE_HIGH> ; }; - + }; &xiao_spi { status = "disabled"; }; diff --git a/app/boards/shields/iris/Kconfig.defconfig b/app/boards/shields/iris/Kconfig.defconfig index 972884db..83331d10 100644 --- a/app/boards/shields/iris/Kconfig.defconfig +++ b/app/boards/shields/iris/Kconfig.defconfig @@ -15,5 +15,5 @@ if SHIELD_IRIS_LEFT || SHIELD_IRIS_RIGHT config ZMK_SPLIT default y - + endif \ No newline at end of file diff --git a/app/boards/shields/iris/iris.dtsi b/app/boards/shields/iris/iris.dtsi index 24099f61..0e976f86 100644 --- a/app/boards/shields/iris/iris.dtsi +++ b/app/boards/shields/iris/iris.dtsi @@ -42,6 +42,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; \ No newline at end of file diff --git a/app/boards/shields/jian/jian.dtsi b/app/boards/shields/jian/jian.dtsi index 34c0298e..2b1eb391 100644 --- a/app/boards/shields/jian/jian.dtsi +++ b/app/boards/shields/jian/jian.dtsi @@ -71,6 +71,6 @@ , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/jiran/jiran.dtsi b/app/boards/shields/jiran/jiran.dtsi index 5dfaa46b..f0727dd4 100644 --- a/app/boards/shields/jiran/jiran.dtsi +++ b/app/boards/shields/jiran/jiran.dtsi @@ -77,6 +77,6 @@ , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 4664debf..775bb56a 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_JORNE_LEFT || SHIELD_JORNE_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/jorne/jorne.dtsi b/app/boards/shields/jorne/jorne.dtsi index 6f43393d..bb862b8d 100644 --- a/app/boards/shields/jorne/jorne.dtsi +++ b/app/boards/shields/jorne/jorne.dtsi @@ -72,7 +72,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 53b441cb..82f48b4c 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_KYRIA config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index c52ab05a..1e61cc6b 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -17,7 +17,7 @@ compatible = "zmk,kscan-gpio-matrix"; label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; }; left_encoder: encoder_left { diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index 36306757..d5bfab3d 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT diff --git a/app/boards/shields/leeloo/README.md b/app/boards/shields/leeloo/README.md index 35e04994..a807843f 100644 --- a/app/boards/shields/leeloo/README.md +++ b/app/boards/shields/leeloo/README.md @@ -6,20 +6,22 @@ Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca) GitHub: [ClicketySplit](https://github.com/ClicketySplit) Hardware Supported: Pro Micro, Elite-C, nice!nano v2 -Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation. +Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation. Leeloo has been designed from scratch; everything from the schematic to its PCB footprints, and column stagger. There are some subtle differences that may not be apparent; however, its subtle changes enable an interesting future. Features: -* 4x6x5m Split Keyboard -* Support for MX/Box or Low Profile Choc switches. -* 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering. -* Support for 128x32 OLED Displays. -* The option to select one of three positions for an EC11 rotary encoder on each half. -* Support for Alps Alpine Micro Switch -* Support for 3.7v 301230 LiPo Battery + +- 4x6x5m Split Keyboard +- Support for MX/Box or Low Profile Choc switches. +- 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering. +- Support for 128x32 OLED Displays. +- The option to select one of three positions for an EC11 rotary encoder on each half. +- Support for Alps Alpine Micro Switch +- Support for 3.7v 301230 LiPo Battery # Building Your Firmware + ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/) Installation: [Installing ZMK](https://zmk.dev/docs/user-setup) Customization: [Customizing ZMK](https://zmk.dev/docs/customization) @@ -36,6 +38,7 @@ Build command for your custom keymap of Leeloo: west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" # Support + If you have any questions with regards to Leeloo, please [Contact Us](https://clicketysplit.ca/pages/contact-us). Clickety Split diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 4efa1069..1a296a8c 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -43,7 +43,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; left_encoder: encoder_left { diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index 56eef359..b6bb37d8 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_LOTUS58_LEFT || SHIELD_LOTUS58_RIGHT diff --git a/app/boards/shields/lotus58/lotus58.dtsi b/app/boards/shields/lotus58/lotus58.dtsi index 1df0bf38..e24d75e7 100644 --- a/app/boards/shields/lotus58/lotus58.dtsi +++ b/app/boards/shields/lotus58/lotus58.dtsi @@ -27,7 +27,7 @@ RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7 RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(4,0) RC(4,11) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) + RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) >; }; diff --git a/app/boards/shields/lotus58/lotus58.keymap b/app/boards/shields/lotus58/lotus58.keymap index 50249146..fae463c9 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -17,7 +17,7 @@ key-positions = <24 52>; layers = <0>; bindings = <&kp LGUI>; - }; + }; }; behaviors { @@ -59,7 +59,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp LSHFT &kp A &sleft &kp D &fright &kp G &sys_reset &sys_reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp C_MUTE &kp C_PP &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RCTRL BSLH - < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI + < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI >; sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP &inc_dec_kp PG_UP PG_DN>; @@ -71,7 +71,7 @@ // | | ! | HOME| ^ | END | % | | VOL^ | PGUP | INS | ^ | PSCR | - | // | | # | <- | v | -> | $ | | | | VOLv | <- | ^ | -> | ~ | _ | // | | @ | - | ( | ) | & | | | | MUTE | PGDN | v | : | * | | | -// | F11 | | | | | | | | F12 | +// | F11 | | | | | | | | F12 | bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp PLUS &trans &kp EXCL &kp HOME &kp UP &kp END &kp PRCNT &kp C_VOL_UP &kp PG_UP &kp INS &kp CARET &kp PSCRN &kp MINUS @@ -89,13 +89,13 @@ // | | INS | PSCR | GUI | RESET | | | PGUP | | ^ | | | | // | | ALT | CTRL | SHIFT | FLASH | CAPS | | | | PGDN | <- | v | -> | DEL | BSPC | // | | UNDO | CUT | COPY | PASTE | | | | | | |> | <|<| | |>|> | | | -// | | | | | | | | | | +// | | | | | | | | | | bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &sys_reset &bootloader &trans &kp INS &kp PSCRN &kp K_CMENU &sys_reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans &trans &kp LALT &kp LCTRL &kp LSHFT &bootloader &kp CLCK &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC &trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &kp C_PP &kp C_PREV &kp C_NEXT &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP &inc_dec_kp PG_UP PG_DN>; diff --git a/app/boards/shields/lotus58/lotus58_left.overlay b/app/boards/shields/lotus58/lotus58_left.overlay index 9755ae0b..a51659df 100644 --- a/app/boards/shields/lotus58/lotus58_left.overlay +++ b/app/boards/shields/lotus58/lotus58_left.overlay @@ -8,7 +8,7 @@ &kscan0 { col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> + = <&pro_micro 15 GPIO_ACTIVE_HIGH> , <&pro_micro 16 GPIO_ACTIVE_HIGH> , <&pro_micro 14 GPIO_ACTIVE_HIGH> , <&pro_micro 10 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 28f8c811..8c0b042e 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index b8d47b2a..e3fabb3e 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -40,7 +40,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/murphpad/murphpad.keymap b/app/boards/shields/murphpad/murphpad.keymap index 2e8c6f6e..ccdff9f7 100644 --- a/app/boards/shields/murphpad/murphpad.keymap +++ b/app/boards/shields/murphpad/murphpad.keymap @@ -44,7 +44,7 @@ bindings = <&bt BT_NXT>; }; }; - + sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder_1 &encoder_2>; @@ -57,29 +57,29 @@ default_layer { label = "default layer"; bindings = < - &bt BT_CLR &kp TAB &kp F5 &kp LC(LA(C)) &kp LG(D) - &rgb_ug RGB_TOG &kp ESC &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS - &rgb_ug RGB_EFF &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS + &bt BT_CLR &kp TAB &kp F5 &kp LC(LA(C)) &kp LG(D) + &rgb_ug RGB_TOG &kp ESC &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS + &rgb_ug RGB_EFF &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS &kp C_MUTE &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans &mo 1 &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER &kp BSPC &kp KP_N0 &trans &kp KP_DOT &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - + }; + fn_layer { label = "fn layer"; bindings = < - &trans &trans &trans &trans &trans - &trans &kp KP_NUM &trans &trans &trans - &trans &trans &trans &trans &trans - &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp DEL &trans &trans &trans &trans - >; + &trans &kp KP_NUM &trans &trans &trans + &trans &trans &trans &trans &trans + &bt BT_CLR &trans &trans &trans &trans + &trans &trans &trans &trans &trans + &kp DEL &trans &trans &trans &trans + >; sensor-bindings = <&inc_dec_kp PG_UP PG_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; - + }; }; }; \ No newline at end of file diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index c66f2aef..b7fead60 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -42,7 +42,7 @@ resolution = <4>; status = "disabled"; }; - + encoder_2: encoder_2 { compatible = "alps,ec11"; label = "Encoder 2"; diff --git a/app/boards/shields/naked60/naked60.keymap b/app/boards/shields/naked60/naked60.keymap index d380a599..1c212cd4 100644 --- a/app/boards/shields/naked60/naked60.keymap +++ b/app/boards/shields/naked60/naked60.keymap @@ -28,7 +28,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LSHFT &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RET - &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; }; @@ -44,7 +44,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(NON_US_HASH) &kp LS(NON_US_BSLH) &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE >; }; diff --git a/app/boards/shields/nibble/nibble.keymap b/app/boards/shields/nibble/nibble.keymap index 23c796ea..c02aad75 100644 --- a/app/boards/shields/nibble/nibble.keymap +++ b/app/boards/shields/nibble/nibble.keymap @@ -32,7 +32,7 @@ }; function_layer { label = "Function"; - + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; bindings = < diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index 13f2c2fe..baf1eb10 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -51,7 +51,7 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) RC(3,0) RC(3,1) RC(0,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) RC(3,15) -RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) +RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) >; }; }; diff --git a/app/boards/shields/nice_view/README.md b/app/boards/shields/nice_view/README.md index 0b4ac21f..e3dffa34 100644 --- a/app/boards/shields/nice_view/README.md +++ b/app/boards/shields/nice_view/README.md @@ -2,4 +2,4 @@ The nice!view is a low power, high refresh rate display meant to replace I2C OLEDs traditionally used. -This shield requires that an `&nice_view_spi` labelled SPI bus is provided with *at least* MOSI, SCK, and CS pins defined. +This shield requires that an `&nice_view_spi` labelled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined. diff --git a/app/boards/shields/nice_view_adapter/README.md b/app/boards/shields/nice_view_adapter/README.md index ec4665a3..fe0a6f07 100644 --- a/app/boards/shields/nice_view_adapter/README.md +++ b/app/boards/shields/nice_view_adapter/README.md @@ -2,7 +2,7 @@ This shield is used as an adapter between the nice!view and existing shields/boards that expose an I2C OLED header. -To use this shield, you should add this shield to your list of shields *before* `nice_view`. +To use this shield, you should add this shield to your list of shields _before_ `nice_view`. The nice!view will use the SDA/SCL pins of the OLED, and then the adapter expects a final pin to be "bodged" from your microcontroller to the nice!view CS pin. This adapter assumes that the CS pin bodged is the `&pro_micro 1` pin or "D1", which is the top left pin when looking at the front of the board. If you can't use this pin, you'll need to override the `cs-gpios` for the `&nice_view_spi` bus (in your `zmk-config` keymap for example) or you will want to define your own `&nice_view_spi` bus without using this adapter. diff --git a/app/boards/shields/pancake/pancake.keymap b/app/boards/shields/pancake/pancake.keymap index 99f2aaff..e5ca4372 100644 --- a/app/boards/shields/pancake/pancake.keymap +++ b/app/boards/shields/pancake/pancake.keymap @@ -20,7 +20,7 @@ default_layer { bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT &kp SEMI &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp UP &kp ENTER &kp LCTRL &kp LALT &kp LGUI &mo FNC &mo LWR &kp SPACE &kp SPACE &mo RSE &kp SLASH &kp LEFT &kp DOWN &kp RIGHT @@ -32,7 +32,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp BSPC &trans &trans &trans &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &kp C_VOL_UP &trans - &trans &trans &trans &trans &trans &trans &trans &trans &kp QMARK &trans &kp C_VOL_DN &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp QMARK &trans &kp C_VOL_DN &trans >; }; @@ -41,8 +41,8 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &trans &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans &kp LBKT &kp RBKT &kp C_VOL_UP &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_DN &trans - >; + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_DN &trans + >; }; function_layer { @@ -50,8 +50,8 @@ &bootloader &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp F11 &kp F12 &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans - &out OUT_BLE &out OUT_USB &out OUT_TOG &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; + &out OUT_BLE &out OUT_USB &out OUT_TOG &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; }; }; }; diff --git a/app/boards/shields/pancake/pancake.overlay b/app/boards/shields/pancake/pancake.overlay index 53e8c8c1..6fae463f 100644 --- a/app/boards/shields/pancake/pancake.overlay +++ b/app/boards/shields/pancake/pancake.overlay @@ -14,7 +14,7 @@ label = "KSCAN"; diode-direction = "col2row"; - col-gpios + col-gpios = <&pro_micro 21 GPIO_ACTIVE_HIGH> , <&pro_micro 20 GPIO_ACTIVE_HIGH> , <&pro_micro 19 GPIO_ACTIVE_HIGH> @@ -28,7 +28,7 @@ , <&pro_micro 3 GPIO_ACTIVE_HIGH> , <&pro_micro 2 GPIO_ACTIVE_HIGH> ; - + row-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> diff --git a/app/boards/shields/qaz/qaz.overlay b/app/boards/shields/qaz/qaz.overlay index 098c9f02..76ee5ba7 100644 --- a/app/boards/shields/qaz/qaz.overlay +++ b/app/boards/shields/qaz/qaz.overlay @@ -49,5 +49,5 @@ , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; }; - + }; \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.defconfig b/app/boards/shields/quefrency/Kconfig.defconfig index 9e51c2bc..28e46a56 100644 --- a/app/boards/shields/quefrency/Kconfig.defconfig +++ b/app/boards/shields/quefrency/Kconfig.defconfig @@ -1,7 +1,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT - - + + if SHIELD_QUEFRENCY_LEFT config ZMK_KEYBOARD_NAME diff --git a/app/boards/shields/quefrency/quefrency.dtsi b/app/boards/shields/quefrency/quefrency.dtsi index 411d3658..c9cb7d43 100644 --- a/app/boards/shields/quefrency/quefrency.dtsi +++ b/app/boards/shields/quefrency/quefrency.dtsi @@ -13,7 +13,7 @@ zmk,matrix_transform = &default_transform; }; - /* + /* * This transform correspondsto the 60% left without macro keypad and 65% right, even this * combination of PCBs can have keys in different locations based on configuration. */ @@ -22,11 +22,11 @@ columns = <15>; rows = <6>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(5,14) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) -RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) -RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) +RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) +RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) >; }; }; diff --git a/app/boards/shields/quefrency/quefrency_right.overlay b/app/boards/shields/quefrency/quefrency_right.overlay index 8e42d555..bf97d34b 100644 --- a/app/boards/shields/quefrency/quefrency_right.overlay +++ b/app/boards/shields/quefrency/quefrency_right.overlay @@ -12,7 +12,7 @@ / { - /* This kscan is for the 65% right half the 60% right half + /* This kscan is for the 65% right half the 60% right half * may require different column and row pins */ kscan0: kscan { diff --git a/app/boards/shields/redox/redox.dtsi b/app/boards/shields/redox/redox.dtsi index 4825a39f..9c0705a6 100644 --- a/app/boards/shields/redox/redox.dtsi +++ b/app/boards/shields/redox/redox.dtsi @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include / { @@ -42,7 +42,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/redox/redox.keymap b/app/boards/shields/redox/redox.keymap index a45595ff..c88f703b 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -30,7 +30,7 @@ >; }; - + lower_layer { // -------------------------------------------------------------------------------------------------------------------------- // | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | DEL | @@ -62,7 +62,7 @@ &trans &trans &trans &mo 3 &trans &mo 3 &trans &trans &trans &trans &trans &trans &trans &trans >; }; - + adjust_layer { // ----------------------------------------------------------------------------------------- // | F1 | F2 | F3 | F4 | F5 | F6 | --- | F7 | F8 | F9 | F10 | F11 | F12 | diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index fa02421a..c4a67e65 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_SNAP_LEFT || SHIELD_SNAP_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi index 0b7f32e5..77070db9 100644 --- a/app/boards/shields/snap/snap.dtsi +++ b/app/boards/shields/snap/snap.dtsi @@ -38,7 +38,7 @@ // R3C07L | R3C06L | R3C05L | R3C04L | R3C03L | R3C02L | R3C00L | | R3C15R | R3C14R | R3C13R | R3C12R | R3C11R | R3C10R | R3C09R | R4C08R | // R4C07L | R4C06L | R4C05L | R4C04L | R4C03L | R4C02L | R4C01L | R4C00L | | R4C15R | R4C14R | R4C13R | R4C12R | R4C11R | R4C10R | R4C09R | R5C08R | // R5C07L | R5C06L | R5C05L | R5C04L | R5C02L | R5C00L | | R5C15R | R5C14R | R5C13R | R5C12R | R5C11R | R5C10R | R5C09R | - + map = < RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,15) RC(1,14) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,16) diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap index db44eb69..cc4c5255 100644 --- a/app/boards/shields/snap/snap.keymap +++ b/app/boards/shields/snap/snap.keymap @@ -37,7 +37,7 @@ bindings = < &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_PP -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_BRI &rgb_ug RGB_EFF &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_HUI diff --git a/app/boards/shields/snap/snap_left.overlay b/app/boards/shields/snap/snap_left.overlay index 90fd66d1..b5b8a841 100644 --- a/app/boards/shields/snap/snap_left.overlay +++ b/app/boards/shields/snap/snap_left.overlay @@ -24,7 +24,7 @@ &left_encoder { a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; status = "okay"; }; diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay index 4243f518..dc71a5cf 100644 --- a/app/boards/shields/snap/snap_right.overlay +++ b/app/boards/shields/snap/snap_right.overlay @@ -46,6 +46,6 @@ kscan_direct: kscan_direct { &right_encoder { a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; status = "okay"; }; diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 1c1c5604..afa710ff 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_SOFLE_LEFT || SHIELD_SOFLE_RIGHT diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 29de8d7e..03078cd6 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay index 864321cc..82234278 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -24,7 +24,7 @@ , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> ; - col-gpios + col-gpios = <&pro_micro 16 GPIO_ACTIVE_HIGH> , <&pro_micro 10 GPIO_ACTIVE_HIGH> , <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index 34330400..c1d34ffd 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -24,7 +24,7 @@ , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> ; - col-gpios + col-gpios = <&pro_micro 9 GPIO_ACTIVE_HIGH> , <&pro_micro 8 GPIO_ACTIVE_HIGH> , <&pro_micro 7 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 3c8d5f58..221bf90a 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay index 1fa61286..10a195ff 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -25,7 +25,7 @@ , <&pro_micro 8 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay index 7f281db9..eaebff36 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -25,7 +25,7 @@ , <&pro_micro 10 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index 4a2b8973..ac07c935 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 136e6927..385d2022 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -14,7 +14,7 @@ // tapping_term_ms = <200>; }; -/ { +/ { combos { compatible = "zmk,combos"; @@ -23,80 +23,80 @@ key-positions = <0 1>; bindings = <&kp ESC>; }; - + combo_tab { timeout-ms = <50>; key-positions = <10 11>; bindings = <&kp TAB>; }; - + combo_ralt { timeout-ms = <50>; key-positions = <17 16>; bindings = <&kp RALT>; }; - + combo_lalt { timeout-ms = <50>; key-positions = <11 12>; bindings = <&kp LALT>; }; - + combo_lgui { timeout-ms = <50>; key-positions = <12 13>; bindings = <&kp LGUI>; }; - - + + combo_rgui { timeout-ms = <50>; key-positions = <17 18>; bindings = <&kp RGUI>; }; - - + + }; keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET - &mo 1 &kp LCTL &kp SPC &mo 2 + &mo 1 &kp LCTL &kp SPC &mo 2 >; }; left_layer { bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL - &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL - &mo 1 &kp LGUI &kp RGUI &mo 2 + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL + &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL + &mo 1 &kp LGUI &kp RGUI &mo 2 >; }; - + right_layer { bindings = < - &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTL &kp SPC &mo 2 + &mo 3 &kp LCTL &kp SPC &mo 2 >; - }; - + }; + tri_layer { bindings = < &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans - &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans - &trans &trans &trans &trans + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans + &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans + &trans &trans &trans &trans >; - }; - + }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay index 3dc954c3..1ff5ed5e 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -24,7 +24,7 @@ , <&pro_micro 15 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay index 3811423e..81ddca40 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -24,7 +24,7 @@ , <&pro_micro 14 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitreus62/Kconfig.defconfig b/app/boards/shields/splitreus62/Kconfig.defconfig index 88a53a2f..14063d3e 100644 --- a/app/boards/shields/splitreus62/Kconfig.defconfig +++ b/app/boards/shields/splitreus62/Kconfig.defconfig @@ -1,8 +1,8 @@ # Copyright (c) 2020 Derek Schmell # SPDX-License-Identifier: MIT - - + + if SHIELD_SPLITREUS62_LEFT config ZMK_KEYBOARD_NAME @@ -17,5 +17,5 @@ if SHIELD_SPLITREUS62_LEFT || SHIELD_SPLITREUS62_RIGHT config ZMK_SPLIT default y - + endif diff --git a/app/boards/shields/splitreus62/splitreus62.dtsi b/app/boards/shields/splitreus62/splitreus62.dtsi index 4b55bb8d..905605e9 100644 --- a/app/boards/shields/splitreus62/splitreus62.dtsi +++ b/app/boards/shields/splitreus62/splitreus62.dtsi @@ -45,6 +45,6 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) , <&pro_micro 5 GPIO_ACTIVE_HIGH> , <&pro_micro 6 GPIO_ACTIVE_HIGH> ; - + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62_right.overlay b/app/boards/shields/splitreus62/splitreus62_right.overlay index f301ab99..9f76e7eb 100644 --- a/app/boards/shields/splitreus62/splitreus62_right.overlay +++ b/app/boards/shields/splitreus62/splitreus62_right.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "splitreus62.dtsi" &default_transform { diff --git a/app/boards/shields/tg4x/README.md b/app/boards/shields/tg4x/README.md index 087ce251..12709fde 100644 --- a/app/boards/shields/tg4x/README.md +++ b/app/boards/shields/tg4x/README.md @@ -6,6 +6,6 @@ Standard setup for the [TG4x](https://github.com/MythosMann/tg4x/) 40% keyboard. This TG4x implementation is for... -* rev 2.1 of the board -* Split spacebar with 2.25U on the left and 2.75U on the right -* 2U right shift +- rev 2.1 of the board +- Split spacebar with 2.25U on the left and 2.75U on the right +- 2U right shift diff --git a/app/boards/shields/tg4x/tg4x.overlay b/app/boards/shields/tg4x/tg4x.overlay index 0df94a2b..ca6e23c3 100644 --- a/app/boards/shields/tg4x/tg4x.overlay +++ b/app/boards/shields/tg4x/tg4x.overlay @@ -10,7 +10,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; label = "KSCAN"; - + diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index e8cb3789..11424dc8 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -21,7 +21,7 @@ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 8414a012..5710aeaf 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -22,7 +22,7 @@ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &tog 1 &kp KP_NUMLOCK &kp KP_SLASH diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.keymap b/app/boards/shields/two_percent_milk/two_percent_milk.keymap index 04dc4c0d..132793b3 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.keymap +++ b/app/boards/shields/two_percent_milk/two_percent_milk.keymap @@ -7,11 +7,11 @@ #include #include #include - + / { keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp X diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 70029f0b..5a77ca11 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_WATERFOWL_LEFT || SHIELD_WATERFOWL_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi index c21dcf07..a156360e 100644 --- a/app/boards/shields/waterfowl/waterfowl.dtsi +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -40,7 +40,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; left_encoder: encoder_left { //roller diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index d208fe49..9583499c 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -22,8 +22,8 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | Z | X | C | V | B | | 2 | | 3 | | N | M | , | . | / | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. - * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ bindings = < @@ -46,7 +46,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | | | INS | | | | 2 | | 3 | | 0 | 1 | 2 | 3 | * | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | MO(3)| | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -70,7 +70,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | $ | | { | } | & | | 2 | | 3 | | | | | | | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -94,7 +94,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | | | | | | | 2 | | 3 | | F10 | F1 | F2 | F3 | F13 | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -106,7 +106,7 @@ >; sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + }; }; }; \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/zmk_uno.keymap b/app/boards/shields/zmk_uno/zmk_uno.keymap index 7ab2632a..0e0fc795 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.keymap +++ b/app/boards/shields/zmk_uno/zmk_uno.keymap @@ -29,8 +29,8 @@ }; REMOVE ME: */ - - + + / { macros { ZMK_MACRO(ble_zero, @@ -47,7 +47,7 @@ REMOVE ME: */ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp A &bl BL_TOG @@ -55,7 +55,7 @@ REMOVE ME: */ &out OUT_USB &ble_zero &ble_one >; - + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; }; diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index 77648afd..c6024694 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_ZODIARK_LEFT || SHIELD_ZODIARK_RIGHT diff --git a/app/boards/shields/zodiark/zodiark.keymap b/app/boards/shields/zodiark/zodiark.keymap index 0211f818..82639edc 100644 --- a/app/boards/shields/zodiark/zodiark.keymap +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -39,7 +39,7 @@ // | | 0 | . | Enter| | | | | | | | 0 | . | Enter | | bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 -&kp KP_NUM &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp PSCRN &kp SLCK &trans &trans &kp PAUSE_BREAK &trans &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp F12 +&kp KP_NUM &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp PSCRN &kp SLCK &trans &trans &kp PAUSE_BREAK &trans &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp F12 &trans &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp INS &kp HOME &trans &trans &kp PG_UP &trans &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans &trans &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp DEL &kp END &trans &trans &trans &trans &kp PG_DN &trans &kp KP_N1 &kp KP_N2 &kp KP_N3 &trans &trans &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans &trans &trans &trans &trans &trans &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans diff --git a/app/core-coverage.yml b/app/core-coverage.yml index 12c03613..4a60aad9 100644 --- a/app/core-coverage.yml +++ b/app/core-coverage.yml @@ -1,35 +1,35 @@ board: -- nice_nano_v2 -- nrfmicro_13 -- proton_c + - nice_nano_v2 + - nrfmicro_13 + - proton_c shield: -- corne_left -- corne_right -- romac -- settings_reset -- tidbit + - corne_left + - corne_right + - romac + - settings_reset + - tidbit include: -- board: bdn9_rev2 -- board: nice60 -- board: seeeduino_xiao_ble - shield: hummingbird -- board: nrf52840_m2 - shield: m60 -- board: planck_rev6 -- board: proton_c - shield: clueboard_california -- board: nice_nano_v2 - shield: kyria_left - cmake-args: "-DCONFIG_ZMK_DISPLAY=y" - nickname: "display" -- board: nice_nano_v2 - shield: kyria_right - cmake-args: "-DCONFIG_ZMK_DISPLAY=y" - nickname: "display" -- board: nice_nano - shield: romac_plus - cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" - nickname: "underglow" -- board: nice_nano_v2 - shield: lily58_left nice_view_adapter nice_view - nickname: "niceview" + - board: bdn9_rev2 + - board: nice60 + - board: seeeduino_xiao_ble + shield: hummingbird + - board: nrf52840_m2 + shield: m60 + - board: planck_rev6 + - board: proton_c + shield: clueboard_california + - board: nice_nano_v2 + shield: kyria_left + cmake-args: "-DCONFIG_ZMK_DISPLAY=y" + nickname: "display" + - board: nice_nano_v2 + shield: kyria_right + cmake-args: "-DCONFIG_ZMK_DISPLAY=y" + nickname: "display" + - board: nice_nano + shield: romac_plus + cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" + nickname: "underglow" + - board: nice_nano_v2 + shield: lily58_left nice_view_adapter nice_view + nickname: "niceview" diff --git a/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml b/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml index 2db84bcd..94952813 100644 --- a/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml +++ b/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml @@ -5,24 +5,24 @@ # description: > - This is a representation of the Maxim MAX7318 I2C Gpio Expander. + This is a representation of the Maxim MAX7318 I2C Gpio Expander. compatible: "maxim,max7318" include: [gpio-controller.yaml, i2c-device.yaml] properties: - label: - required: true + label: + required: true - "#gpio-cells": - const: 2 + "#gpio-cells": + const: 2 - ngpios: - type: int - required: true - const: 16 - description: Number of gpios supported + ngpios: + type: int + required: true + const: 16 + description: Number of gpios supported gpio-cells: - pin diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml index 00947685..e6f6757d 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml @@ -16,4 +16,4 @@ properties: description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. tap-ms: type: int - description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding \ No newline at end of file + description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding diff --git a/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml b/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml index 8f01effc..82e1517d 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml @@ -13,4 +13,4 @@ properties: required: true tapping-term-ms: type: int - default: 200 \ No newline at end of file + default: 200 diff --git a/app/dts/bindings/display/gooddisplay,il0323.yaml b/app/dts/bindings/display/gooddisplay,il0323.yaml index d4a9ac7d..46fc7326 100644 --- a/app/dts/bindings/display/gooddisplay,il0323.yaml +++ b/app/dts/bindings/display/gooddisplay,il0323.yaml @@ -8,54 +8,54 @@ compatible: "gooddisplay,il0323" include: spi-device.yaml properties: - height: - type: int - required: true - description: Height in pixel of the panel driven by the controller + height: + type: int + required: true + description: Height in pixel of the panel driven by the controller - width: - type: int - required: true - description: Width in pixel of the panel driven by the controller + width: + type: int + required: true + description: Width in pixel of the panel driven by the controller - reset-gpios: - type: phandle-array - required: true - description: RESET pin. + reset-gpios: + type: phandle-array + required: true + description: RESET pin. - The RESET pin of GD7965 is active low. - If connected directly the MCU pin should be configured - as active low. + The RESET pin of GD7965 is active low. + If connected directly the MCU pin should be configured + as active low. - dc-gpios: - type: phandle-array - required: true - description: DC pin. + dc-gpios: + type: phandle-array + required: true + description: DC pin. - The DC pin of GD7965 is active low (transmission command byte). - If connected directly the MCU pin should be configured - as active low. + The DC pin of GD7965 is active low (transmission command byte). + If connected directly the MCU pin should be configured + as active low. - busy-gpios: - type: phandle-array - required: true - description: BUSY pin. + busy-gpios: + type: phandle-array + required: true + description: BUSY pin. - The BUSY pin of GD7965 is active low. - If connected directly the MCU pin should be configured - as active low. + The BUSY pin of GD7965 is active low. + If connected directly the MCU pin should be configured + as active low. - pwr: - type: uint8-array - required: true - description: Power Setting (PWR) values + pwr: + type: uint8-array + required: true + description: Power Setting (PWR) values - cdi: - type: int - required: true - description: VCOM and data interval value + cdi: + type: int + required: true + description: VCOM and data interval value - tcon: - type: int - required: true - description: TCON setting value \ No newline at end of file + tcon: + type: int + required: true + description: TCON setting value diff --git a/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml b/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml index 64b3939b..57603f3a 100644 --- a/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml @@ -5,4 +5,4 @@ description: Set Macro To Press Mode compatible: "zmk,macro-control-mode-press" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml b/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml index c1c27882..cd4ee2b6 100644 --- a/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml @@ -5,4 +5,4 @@ description: Set Macro To Release Mode compatible: "zmk,macro-control-mode-release" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml b/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml index 8dacdc2a..f3bfcd5f 100644 --- a/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml @@ -5,4 +5,4 @@ description: Set Macro Tap Duration compatible: "zmk,macro-control-tap-time" -include: one_param.yaml \ No newline at end of file +include: one_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml b/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml index 9e9beac2..45da69fa 100644 --- a/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml @@ -5,4 +5,4 @@ description: Set Macro Wait Duration compatible: "zmk,macro-control-wait-time" -include: one_param.yaml \ No newline at end of file +include: one_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml b/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml index e89d8b24..929e2a29 100644 --- a/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml +++ b/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml @@ -5,4 +5,4 @@ description: Macro Pause Until Release Marker compatible: "zmk,macro-pause-for-release" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/zmk,combos.yaml b/app/dts/bindings/zmk,combos.yaml index 1a914a7f..d094b5c4 100644 --- a/app/dts/bindings/zmk,combos.yaml +++ b/app/dts/bindings/zmk,combos.yaml @@ -22,4 +22,4 @@ child-binding: type: boolean layers: type: array - default: [-1] \ No newline at end of file + default: [-1] diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 66c1264a..3e307f85 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include __event_type_start = .; \ diff --git a/app/package.json b/app/package.json index e75d9695..9ad28788 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,6 @@ }, "homepage": "https://zmk.dev/", "devDependencies": { - "prettier": "^2.4.0" + "prettier": "^2.7.1" } -} \ No newline at end of file +} diff --git a/app/src/activity.c b/app/src/activity.c index 46af56fb..41fe2e15 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 5ef32d20..4c056cf5 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -33,7 +33,7 @@ config ZMK_WIDGET_PERIPHERAL_STATUS depends on BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL default y if BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL select LV_USE_LABEL - + config ZMK_WIDGET_WPM_STATUS bool "Widget for displaying typed words per minute" depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap index d35c7277..a02f6c64 100644 --- a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap @@ -8,7 +8,7 @@ /* This test fails if the order of event handlers for hold-taps -and combos is wrong. Hold-taps need to process key position events +and combos is wrong. Hold-taps need to process key position events first so the decision to hold or tap can be made. */ / { @@ -37,11 +37,11 @@ first so the decision to hold or tap can be made. &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap index a99c15d9..325da627 100644 --- a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap @@ -32,11 +32,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-0/native_posix_64.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap index aac330f9..33712822 100644 --- a/app/tests/combo/layer-filter-0/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-0/native_posix_64.keymap @@ -52,27 +52,27 @@ &kscan { events = < /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) /* Toggle Layer */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) /* Combo Two */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-1/native_posix_64.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap index 995f27ee..8eb5e9eb 100644 --- a/app/tests/combo/layer-filter-1/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-1/native_posix_64.keymap @@ -32,9 +32,9 @@ &kscan { events = < /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/multiple-timeouts/native_posix_64.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap index 91bf5235..87d21be1 100644 --- a/app/tests/combo/multiple-timeouts/native_posix_64.keymap +++ b/app/tests/combo/multiple-timeouts/native_posix_64.keymap @@ -34,7 +34,7 @@ events = < ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap index e3cbf437..8b7b4196 100644 --- a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 0 timeout inf combo 01 timeout inf combo 0123 timeout inf @@ -51,66 +51,66 @@ events = < /* all permutations of combo one press, combo triggered by release */ /* while debugging these, you may want to set the release_timer to a high number */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - + ZMK_MOCK_RELEASE(0,0,10) + /* all permutations of combo two press and release, combo triggered by release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap index c228c475..45737882 100644 --- a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap @@ -39,26 +39,26 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ /* all permutations of combo two press and release, combo triggered by timeout */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap index 3d364213..ba547dc2 100644 --- a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 01 timeout 100 combo 0123 timeout 100 press 012, wait until timeout runs out @@ -40,13 +40,13 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap index 0622dcd0..0da394b5 100644 --- a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 12 timeout 100 combo 0123 timeout 100 press 012, release 2 @@ -41,13 +41,13 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap index 4e68105f..f9537344 100644 --- a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap +++ b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap @@ -10,7 +10,7 @@ key-positions = <0 1>; bindings = <&kp X>; }; - + combo_two { timeout-ms = <30>; key-positions = <0 2>; @@ -40,44 +40,44 @@ &kscan { events = < /* all permutations of combo one press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* all permutations of combo two press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap index 68736d8f..c6202365 100644 --- a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap @@ -3,7 +3,7 @@ #include / { - combos { + combos { compatible = "zmk,combos"; combo_one { timeout-ms = <80>; @@ -27,9 +27,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,100) ZMK_MOCK_RELEASE(1,1,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/press-release/native_posix_64.keymap b/app/tests/combo/press-release/native_posix_64.keymap index 0f45792d..8d81f35b 100644 --- a/app/tests/combo/press-release/native_posix_64.keymap +++ b/app/tests/combo/press-release/native_posix_64.keymap @@ -3,7 +3,7 @@ #include / { - combos { + combos { compatible = "zmk,combos"; combo_one { timeout-ms = <30>; @@ -28,24 +28,24 @@ &kscan { events = < /* all different combinations of press and release order */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press-timeout/native_posix_64.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap index ff0b7493..497cf1aa 100644 --- a/app/tests/combo/press-timeout/native_posix_64.keymap +++ b/app/tests/combo/press-timeout/native_posix_64.keymap @@ -27,9 +27,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap index 2518bbc9..cf7e79f7 100644 --- a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap @@ -33,13 +33,13 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap index 4895636e..0c55eb47 100644 --- a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap @@ -33,14 +33,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap index 0c4a698c..248d6e75 100644 --- a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap @@ -33,14 +33,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap index 3bacb886..5af94d45 100644 --- a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap @@ -28,11 +28,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap index 8ac8316b..88351bea 100644 --- a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap @@ -28,11 +28,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-press-release/native_posix_64.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap index 7ca3d77d..4b658a73 100644 --- a/app/tests/gresc/gresc-press-release/native_posix_64.keymap +++ b/app/tests/gresc/gresc-press-release/native_posix_64.keymap @@ -19,30 +19,30 @@ &kscan { events = < /* esc */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,0,10) /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap index 0c38721d..78b8ebcb 100644 --- a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap +++ b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap @@ -27,15 +27,15 @@ The first gresc that is released releases the key. &kscan { events = < /* esc */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ /* ~ */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ + ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap index 706ca540..832ea7ef 100644 --- a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap @@ -31,15 +31,15 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* retro tap */ ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* hold */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap index 2698f055..6d016501 100644 --- a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap @@ -20,7 +20,7 @@ default_layer { bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L >; }; @@ -29,13 +29,13 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,100) ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_PRESS(1,1,100) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) + ZMK_MOCK_PRESS(1,1,100) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) >; }; diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap index 314b7334..dc96ee8b 100644 --- a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap @@ -31,15 +31,15 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* retro tap */ ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* hold */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index ee0d5e80..13a58c3e 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap index adbd648e..b733e3a2 100644 --- a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* * A hold-tap with long tapping term is pressed first. * A hold-tap with short tapping term is quickly tapped. * The short tapping term hold-tap should 'tap', not 'hold'. @@ -45,9 +45,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,20) - ZMK_MOCK_PRESS(0,1,20) - ZMK_MOCK_RELEASE(0,1,200) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,20) + ZMK_MOCK_PRESS(0,1,20) + ZMK_MOCK_RELEASE(0,1,200) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/keypress/kp-press-release/native_posix_64.keymap b/app/tests/keypress/kp-press-release/native_posix_64.keymap index 0ddb7ab6..c8e744ee 100644 --- a/app/tests/keypress/kp-press-release/native_posix_64.keymap +++ b/app/tests/keypress/kp-press-release/native_posix_64.keymap @@ -2,7 +2,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap index f4379893..f4d03429 100644 --- a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap @@ -5,30 +5,30 @@ &kscan { events = < /* Toggle LALT on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Tap TAB twice */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) /* Toggle LSHFT on */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* Tap TAB once */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) /* Toggle LALT off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) /* Toggle LSHFT off */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) >; }; diff --git a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap index 3b14e416..0a4ad4ae 100644 --- a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap @@ -5,18 +5,18 @@ &kscan { events = < /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Press A */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Release A */ ZMK_MOCK_RELEASE(1,0,10) diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap index 644caa26..e25d4b18 100644 --- a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap index 644caa26..e25d4b18 100644 --- a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/macros/basic/native_posix_64.keymap b/app/tests/macros/basic/native_posix_64.keymap index 6a2391db..a2812792 100644 --- a/app/tests/macros/basic/native_posix_64.keymap +++ b/app/tests/macros/basic/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap index 2f3b943a..e6ef4f49 100644 --- a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap index c264a9ab..c5cde5b4 100644 --- a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/press-mid-macro/native_posix_64.keymap b/app/tests/macros/press-mid-macro/native_posix_64.keymap index a075a443..b8ae76f1 100644 --- a/app/tests/macros/press-mid-macro/native_posix_64.keymap +++ b/app/tests/macros/press-mid-macro/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/press-release/native_posix_64.keymap b/app/tests/macros/press-release/native_posix_64.keymap index 6814d542..25467126 100644 --- a/app/tests/macros/press-release/native_posix_64.keymap +++ b/app/tests/macros/press-release/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap index b8142425..dbb2df5c 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap index 26af5657..b01c6257 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap index 9df2c152..89930328 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap index 5f9375fb..acd55e83 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap index 1b175d44..7e1865a0 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap index 0e9a2d6a..e175d60e 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending index 3f49005a..f3df27ca 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending @@ -1,9 +1,9 @@ -This test fails because the hid_listener_keycode_released function +This test fails because the hid_listener_keycode_released function releases implicit modifiers always, even if they were not set by the key that's going up. Also see the comment in that function: If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time. Solving this would require keeping track of which key's implicit modifiers are currently - active and only releasing modifiers at that time. + active and only releasing modifiers at that time. diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap index 10d0dbf8..8c4534f4 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap index 3d6494dd..e82182c4 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap index d5f372f1..a36b85d2 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; diff --git a/app/tests/momentary-layer/1-normal/native_posix_64.keymap b/app/tests/momentary-layer/1-normal/native_posix_64.keymap index b5249f7b..ed0e8ad1 100644 --- a/app/tests/momentary-layer/1-normal/native_posix_64.keymap +++ b/app/tests/momentary-layer/1-normal/native_posix_64.keymap @@ -24,9 +24,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap index 96e4e8d9..9311fdee 100644 --- a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap @@ -24,9 +24,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/3-covered/native_posix_64.keymap b/app/tests/momentary-layer/3-covered/native_posix_64.keymap index 2dde6d88..62ae301d 100644 --- a/app/tests/momentary-layer/3-covered/native_posix_64.keymap +++ b/app/tests/momentary-layer/3-covered/native_posix_64.keymap @@ -27,7 +27,7 @@ and the original key is "covered". &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap index d0f26b2f..230e9566 100644 --- a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap index 9febf08c..79567de9 100644 --- a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap @@ -24,7 +24,7 @@ &kscan { events = < /* press sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) /* tap sk LEFT_CONTROL */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) @@ -32,12 +32,12 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* release sl lower_layer */ - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap A (with left control and left shift enabled) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap index e9b87f42..e89faa93 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap @@ -35,11 +35,11 @@ &kscan { events = < /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press 1 */ ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) @@ -49,11 +49,11 @@ /* repeat test to check if cleanup is done correctly */ /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press 1 */ ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap index 33115453..f52a6bec 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap @@ -9,17 +9,17 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) /* second key is pressed shortly after the first. It should not be capitalized. */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap index 2d078ba5..63aca99b 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap @@ -5,14 +5,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap index 4470fb21..18d09ebc 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap @@ -29,8 +29,8 @@ &kscan { events = < /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* press X */ ZMK_MOCK_PRESS(0,1,10) /* press A */ @@ -40,8 +40,8 @@ /* repeat test to check if cleanup is done correctly */ /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* press X */ ZMK_MOCK_PRESS(0,1,10) /* press Y */ diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap index 438880d5..47600269 100644 --- a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap index 067f2379..2fb661a7 100644 --- a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap index d58641bd..92fd1e0a 100644 --- a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,800) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,800) ZMK_MOCK_PRESS(1,0,400) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap index aac6725e..1daa6c4f 100644 --- a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,1100) + ZMK_MOCK_RELEASE(0,0,1100) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap index 66bb72d8..1be65a5b 100644 --- a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap +++ b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,100) diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap index bdcccf33..a90bb32e 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap @@ -24,24 +24,24 @@ &kscan { events = < /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap sk LEFT_CONTROL */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* repeat */ /* tap sl */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap sk */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap index d4c30fbf..f811f7e9 100644 --- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap @@ -18,10 +18,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* the sticky key is pressed again, so the previous one must be cancelled */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,1200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap index c5e1c8db..5674c4ea 100644 --- a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) + ZMK_MOCK_RELEASE(0,0,200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap index 6813393e..142b8236 100644 --- a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap +++ b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap @@ -6,10 +6,10 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) + ZMK_MOCK_RELEASE(0,0,200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap index f4c7a2d2..bcfc21d2 100644 --- a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap +++ b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap @@ -6,6 +6,6 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap index 0fec2e40..6691437e 100644 --- a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap +++ b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap index 8375c6f6..942ecfc0 100644 --- a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap +++ b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap @@ -6,10 +6,10 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.keymap b/app/tests/wpm/1-single_keypress/native_posix_64.keymap index ec12a286..2aa52c16 100644 --- a/app/tests/wpm/1-single_keypress/native_posix_64.keymap +++ b/app/tests/wpm/1-single_keypress/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ - ZMK_MOCK_PRESS(0,0,6000) + ZMK_MOCK_PRESS(0,0,6000) >; }; \ No newline at end of file diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap index f4ba2dfe..3cfab946 100644 --- a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap +++ b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap @@ -2,14 +2,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) //1st WPM worker call - 12wpm - 1 key press in 1 second - ZMK_MOCK_PRESS(0,0,1000) + ZMK_MOCK_PRESS(0,0,1000) ZMK_MOCK_RELEASE(0,0,10) // 2nd WPM worker call - 12wpm - 2 key press in 2 second // note there is no event for this as WPM hasn't changed // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds - ZMK_MOCK_PRESS(0,0,2000) + ZMK_MOCK_PRESS(0,0,2000) >; }; \ No newline at end of file diff --git a/docs/package-lock.json b/docs/package-lock.json index fbc859e5..c7333cb3 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -39,7 +39,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "2.3.1", + "prettier": "^2.7.1", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" @@ -12201,15 +12201,18 @@ } }, "node_modules/prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-error": { @@ -24675,9 +24678,9 @@ "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true }, "pretty-error": { diff --git a/docs/package.json b/docs/package.json index 7c933b03..95d47b9f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -58,7 +58,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "2.3.1", + "prettier": "^2.7.1", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache index f90c7488..90f9cdcf 100644 --- a/docs/src/templates/setup.ps1.mustache +++ b/docs/src/templates/setup.ps1.mustache @@ -74,7 +74,7 @@ if (Test-CommandExists Get-Acl) { $permission = (Get-Acl $pwd).Access | ?{$_.IdentityReference -match $env:UserName ` -and $_.FileSystemRights -match "FullControl" ` - -or $_.FileSystemRights -match "Write" } | + -or $_.FileSystemRights -match "Write" } | Select IdentityReference,FileSystemRights If (-Not $permission){ @@ -141,7 +141,7 @@ if ($keyboard_type -eq "shield") { Write-Host "Wired split is not yet supported by ZMK." exit 1 } - + $shields = $keyboard_siblings $board = $($($boards.keys)[$choice]) $boards = ( $board ) diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache index 4c3868ec..c711dbc5 100644 --- a/docs/src/templates/setup.sh.mustache +++ b/docs/src/templates/setup.sh.mustache @@ -97,7 +97,7 @@ select opt in "${options[@]}" "Quit"; do keyboard_arch=${keyboards_arch[$keyboard_index]} keyboard_basedir=${keyboards_basedir[$keyboard_index]} keyboard_title=${options[$keyboard_index]} - keyboard_sibling_var=${keyboard}_siblings[@] + keyboard_sibling_var=${keyboard}_siblings[@] keyboard_sibling_first=${keyboard}_siblings[0] if [ -n "${!keyboard_sibling_first}" ]; then keyboard_siblings=${!keyboard_sibling_var} diff --git a/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index 8ca382c5..4c2bdf3b 100644 --- a/schema/hardware-metadata.schema.json +++ b/schema/hardware-metadata.schema.json @@ -31,10 +31,7 @@ }, { "type": "object", - "required": [ - "id", - "features" - ], + "required": ["id", "features"], "properties": { "id": { "$ref": "#/$defs/id" @@ -89,9 +86,7 @@ "title": "InterconnectNodeLabels", "type": "object", "additionalProperties": false, - "required": [ - "gpio" - ], + "required": ["gpio"], "properties": { "gpio": { "type": "string" }, "i2c": { "type": "string" }, @@ -104,14 +99,7 @@ "title": "Interconnect", "type": "object", "additionalProperties": false, - "required": [ - "file_format", - "id", - "name", - "description", - "url", - "type" - ], + "required": ["file_format", "id", "name", "description", "url", "type"], "properties": { "file_format": { "type": "string", @@ -200,10 +188,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "usb", - "ble" - ] + "enum": ["usb", "ble"] } }, "features": { @@ -224,14 +209,7 @@ "title": "Shield", "type": "object", "additionalProperties": false, - "required": [ - "file_format", - "id", - "name", - "url", - "type", - "requires" - ], + "required": ["file_format", "id", "name", "url", "type", "requires"], "properties": { "file_format": { "type": "string", From 94061bb91629a83cfe251e63799a9be04a1564d4 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:25:56 -0500 Subject: [PATCH 072/134] refactor: Replace tabs with spaces Standardized indentation to use spaces with a new pre-commit hook. --- .pre-commit-config.yaml | 5 + app/Kconfig | 380 +++++++++--------- app/boards/arm/bdn9/Kconfig.board | 4 +- app/boards/arm/bdn9/Kconfig.defconfig | 10 +- app/boards/arm/bdn9/bdn9_rev2.dts | 198 ++++----- app/boards/arm/bdn9/bdn9_rev2.keymap | 30 +- app/boards/arm/bluemicro840/Kconfig | 8 +- app/boards/arm/bluemicro840/Kconfig.board | 4 +- app/boards/arm/bluemicro840/Kconfig.defconfig | 10 +- .../bluemicro840/arduino_pro_micro_pins.dtsi | 86 ++-- .../bluemicro840/bluemicro840_v1-pinctrl.dtsi | 58 +-- .../arm/bluemicro840/bluemicro840_v1.dts | 158 ++++---- app/boards/arm/bt60/Kconfig | 8 +- app/boards/arm/bt60/Kconfig.board | 8 +- app/boards/arm/bt60/Kconfig.defconfig | 14 +- app/boards/arm/bt60/bt60.dtsi | 170 ++++---- app/boards/arm/bt60/bt60_v1.dts | 186 ++++----- app/boards/arm/bt60/bt60_v1.keymap | 328 +++++++-------- app/boards/arm/bt60/bt60_v1_hs.dts | 88 ++-- app/boards/arm/bt60/bt60_v1_hs.keymap | 60 +-- app/boards/arm/corneish_zen/Kconfig.board | 8 +- app/boards/arm/corneish_zen/Kconfig.defconfig | 46 +-- app/boards/arm/corneish_zen/corneish_zen.dtsi | 166 ++++---- .../arm/corneish_zen/corneish_zen.keymap | 4 +- .../arm/corneish_zen/corneish_zen_v2_left.dts | 144 +++---- .../corneish_zen/corneish_zen_v2_right.dts | 150 +++---- app/boards/arm/dz60rgb/Kconfig.board | 4 +- app/boards/arm/dz60rgb/Kconfig.defconfig | 4 +- app/boards/arm/dz60rgb/dz60rgb_rev1.dts | 126 +++--- app/boards/arm/dz60rgb/dz60rgb_rev1.keymap | 24 +- app/boards/arm/ferris/Kconfig.board | 4 +- app/boards/arm/ferris/Kconfig.defconfig | 8 +- app/boards/arm/ferris/ferris_rev02.dts | 226 +++++------ app/boards/arm/mikoto/Kconfig | 10 +- app/boards/arm/mikoto/Kconfig.board | 4 +- app/boards/arm/mikoto/Kconfig.defconfig | 14 +- .../arm/mikoto/arduino_pro_micro_pins.dtsi | 86 ++-- app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi | 58 +-- app/boards/arm/mikoto/mikoto_520.dts | 160 ++++---- app/boards/arm/nice60/Kconfig | 8 +- app/boards/arm/nice60/Kconfig.board | 4 +- app/boards/arm/nice60/Kconfig.defconfig | 10 +- app/boards/arm/nice60/nice60-pinctrl.dtsi | 10 +- app/boards/arm/nice60/nice60.dts | 248 ++++++------ app/boards/arm/nice60/nice60.keymap | 42 +- app/boards/arm/nice_nano/Kconfig | 8 +- app/boards/arm/nice_nano/Kconfig.board | 8 +- app/boards/arm/nice_nano/Kconfig.defconfig | 10 +- .../arm/nice_nano/arduino_pro_micro_pins.dtsi | 86 ++-- .../arm/nice_nano/nice_nano-pinctrl.dtsi | 58 +-- app/boards/arm/nice_nano/nice_nano.dts | 30 +- app/boards/arm/nice_nano/nice_nano.dtsi | 132 +++--- app/boards/arm/nice_nano/nice_nano_v2.dts | 26 +- app/boards/arm/nrf52840_m2/Kconfig | 8 +- app/boards/arm/nrf52840_m2/Kconfig.board | 4 +- app/boards/arm/nrf52840_m2/Kconfig.defconfig | 10 +- app/boards/arm/nrf52840_m2/nrf52840_m2.dts | 148 +++---- app/boards/arm/nrfmicro/Kconfig | 14 +- app/boards/arm/nrfmicro/Kconfig.board | 16 +- app/boards/arm/nrfmicro/Kconfig.defconfig | 16 +- .../arm/nrfmicro/arduino_pro_micro_pins.dtsi | 86 ++-- .../arduino_pro_micro_pins_52833.dtsi | 86 ++-- .../arduino_pro_micro_pins_flipped.dtsi | 86 ++-- .../nrfmicro/nrfmicro-flipped-pinctrl.dtsi | 58 +-- app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi | 58 +-- app/boards/arm/nrfmicro/nrfmicro_11.dts | 138 +++---- .../arm/nrfmicro/nrfmicro_11_flipped.dts | 138 +++---- app/boards/arm/nrfmicro/nrfmicro_13.dts | 156 +++---- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 156 +++---- app/boards/arm/pillbug/pillbug-pinctrl.dtsi | 88 ++-- app/boards/arm/planck/Kconfig.board | 4 +- app/boards/arm/planck/Kconfig.defconfig | 4 +- app/boards/arm/planck/planck_rev6.dts | 192 ++++----- app/boards/arm/planck/planck_rev6.keymap | 64 +-- app/boards/arm/preonic/Kconfig.board | 4 +- app/boards/arm/proton_c/Kconfig.board | 4 +- app/boards/arm/proton_c/Kconfig.defconfig | 4 +- .../arm/proton_c/arduino_pro_micro_pins.dtsi | 86 ++-- app/boards/arm/proton_c/proton_c.dts | 112 +++--- app/boards/arm/puchi_ble/Kconfig.board | 4 +- app/boards/arm/puchi_ble/Kconfig.defconfig | 12 +- .../arm/puchi_ble/arduino_pro_micro_pins.dtsi | 86 ++-- .../arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi | 58 +-- app/boards/arm/puchi_ble/puchi_ble_v1.dts | 156 +++---- app/boards/arm/s40nc/Kconfig.board | 4 +- app/boards/arm/s40nc/Kconfig.defconfig | 12 +- app/boards/arm/s40nc/s40nc.dts | 198 ++++----- app/boards/arm/s40nc/s40nc.keymap | 34 +- app/boards/native_posix.overlay | 20 +- app/boards/native_posix_64.overlay | 20 +- app/boards/seeeduino_xiao.overlay | 14 +- app/boards/seeeduino_xiao_ble.overlay | 34 +- app/boards/shields/Kconfig.defconfig | 4 +- app/boards/shields/Kconfig.shield | 2 +- app/boards/shields/a_dux/Kconfig.defconfig | 6 +- app/boards/shields/a_dux/Kconfig.shield | 4 +- app/boards/shields/a_dux/a_dux.dtsi | 76 ++-- app/boards/shields/a_dux/a_dux.keymap | 24 +- app/boards/shields/a_dux/a_dux_right.overlay | 2 +- app/boards/shields/bfo9000/Kconfig.defconfig | 6 +- app/boards/shields/bfo9000/Kconfig.shield | 4 +- app/boards/shields/bfo9000/bfo9000.dtsi | 60 +-- app/boards/shields/bfo9000/bfo9000.keymap | 70 ++-- .../shields/bfo9000/bfo9000_left.overlay | 22 +- .../shields/bfo9000/bfo9000_right.overlay | 24 +- .../shields/boardsource3x4/Kconfig.shield | 2 +- .../shields/chalice/boards/nice_nano.overlay | 62 +-- .../chalice/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/clog/Kconfig.defconfig | 6 +- app/boards/shields/clog/Kconfig.shield | 4 +- app/boards/shields/clog/clog.dtsi | 64 +-- app/boards/shields/clog/clog_right.overlay | 2 +- .../clueboard_california/Kconfig.defconfig | 4 +- .../clueboard_california/Kconfig.shield | 2 +- .../clueboard_california.keymap | 26 +- .../clueboard_california.overlay | 40 +- app/boards/shields/contra/Kconfig.shield | 2 +- app/boards/shields/corne/Kconfig.defconfig | 20 +- app/boards/shields/corne/Kconfig.shield | 4 +- .../shields/corne/boards/nice_nano.overlay | 62 +-- .../shields/corne/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/corne/corne.dtsi | 94 ++--- app/boards/shields/corne/corne.keymap | 4 +- app/boards/shields/corne/corne_left.overlay | 16 +- app/boards/shields/corne/corne_right.overlay | 20 +- app/boards/shields/cradio/Kconfig.defconfig | 6 +- app/boards/shields/cradio/Kconfig.shield | 4 +- app/boards/shields/cradio/README.md | 38 +- app/boards/shields/cradio/cradio.dtsi | 76 ++-- .../shields/cradio/cradio_right.overlay | 2 +- app/boards/shields/crbn/Kconfig.defconfig | 2 +- app/boards/shields/crbn/Kconfig.shield | 2 +- app/boards/shields/crbn/crbn.keymap | 86 ++-- app/boards/shields/crbn/crbn.overlay | 80 ++-- .../shields/elephant42/Kconfig.defconfig | 16 +- .../elephant42/boards/nice_nano.overlay | 62 +-- .../elephant42/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/elephant42/elephant42.dtsi | 32 +- app/boards/shields/ergodash/Kconfig.defconfig | 6 +- app/boards/shields/ergodash/Kconfig.shield | 4 +- app/boards/shields/ergodash/ergodash.dtsi | 62 +-- .../shields/ergodash/ergodash_right.overlay | 2 +- .../shields/eternal_keypad/Kconfig.defconfig | 2 +- .../shields/eternal_keypad/Kconfig.shield | 4 +- .../eternal_keypad/boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/fourier/Kconfig.defconfig | 6 +- app/boards/shields/fourier/Kconfig.shield | 4 +- app/boards/shields/fourier/fourier.dtsi | 52 +-- .../shields/helix/boards/nice_nano.overlay | 62 +-- .../shields/helix/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/helix/helix_right.overlay | 2 +- .../shields/hummingbird/hummingbird.overlay | 4 +- app/boards/shields/iris/Kconfig.defconfig | 6 +- app/boards/shields/iris/Kconfig.shield | 4 +- app/boards/shields/iris/iris.dtsi | 48 +-- app/boards/shields/iris/iris.keymap | 38 +- app/boards/shields/iris/iris_left.overlay | 16 +- app/boards/shields/iris/iris_right.overlay | 18 +- app/boards/shields/jian/Kconfig.defconfig | 6 +- app/boards/shields/jian/Kconfig.shield | 4 +- app/boards/shields/jian/jian.dtsi | 76 ++-- app/boards/shields/jian/jian_left.overlay | 16 +- app/boards/shields/jian/jian_right.overlay | 22 +- app/boards/shields/jiran/Kconfig.defconfig | 6 +- app/boards/shields/jiran/Kconfig.shield | 4 +- app/boards/shields/jiran/jiran.dtsi | 74 ++-- app/boards/shields/jiran/jiran_left.overlay | 16 +- app/boards/shields/jiran/jiran_right.overlay | 22 +- app/boards/shields/jorne/Kconfig.defconfig | 20 +- app/boards/shields/jorne/Kconfig.shield | 4 +- .../shields/jorne/boards/nice_nano.overlay | 62 +-- .../shields/jorne/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/jorne/jorne.dtsi | 108 ++--- app/boards/shields/jorne/jorne_left.overlay | 16 +- app/boards/shields/jorne/jorne_right.overlay | 22 +- app/boards/shields/kyria/Kconfig.defconfig | 20 +- app/boards/shields/kyria/Kconfig.shield | 24 +- .../shields/kyria/boards/nice_nano.overlay | 62 +-- .../shields/kyria/boards/nice_nano_v2.overlay | 62 +-- .../shields/kyria/boards/nrfmicro_11.overlay | 62 +-- .../kyria/boards/nrfmicro_11_flipped.overlay | 62 +-- .../shields/kyria/boards/nrfmicro_13.overlay | 62 +-- app/boards/shields/kyria/kyria.dtsi | 54 +-- app/boards/shields/kyria/kyria.keymap | 24 +- app/boards/shields/kyria/kyria_common.dtsi | 80 ++-- app/boards/shields/kyria/kyria_left.overlay | 22 +- app/boards/shields/kyria/kyria_rev2.dtsi | 42 +- app/boards/shields/kyria/kyria_rev2.keymap | 24 +- .../shields/kyria/kyria_rev2_left.overlay | 34 +- .../shields/kyria/kyria_rev2_right.overlay | 38 +- app/boards/shields/kyria/kyria_rev3.dtsi | 48 +-- app/boards/shields/kyria/kyria_rev3.keymap | 40 +- .../shields/kyria/kyria_rev3_left.overlay | 32 +- .../shields/kyria/kyria_rev3_right.overlay | 34 +- app/boards/shields/kyria/kyria_right.overlay | 26 +- app/boards/shields/leeloo/Kconfig.defconfig | 20 +- app/boards/shields/leeloo/Kconfig.shield | 4 +- app/boards/shields/leeloo/leeloo.dtsi | 32 +- app/boards/shields/leeloo/leeloo_left.overlay | 18 +- .../shields/leeloo/leeloo_right.overlay | 20 +- app/boards/shields/lily58/Kconfig.defconfig | 20 +- app/boards/shields/lily58/Kconfig.shield | 4 +- .../shields/lily58/boards/nice_nano.overlay | 62 +-- .../lily58/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/lily58/lily58.dtsi | 102 ++--- app/boards/shields/lily58/lily58.keymap | 36 +- app/boards/shields/lily58/lily58_left.overlay | 18 +- .../shields/lily58/lily58_right.overlay | 18 +- app/boards/shields/lotus58/Kconfig.defconfig | 20 +- app/boards/shields/lotus58/Kconfig.shield | 4 +- .../shields/lotus58/lotus58_left.overlay | 18 +- .../shields/lotus58/lotus58_right.overlay | 20 +- app/boards/shields/m60/Kconfig.defconfig | 2 +- app/boards/shields/m60/Kconfig.shield | 2 +- app/boards/shields/m60/m60.keymap | 32 +- app/boards/shields/m60/m60.overlay | 68 ++-- app/boards/shields/microdox/Kconfig.defconfig | 20 +- app/boards/shields/microdox/Kconfig.shield | 4 +- .../shields/microdox/boards/nice_nano.overlay | 62 +-- .../microdox/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/microdox/microdox.dtsi | 76 ++-- .../shields/microdox/microdox_left.overlay | 14 +- .../shields/microdox/microdox_right.overlay | 20 +- app/boards/shields/murphpad/Kconfig.defconfig | 16 +- app/boards/shields/murphpad/Kconfig.shield | 2 +- .../shields/murphpad/boards/nice_nano.overlay | 62 +-- .../murphpad/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/murphpad/murphpad.overlay | 110 ++--- app/boards/shields/nibble/Kconfig.defconfig | 18 +- app/boards/shields/nibble/Kconfig.shield | 2 +- .../shields/nibble/boards/nice_nano.overlay | 62 +-- .../nibble/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/nibble/nibble.keymap | 38 +- app/boards/shields/nibble/nibble.overlay | 106 ++--- .../shields/nice_view/Kconfig.defconfig | 12 +- app/boards/shields/nice_view/Kconfig.shield | 2 +- .../shields/nice_view/nice_view.overlay | 24 +- .../shields/nice_view_adapter/Kconfig.shield | 2 +- .../boards/bluemicro840_v1.overlay | 42 +- .../boards/mikoto_520.overlay | 42 +- .../boards/nice_nano.overlay | 42 +- .../boards/nice_nano_v2.overlay | 42 +- .../boards/nrfmicro_11.overlay | 42 +- .../boards/nrfmicro_11_flipped.overlay | 42 +- .../boards/nrfmicro_13.overlay | 42 +- .../boards/puchi_ble_v1.overlay | 42 +- app/boards/shields/pancake/Kconfig.shield | 2 +- .../shields/quefrency/Kconfig.defconfig | 6 +- app/boards/shields/quefrency/Kconfig.shield | 4 +- app/boards/shields/quefrency/quefrency.dtsi | 30 +- app/boards/shields/redox/Kconfig.defconfig | 6 +- app/boards/shields/redox/Kconfig.shield | 4 +- .../shields/redox/boards/nice_nano.overlay | 62 +-- .../shields/redox/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/redox/redox.dtsi | 46 +-- app/boards/shields/redox/redox_left.overlay | 18 +- app/boards/shields/redox/redox_right.overlay | 20 +- .../reviung41/boards/nice_nano.overlay | 62 +-- .../reviung41/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/romac/Kconfig.defconfig | 2 +- app/boards/shields/romac/Kconfig.shield | 2 +- app/boards/shields/romac/romac.overlay | 38 +- .../shields/romac_plus/Kconfig.defconfig | 2 +- app/boards/shields/romac_plus/Kconfig.shield | 2 +- .../romac_plus/boards/nice_nano.overlay | 62 +-- .../romac_plus/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/romac_plus/romac_plus.dtsi | 70 ++-- .../shields/romac_plus/romac_plus.overlay | 26 +- .../shields/settings_reset/Kconfig.defconfig | 2 +- .../shields/settings_reset/Kconfig.shield | 2 +- .../settings_reset/settings_reset.overlay | 20 +- app/boards/shields/snap/Kconfig.defconfig | 20 +- app/boards/shields/snap/Kconfig.shield | 4 +- .../shields/snap/boards/nice_nano.overlay | 62 +-- .../shields/snap/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/snap/snap.dtsi | 106 ++--- app/boards/shields/snap/snap.keymap | 38 +- app/boards/shields/snap/snap_left.overlay | 36 +- app/boards/shields/snap/snap_right.overlay | 56 +-- app/boards/shields/sofle/Kconfig.defconfig | 20 +- app/boards/shields/sofle/Kconfig.shield | 4 +- app/boards/shields/sofle/sofle_left.overlay | 18 +- app/boards/shields/sofle/sofle_right.overlay | 20 +- .../splitkb_aurora_corne/Kconfig.defconfig | 24 +- .../splitkb_aurora_corne/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_corne.dtsi | 108 ++--- .../splitkb_aurora_corne.keymap | 4 +- .../splitkb_aurora_corne_left.overlay | 46 +-- .../splitkb_aurora_corne_right.overlay | 50 +-- .../splitkb_aurora_lily58/Kconfig.defconfig | 24 +- .../splitkb_aurora_lily58/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_lily58.dtsi | 94 ++--- .../splitkb_aurora_lily58.keymap | 36 +- .../splitkb_aurora_lily58_left.overlay | 48 +-- .../splitkb_aurora_lily58_right.overlay | 50 +-- .../splitkb_aurora_sweep/Kconfig.defconfig | 24 +- .../splitkb_aurora_sweep/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_sweep.dtsi | 118 +++--- .../splitkb_aurora_sweep.keymap | 66 +-- .../splitkb_aurora_sweep_left.overlay | 54 +-- .../splitkb_aurora_sweep_right.overlay | 56 +-- .../shields/splitreus62/Kconfig.defconfig | 6 +- app/boards/shields/splitreus62/Kconfig.shield | 4 +- .../shields/splitreus62/splitreus62.dtsi | 56 +-- .../shields/splitreus62/splitreus62.keymap | 14 +- .../splitreus62/splitreus62_left.overlay | 16 +- .../splitreus62/splitreus62_right.overlay | 18 +- app/boards/shields/tg4x/Kconfig.shield | 2 +- .../shields/tg4x/boards/nice_nano.overlay | 62 +-- .../shields/tg4x/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/tg4x/tg4x.keymap | 50 +-- app/boards/shields/tg4x/tg4x.overlay | 70 ++-- app/boards/shields/tidbit/Kconfig.defconfig | 16 +- app/boards/shields/tidbit/Kconfig.shield | 2 +- .../shields/tidbit/boards/nice_nano.overlay | 62 +-- .../tidbit/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/tidbit/tidbit.dtsi | 182 ++++----- app/boards/shields/tidbit/tidbit.keymap | 56 +-- app/boards/shields/tidbit/tidbit_19key.keymap | 56 +-- .../shields/two_percent_milk/Kconfig.shield | 2 +- .../two_percent_milk/boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../boards/nrfmicro_11.overlay | 62 +-- .../boards/nrfmicro_11_flipped.overlay | 62 +-- .../boards/nrfmicro_13.overlay | 62 +-- .../two_percent_milk/two_percent_milk.overlay | 22 +- .../shields/waterfowl/Kconfig.defconfig | 20 +- app/boards/shields/waterfowl/Kconfig.shield | 4 +- app/boards/shields/waterfowl/waterfowl.dtsi | 126 +++--- app/boards/shields/waterfowl/waterfowl.keymap | 78 ++-- .../shields/waterfowl/waterfowl_left.overlay | 16 +- .../shields/waterfowl/waterfowl_right.overlay | 18 +- app/boards/shields/zmk_uno/Kconfig.shield | 2 +- app/boards/shields/zmk_uno/zmk_uno.overlay | 256 ++++++------ app/boards/shields/zodiark/Kconfig.defconfig | 20 +- app/boards/shields/zodiark/Kconfig.shield | 4 +- .../shields/zodiark/zodiark_left.overlay | 20 +- .../shields/zodiark/zodiark_right.overlay | 22 +- app/boards/usb_console.dtsi | 14 +- app/cmake/ZephyrBuildConfig.cmake | 250 ++++++------ app/drivers/display/CMakeLists.txt | 2 +- app/drivers/display/Kconfig.il0323 | 10 +- app/drivers/gpio/Kconfig.595 | 22 +- app/drivers/gpio/Kconfig.max7318 | 22 +- app/drivers/kscan/Kconfig | 102 ++--- app/drivers/sensor/battery/Kconfig | 30 +- app/drivers/sensor/ec11/Kconfig | 52 +-- app/dts/behaviors/backlight.dtsi | 14 +- app/dts/behaviors/bluetooth.dtsi | 14 +- app/dts/behaviors/caps_word.dtsi | 16 +- app/dts/behaviors/ext_power.dtsi | 14 +- app/dts/behaviors/gresc.dtsi | 16 +- app/dts/behaviors/key_press.dtsi | 16 +- app/dts/behaviors/key_repeat.dtsi | 16 +- app/dts/behaviors/key_toggle.dtsi | 14 +- app/dts/behaviors/layer_tap.dtsi | 20 +- app/dts/behaviors/macros.dtsi | 76 ++-- app/dts/behaviors/mod_tap.dtsi | 20 +- app/dts/behaviors/momentary_layer.dtsi | 14 +- app/dts/behaviors/none.dtsi | 14 +- app/dts/behaviors/reset.dtsi | 26 +- app/dts/behaviors/rgb_underglow.dtsi | 14 +- .../behaviors/sensor_rotate_key_press.dtsi | 18 +- app/dts/behaviors/sticky_key.dtsi | 36 +- app/dts/behaviors/to_layer.dtsi | 14 +- app/dts/behaviors/toggle_layer.dtsi | 14 +- app/dts/behaviors/transparent.dtsi | 14 +- app/dts/common/arduino_uno_pro_micro_map.dtsi | 68 ++-- app/include/linker/zmk-events.ld | 12 +- app/run-test.sh | 32 +- app/src/split/Kconfig | 14 +- app/src/split/bluetooth/Kconfig | 50 +-- .../backlight/basic/native_posix_64.keymap | 52 +-- app/tests/backlight/behavior_keymap.dtsi | 48 +-- .../config-brt/native_posix_64.keymap | 16 +- .../config-on/native_posix_64.keymap | 16 +- .../config-step/native_posix_64.keymap | 64 +-- .../backlight/cycle/native_posix_64.keymap | 130 +++--- .../low-brightness/native_posix_64.keymap | 70 ++-- app/tests/caps-word/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 44 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 20 +- .../native_posix.keymap | 20 +- .../native_posix_64.keymap | 20 +- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 52 +-- .../native_posix_64.keymap | 54 +-- .../layer-filter-0/native_posix_64.keymap | 122 +++--- .../layer-filter-1/native_posix_64.keymap | 52 +-- .../multiple-timeouts/native_posix_64.keymap | 58 +-- .../native_posix_64.keymap | 172 ++++---- .../native_posix_64.keymap | 88 ++-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 128 +++--- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 48 +-- .../native_posix_64.keymap | 52 +-- .../press-release/native_posix_64.keymap | 74 ++-- .../press-timeout/native_posix_64.keymap | 48 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 70 ++-- .../native_posix_64.keymap | 48 +-- .../balanced/1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-retro-tap/native_posix_64.keymap | 66 +-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../hold-tap/balanced/behavior_keymap.dtsi | 40 +- .../many-nested/native_posix_64.keymap | 60 +-- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-retro-tap/native_posix_64.keymap | 66 +-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../hold-preferred/behavior_keymap.dtsi | 40 +- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-nested-timeouts/native_posix_64.keymap | 70 ++-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../tap-preferred/behavior_keymap.dtsi | 40 +- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../6-global-quick-tap/behavior_keymap.dtsi | 42 +- .../behavior_keymap.dtsi | 40 +- app/tests/key-repeat/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 16 +- .../native_posix.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 8 +- app/tests/keypress/behavior_keymap.dtsi | 20 +- .../kp-press-release/native_posix_64.keymap | 8 +- app/tests/keytoggle/behavior_keymap.dtsi | 20 +- .../kt-alt-tab/native_posix_64.keymap | 60 +-- .../kt-modded-alpha/native_posix_64.keymap | 44 +- .../native_posix_64.keymap | 12 +- .../kt-press-release/native_posix_64.keymap | 12 +- app/tests/macros/basic/native_posix_64.keymap | 2 +- app/tests/macros/behavior_keymap.dtsi | 96 ++--- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 52 +-- .../press-mid-macro/native_posix_64.keymap | 2 +- .../press-release/native_posix_64.keymap | 2 +- .../timing-override/native_posix_64.keymap | 2 +- .../wait-macro-release/native_posix_64.keymap | 2 +- .../1-no-morph/native_posix_64.keymap | 8 +- .../2a-masked-morph/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 42 +- .../native_posix_64.keymap | 46 +-- .../3-unmasked-morph/native_posix_64.keymap | 32 +- app/tests/mod-morph/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../kp-lctl-dn-lctl-up/native_posix_64.keymap | 28 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../1-normal/native_posix_64.keymap | 40 +- .../native_posix_64.keymap | 40 +- .../3-covered/native_posix_64.keymap | 36 +- .../4-nested/native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../momentary-layer/behavior_keymap.dtsi | 28 +- app/tests/none/behavior_keymap.dtsi | 28 +- app/tests/none/layered/native_posix_64.keymap | 2 +- app/tests/none/normal/native_posix.keymap | 2 +- app/tests/none/normal/native_posix_64.keymap | 2 +- .../1-os-dn-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 54 +-- .../10-callum-mods/native_posix_64.keymap | 64 +-- .../10-sl-sl-kp/native_posix_64.keymap | 92 ++--- .../native_posix_64.keymap | 30 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 70 ++-- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 82 ++-- .../native_posix_64.keymap | 70 ++-- .../9-sk-dn-up-dn-up/native_posix_64.keymap | 34 +- app/tests/sticky-keys/behavior_keymap.dtsi | 28 +- .../tap-dance/1a-tap1/native_posix_64.keymap | 8 +- .../tap-dance/1b-tap2/native_posix_64.keymap | 10 +- .../tap-dance/1c-tap3/native_posix_64.keymap | 12 +- .../tap-dance/2a-hold1/native_posix_64.keymap | 8 +- .../tap-dance/2b-hold2/native_posix_64.keymap | 10 +- .../tap-dance/2c-hold3/native_posix_64.keymap | 12 +- .../3a-tap-int-mid/native_posix_64.keymap | 6 +- .../3b-tap-int-seq/native_posix_64.keymap | 6 +- .../3c-tap-int-after/native_posix_64.keymap | 6 +- .../3d-hold-int-mid/native_posix_64.keymap | 6 +- .../3e-hold-int-seq/native_posix_64.keymap | 6 +- .../3f-hold-int-after/native_posix_64.keymap | 6 +- .../4a-single/native_posix_64.keymap | 8 +- .../5a-tdint-mid/native_posix_64.keymap | 6 +- .../5b-tdint-seq/native_posix_64.keymap | 6 +- .../5c-tdint-after/native_posix_64.keymap | 6 +- .../5d-tdint-multiple/native_posix_64.keymap | 6 +- .../6-combo-tap2/native_posix_64.keymap | 20 +- app/tests/to-layer/behavior_keymap.dtsi | 28 +- .../to-layer/normal/native_posix_64.keymap | 30 +- app/tests/toggle-layer/behavior_keymap.dtsi | 38 +- .../early-key-release/native_posix_64.keymap | 4 +- .../normal/native_posix_64.keymap | 2 +- app/tests/transparent/behavior_keymap.dtsi | 28 +- .../layered/native_posix_64.keymap | 2 +- .../transparent/normal/native_posix_64.keymap | 2 +- .../1-single_keypress/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 22 +- app/tests/wpm/behavior_keymap.dtsi | 20 +- docs/blog/2020-10-03-bootloader-fix.md | 22 +- docs/docs/behaviors/hold-tap.md | 212 +++++----- docs/docs/behaviors/layers.md | 20 +- docs/docs/behaviors/tap-dance.md | 44 +- docs/docs/config/index.md | 22 +- docs/docs/development/new-behavior.md | 16 +- docs/docs/development/new-shield.md | 162 ++++---- docs/docs/features/backlight.md | 26 +- docs/docs/features/combos.md | 16 +- docs/docs/features/keymaps.md | 4 +- docs/docs/features/underglow.md | 28 +- docs/docs/keymap-example-file.md | 16 +- docs/docs/keymap-example.md | 16 +- 613 files changed, 11572 insertions(+), 11567 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7687fc6e..1375a6ae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,10 @@ fail_fast: false repos: + - repo: https://github.com/Lucas-C/pre-commit-hooks + rev: v1.5.1 + hooks: + - id: remove-tabs + exclude: "vendor-prefixes\\.txt$" - repo: https://github.com/pocc/pre-commit-hooks rev: v1.3.5 hooks: diff --git a/app/Kconfig b/app/Kconfig index ccc5f42d..25a99b55 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -8,167 +8,167 @@ menu "ZMK" menu "Basic Keyboard Setup" config ZMK_KEYBOARD_NAME - string "Keyboard Name" + string "Keyboard Name" config USB_DEVICE_PRODUCT - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config BT_DEVICE_NAME - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config USB_DEVICE_VID - default 0x1D50 + default 0x1D50 config USB_DEVICE_PID - default 0x615E + default 0x615E config USB_DEVICE_MANUFACTURER - default "ZMK Project" + default "ZMK Project" config BT_DIS_PNP_VID - default 0x1D50 + default 0x1D50 config BT_DIS_PNP_PID - default 0x615E + default 0x615E config BT_DIS_MODEL - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config BT_DIS_MANUF - default "ZMK Project" + default "ZMK Project" menu "HID" choice ZMK_HID_REPORT_TYPE - prompt "HID Report Type" + prompt "HID Report Type" config ZMK_HID_REPORT_TYPE_HKRO - bool "#-Key Roll Over (HKRO) HID Report" - help - Enable # key roll over for HID report. This selection is "boot keyboard" compatible - but limits the total number of possible keys to report as held to #. + bool "#-Key Roll Over (HKRO) HID Report" + help + Enable # key roll over for HID report. This selection is "boot keyboard" compatible + but limits the total number of possible keys to report as held to #. config ZMK_HID_REPORT_TYPE_NKRO - bool "Full N-Key Roll Over (NKRO) HID Report" - help - Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard - from working with some BIOS/UEFI versions that only support "boot keyboard" support. - This option also prevents using some infrequently used higher range HID usages. + bool "Full N-Key Roll Over (NKRO) HID Report" + help + Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard + from working with some BIOS/UEFI versions that only support "boot keyboard" support. + This option also prevents using some infrequently used higher range HID usages. endchoice if ZMK_HID_REPORT_TYPE_HKRO config ZMK_HID_KEYBOARD_REPORT_SIZE - int "# Keyboard Keys Reportable" - default 6 + int "# Keyboard Keys Reportable" + default 6 endif config ZMK_HID_CONSUMER_REPORT_SIZE - int "# Consumer Keys Reportable" - default 6 + int "# Consumer Keys Reportable" + default 6 choice ZMK_HID_CONSUMER_REPORT_USAGES - prompt "HID Report Type" + prompt "HID Report Type" config ZMK_HID_CONSUMER_REPORT_USAGES_FULL - bool "Full Consumer HID Usage Support" - help - Enable full Consumer usage ID values to be sent to hosts. Allows for less - frequently used usages, but has compatibability issues with some host OSes. + bool "Full Consumer HID Usage Support" + help + Enable full Consumer usage ID values to be sent to hosts. Allows for less + frequently used usages, but has compatibability issues with some host OSes. config ZMK_HID_CONSUMER_REPORT_USAGES_BASIC - bool "Basic Consumer HID Usage Support" - help - Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to - hosts. Allows for broader compatibability with more host OSes. + bool "Basic Consumer HID Usage Support" + help + Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to + hosts. Allows for broader compatibability with more host OSes. endchoice menu "Output Types" config ZMK_USB - bool "USB" - select USB - select USB_DEVICE_STACK - select USB_DEVICE_HID + bool "USB" + select USB + select USB_DEVICE_STACK + select USB_DEVICE_HID if ZMK_USB config USB_NUMOF_EP_WRITE_RETRIES - default 10 + default 10 config USB_HID_POLL_INTERVAL_MS - default 1 + default 1 #ZMK_USB endif menuconfig ZMK_BLE - bool "BLE (HID over GATT)" - select BT - select BT_SMP - select BT_SMP_SC_PAIR_ONLY - select BT_SMP_APP_PAIRING_ACCEPT - select BT_PERIPHERAL - select BT_DIS - select BT_BAS - select BT_SETTINGS - select SETTINGS + bool "BLE (HID over GATT)" + select BT + select BT_SMP + select BT_SMP_SC_PAIR_ONLY + select BT_SMP_APP_PAIRING_ACCEPT + select BT_PERIPHERAL + select BT_DIS + select BT_BAS + select BT_SETTINGS + select SETTINGS if ZMK_BLE config SYSTEM_WORKQUEUE_STACK_SIZE - default 4096 if SOC_RP2040 - default 2048 + default 4096 if SOC_RP2040 + default 2048 config ZMK_BLE_THREAD_STACK_SIZE - int "BLE notify thread stack size" - default 512 + int "BLE notify thread stack size" + default 512 config ZMK_BLE_THREAD_PRIORITY - int "BLE notify thread priority" - default 5 + int "BLE notify thread priority" + default 5 config ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE - int "Max number of keyboard HID reports to queue for sending over BLE" - default 20 + int "Max number of keyboard HID reports to queue for sending over BLE" + default 20 config ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE - int "Max number of consumer HID reports to queue for sending over BLE" - default 5 + int "Max number of consumer HID reports to queue for sending over BLE" + default 5 config ZMK_BLE_CLEAR_BONDS_ON_START - bool "Configuration that clears all bond information from the keyboard on startup." - default n + bool "Configuration that clears all bond information from the keyboard on startup." + default n # HID GATT notifications sent this way are *not* picked up by Linux, and possibly others. config BT_GATT_NOTIFY_MULTIPLE - default n + default n config BT_GATT_AUTO_SEC_REQ - default n + default n config BT_DEVICE_APPEARANCE - default 961 + default 961 config ZMK_BLE_PASSKEY_ENTRY - bool "Experimental: Requiring typing passkey from host to pair BLE connection" - default n + bool "Experimental: Requiring typing passkey from host to pair BLE connection" + default n config BT_PERIPHERAL_PREF_MIN_INT - default 6 + default 6 config BT_PERIPHERAL_PREF_MAX_INT - default 12 + default 12 config BT_PERIPHERAL_PREF_LATENCY - default 30 + default 30 config BT_PERIPHERAL_PREF_TIMEOUT - default 400 + default 400 #ZMK_BLE endif @@ -189,108 +189,108 @@ menu "Display/LED Options" rsource "src/display/Kconfig" menuconfig ZMK_RGB_UNDERGLOW - bool "RGB Adressable LED Underglow" - select LED_STRIP + bool "RGB Adressable LED Underglow" + select LED_STRIP if ZMK_RGB_UNDERGLOW # This default value cuts down on tons of excess .conf files, if you're using GPIO, manually disable this config SPI - default y + default y config ZMK_RGB_UNDERGLOW_EXT_POWER - bool "RGB underglow toggling also controls external power" - default y + bool "RGB underglow toggling also controls external power" + default y config ZMK_RGB_UNDERGLOW_BRT_MIN - int "RGB underglow minimum brightness in percent" - range 0 100 - default 0 + int "RGB underglow minimum brightness in percent" + range 0 100 + default 0 config ZMK_RGB_UNDERGLOW_BRT_MAX - int "RGB underglow maximum brightness in percent" - range ZMK_RGB_UNDERGLOW_BRT_MIN 100 - default 100 + int "RGB underglow maximum brightness in percent" + range ZMK_RGB_UNDERGLOW_BRT_MIN 100 + default 100 config ZMK_RGB_UNDERGLOW_HUE_STEP - int "RGB underglow hue step in degrees" - range 0 359 - default 10 + int "RGB underglow hue step in degrees" + range 0 359 + default 10 config ZMK_RGB_UNDERGLOW_SAT_STEP - int "RGB underglow saturation step in percent" - range 0 100 - default 10 + int "RGB underglow saturation step in percent" + range 0 100 + default 10 config ZMK_RGB_UNDERGLOW_BRT_STEP - int "RGB underglow brightness step in percent" - range 0 100 - default 10 + int "RGB underglow brightness step in percent" + range 0 100 + default 10 config ZMK_RGB_UNDERGLOW_HUE_START - int "RGB underglow start hue value in degrees" - range 0 359 - default 0 + int "RGB underglow start hue value in degrees" + range 0 359 + default 0 config ZMK_RGB_UNDERGLOW_SAT_START - int "RGB underglow start saturations value in percent" - range 0 100 - default 100 + int "RGB underglow start saturations value in percent" + range 0 100 + default 100 config ZMK_RGB_UNDERGLOW_BRT_START - int "RGB underglow start brightness value in percent" - range ZMK_RGB_UNDERGLOW_BRT_MIN ZMK_RGB_UNDERGLOW_BRT_MAX - default ZMK_RGB_UNDERGLOW_BRT_MAX + int "RGB underglow start brightness value in percent" + range ZMK_RGB_UNDERGLOW_BRT_MIN ZMK_RGB_UNDERGLOW_BRT_MAX + default ZMK_RGB_UNDERGLOW_BRT_MAX config ZMK_RGB_UNDERGLOW_SPD_START - int "RGB underglow start animation speed value" - range 1 5 - default 3 + int "RGB underglow start animation speed value" + range 1 5 + default 3 config ZMK_RGB_UNDERGLOW_EFF_START - int "RGB underglow start effect int value related to the effect enum list" - range 0 3 - default 0 + int "RGB underglow start effect int value related to the effect enum list" + range 0 3 + default 0 config ZMK_RGB_UNDERGLOW_ON_START - bool "RGB underglow starts on by default" - default y + bool "RGB underglow starts on by default" + default y config ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE - bool "Turn off RGB underglow when keyboard goes into idle state" + bool "Turn off RGB underglow when keyboard goes into idle state" config ZMK_RGB_UNDERGLOW_AUTO_OFF_USB - bool "Turn off RGB underglow when USB is disconnected" - depends on USB_DEVICE_STACK + bool "Turn off RGB underglow when USB is disconnected" + depends on USB_DEVICE_STACK #ZMK_RGB_UNDERGLOW endif menuconfig ZMK_BACKLIGHT - bool "LED backlight" - select LED + bool "LED backlight" + select LED if ZMK_BACKLIGHT config ZMK_BACKLIGHT_BRT_STEP - int "Brightness step in percent" - range 1 100 - default 20 + int "Brightness step in percent" + range 1 100 + default 20 config ZMK_BACKLIGHT_BRT_START - int "Default brightness in percent" - range 1 100 - default 40 + int "Default brightness in percent" + range 1 100 + default 40 config ZMK_BACKLIGHT_ON_START - bool "Default backlight state" - default y + bool "Default backlight state" + default y config ZMK_BACKLIGHT_AUTO_OFF_IDLE - bool "Turn off backlight when keyboard goes into idle state" + bool "Turn off backlight when keyboard goes into idle state" config ZMK_BACKLIGHT_AUTO_OFF_USB - bool "Turn off backlight when USB is disconnected" + bool "Turn off backlight when USB is disconnected" #ZMK_BACKLIGHT endif @@ -301,28 +301,28 @@ endmenu menu "Power Management" config ZMK_IDLE_TIMEOUT - int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" - default 30000 + int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" + default 30000 config ZMK_SLEEP - bool "Enable deep sleep support" - imply USB + bool "Enable deep sleep support" + imply USB if ZMK_SLEEP config PM_DEVICE - default y + default y config ZMK_IDLE_SLEEP_TIMEOUT - int "Milliseconds of inactivity before entering deep sleep" - default 900000 + int "Milliseconds of inactivity before entering deep sleep" + default 900000 #ZMK_SLEEP endif config ZMK_EXT_POWER - bool "Enable support to control external power output" - default y + bool "Enable support to control external power output" + default y #Power Management endmenu @@ -330,16 +330,16 @@ endmenu menu "Combo options" config ZMK_COMBO_MAX_PRESSED_COMBOS - int "Maximum number of currently pressed combos" - default 4 + int "Maximum number of currently pressed combos" + default 4 config ZMK_COMBO_MAX_COMBOS_PER_KEY - int "Maximum number of combos per key" - default 5 + int "Maximum number of combos per key" + default 5 config ZMK_COMBO_MAX_KEYS_PER_COMBO - int "Maximum number of keys per combo" - default 4 + int "Maximum number of keys per combo" + default 4 #Combo options endmenu @@ -347,18 +347,18 @@ endmenu menu "Behavior Options" config ZMK_BEHAVIORS_QUEUE_SIZE - int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" - default 64 + int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" + default 64 rsource "Kconfig.behaviors" config ZMK_MACRO_DEFAULT_WAIT_MS - int "Default time to wait (in milliseconds) before triggering the next behavior in macros" - default 15 + int "Default time to wait (in milliseconds) before triggering the next behavior in macros" + default 15 config ZMK_MACRO_DEFAULT_TAP_MS - int "Default time to wait (in milliseconds) between the press and release events of a tapped behavior in macros" - default 30 + int "Default time to wait (in milliseconds) between the press and release events of a tapped behavior in macros" + default 30 endmenu @@ -369,8 +369,8 @@ menu "Initialization Priorities" if USB_DEVICE_STACK config ZMK_USB_INIT_PRIORITY - int "USB Init Priority" - default 50 + int "USB Init Priority" + default 50 #USB endif @@ -378,8 +378,8 @@ endif if ZMK_BLE || ZMK_SPLIT_BLE config ZMK_BLE_INIT_PRIORITY - int "BLE Init Priority" - default 50 + int "BLE Init Priority" + default 50 #ZMK_BLE || ZMK_SPLIT_BLE endif @@ -390,8 +390,8 @@ endmenu menu "KSCAN Settings" config ZMK_KSCAN_EVENT_QUEUE_SIZE - int "Size of the event queue for KSCAN events to buffer events" - default 4 + int "Size of the event queue for KSCAN events to buffer events" + default 4 #KSCAN Settings endmenu @@ -399,63 +399,63 @@ endmenu menu "Logging" config ZMK_LOGGING_MINIMAL - bool "Suppress all ZMK debug log messages" - default false + bool "Suppress all ZMK debug log messages" + default false if !ZMK_LOGGING_MINIMAL config ZMK_LOG_LEVEL - default 4 + default 4 endif config ZMK_USB_LOGGING - bool "Enable USB CDC ACM logging to help debug" - select LOG - select USB - select USB_DEVICE_STACK - select USB_CDC_ACM - select SERIAL - select CONSOLE - select UART_INTERRUPT_DRIVEN - select UART_LINE_CTRL - select UART_CONSOLE - select USB_UART_CONSOLE + bool "Enable USB CDC ACM logging to help debug" + select LOG + select USB + select USB_DEVICE_STACK + select USB_CDC_ACM + select SERIAL + select CONSOLE + select UART_INTERRUPT_DRIVEN + select UART_LINE_CTRL + select UART_CONSOLE + select USB_UART_CONSOLE if ZMK_USB_LOGGING choice USB_CDC_ACM_LOG_LEVEL_CHOICE - default USB_CDC_ACM_LOG_LEVEL_OFF + default USB_CDC_ACM_LOG_LEVEL_OFF endchoice choice USB_DRIVER_LOG_LEVEL_CHOICE - default USB_DRIVER_LOG_LEVEL_OFF + default USB_DRIVER_LOG_LEVEL_OFF endchoice # We do this to avoid log loop where logging to USB generates more log messages. config USB_CDC_ACM_RINGBUF_SIZE - default 1024 + default 1024 config LOG_PROCESS_THREAD_STARTUP_DELAY_MS - default 1000 + default 1000 #ZMK_USB_LOGGING endif config ZMK_RTT_LOGGING - bool "Enable RTT logging to help debug" - select LOG - select DEBUG - select ASSERT - select USE_SEGGER_RTT - select CONSOLE - select RTT_CONSOLE + bool "Enable RTT logging to help debug" + select LOG + select DEBUG + select ASSERT + select USE_SEGGER_RTT + select CONSOLE + select RTT_CONSOLE if ZMK_RTT_LOGGING config SEGGER_RTT_BUFFER_SIZE_UP - default 8192 + default 8192 #ZMK_RTT_LOGGING endif @@ -463,10 +463,10 @@ endif if ZMK_USB_LOGGING || ZMK_RTT_LOGGING config LOG_BUFFER_SIZE - default 8192 + default 8192 config LOG_PROCESS_THREAD_SLEEP_MS - default 100 + default 100 #ZMK_USB_LOGGING || ZMK_RTT_LOGGING endif @@ -477,16 +477,16 @@ endmenu if SETTINGS config ZMK_SETTINGS_SAVE_DEBOUNCE - int "Milliseconds to debounce settings saves" - default 60000 + int "Milliseconds to debounce settings saves" + default 60000 #SETTINGS endif config ZMK_BATTERY_REPORT_INTERVAL - depends on ZMK_BLE - int "Battery level report interval in seconds" - default 60 + depends on ZMK_BLE + int "Battery level report interval in seconds" + default 60 #Advanced endmenu @@ -495,26 +495,26 @@ endmenu endmenu config HEAP_MEM_POOL_SIZE - default 8192 + default 8192 config KERNEL_BIN_NAME - default "zmk" + default "zmk" config REBOOT - default y + default y config USB_DEVICE_STACK - default y if HAS_HW_NRF_USBD + default y if HAS_HW_NRF_USBD config ZMK_WPM - bool "Calculate WPM" - default n + bool "Calculate WPM" + default n config SENSOR - default y + default y choice CBPRINTF_IMPLEMENTATION - default CBPRINTF_NANO + default CBPRINTF_NANO endchoice diff --git a/app/boards/arm/bdn9/Kconfig.board b/app/boards/arm/bdn9/Kconfig.board index a67e9a51..76a204cc 100644 --- a/app/boards/arm/bdn9/Kconfig.board +++ b/app/boards/arm/bdn9/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_BDN9 - bool "BDN9 rev2" - depends on SOC_STM32F072XB + bool "BDN9 rev2" + depends on SOC_STM32F072XB diff --git a/app/boards/arm/bdn9/Kconfig.defconfig b/app/boards/arm/bdn9/Kconfig.defconfig index 17695185..d1c82811 100644 --- a/app/boards/arm/bdn9/Kconfig.defconfig +++ b/app/boards/arm/bdn9/Kconfig.defconfig @@ -6,16 +6,16 @@ if BOARD_BDN9 config BOARD - default "bdn9_rev2" + default "bdn9_rev2" config ZMK_KEYBOARD_NAME - default "BDN9 Rev2" + default "BDN9 Rev2" config ZMK_USB - default y + default y config ZMK_RGB_UNDERGLOW - select SPI - select WS2812_STRIP + select SPI + select WS2812_STRIP endif # BOARD_BDN9 diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index e75893d6..d2d1c65c 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -10,134 +10,134 @@ #include / { - model = "Keeb.io BDN9 rev2"; - compatible = "keebio,bdn9", "st,stm32f072"; + model = "Keeb.io BDN9 rev2"; + compatible = "keebio,bdn9", "st,stm32f072"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan; - zmk,underglow = &led_strip; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan; + zmk,underglow = &led_strip; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + kscan: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; - mid_encoder: encoder_mid { - compatible = "alps,ec11"; - label = "MID_ENCODER"; - a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; + mid_encoder: encoder_mid { + compatible = "alps,ec11"; + label = "MID_ENCODER"; + a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - sensors: sensors { - compatible = "zmk,keymap-sensors"; - status = "disabled"; - sensors = <>; - }; + sensors: sensors { + compatible = "zmk,keymap-sensors"; + status = "disabled"; + sensors = <>; + }; }; &spi2 { - status = "okay"; - pinctrl-0 = <&spi2_sck_pb13 &spi2_mosi_pb15>; - pinctrl-names = "default"; + status = "okay"; + pinctrl-0 = <&spi2_sck_pb13 &spi2_mosi_pb15>; + pinctrl-names = "default"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <9>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <9>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; &clk_hsi { - status = "okay"; + status = "okay"; }; &pll { - status = "okay"; - prediv = <1>; - mul = <6>; - clocks = <&clk_hsi>; + status = "okay"; + prediv = <1>; + mul = <6>; + clocks = <&clk_hsi>; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; }; &usb { - status = "okay"; - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 128Kb of flash */ - storage_partition: partition@1e800 { - label = "storage"; - reg = <0x0001e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 128Kb of flash */ + storage_partition: partition@1e800 { + label = "storage"; + reg = <0x0001e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/bdn9/bdn9_rev2.keymap b/app/boards/arm/bdn9/bdn9_rev2.keymap index 50c273c7..1e2c192d 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.keymap +++ b/app/boards/arm/bdn9/bdn9_rev2.keymap @@ -9,8 +9,8 @@ /* Uncomment and keep whatever encoders are on your BDN9 &sensors { - status = "okay"; - sensors = <&left_encoder &mid_encoder &right_encoder>; + status = "okay"; + sensors = <&left_encoder &mid_encoder &right_encoder>; }; */ @@ -20,19 +20,19 @@ // &right_encoder { status = "okay"; }; / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp HOME &kp K_PP &kp END - &kp PG_UP &kp UP &kp PG_DN - &kp LEFT &kp DOWN &kp RIGHT - >; - /* Uncomment and add necessary bindings. This examples is for one encoder - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - */ - }; - }; + default_layer { + bindings = < + &kp HOME &kp K_PP &kp END + &kp PG_UP &kp UP &kp PG_DN + &kp LEFT &kp DOWN &kp RIGHT + >; + /* Uncomment and add necessary bindings. This examples is for one encoder + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + */ + }; + }; }; diff --git a/app/boards/arm/bluemicro840/Kconfig b/app/boards/arm/bluemicro840/Kconfig index 0e6743d3..ca060885 100644 --- a/app/boards/arm/bluemicro840/Kconfig +++ b/app/boards/arm/bluemicro840/Kconfig @@ -1,8 +1,8 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_BLUEMICRO840_V1 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bluemicro840/Kconfig.board b/app/boards/arm/bluemicro840/Kconfig.board index bc271af3..e2794015 100644 --- a/app/boards/arm/bluemicro840/Kconfig.board +++ b/app/boards/arm/bluemicro840/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_BLUEMICRO840_V1 - bool "BlueMicro840_V1" - depends on SOC_NRF52840_QIAA + bool "BlueMicro840_V1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/bluemicro840/Kconfig.defconfig b/app/boards/arm/bluemicro840/Kconfig.defconfig index 5d911ec6..732805ae 100644 --- a/app/boards/arm/bluemicro840/Kconfig.defconfig +++ b/app/boards/arm/bluemicro840/Kconfig.defconfig @@ -6,22 +6,22 @@ if BOARD_BLUEMICRO840_V1 config BOARD - default "bluemicro840_v1" + default "bluemicro840_v1" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi index 53514d64..cdb8fcdd 100644 --- a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 D2 */ - , <1 0 &gpio0 6 0> /* D1 D3*/ - , <2 0 &gpio0 15 0> /* D2 D1*/ - , <3 0 &gpio0 17 0> /* D3 D0*/ - , <4 0 &gpio0 20 0> /* D4/A6 D4*/ - , <5 0 &gpio0 13 0> /* D5 C6*/ - , <6 0 &gpio0 24 0> /* D6/A7 D7*/ - , <7 0 &gpio0 9 0> /* D7 E6*/ - , <8 0 &gpio0 10 0> /* D8/A8 B4*/ - , <9 0 &gpio1 6 0> /* D9/A9 B5*/ - , <10 0 &gpio1 11 0> /* D10/A10 B6*/ - , <16 0 &gpio0 28 0> /* D16 B2*/ - , <14 0 &gpio0 3 0> /* D14 B3*/ - , <15 0 &gpio1 13 0> /* D15 B1*/ - , <18 0 &gpio0 2 0> /* D18/A0 F7*/ - , <19 0 &gpio0 29 0> /* D19/A1 F6*/ - , <20 0 &gpio0 26 0> /* D20/A2 F5*/ - , <21 0 &gpio0 30 0> /* D21/A3 F4*/ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 D2 */ + , <1 0 &gpio0 6 0> /* D1 D3*/ + , <2 0 &gpio0 15 0> /* D2 D1*/ + , <3 0 &gpio0 17 0> /* D3 D0*/ + , <4 0 &gpio0 20 0> /* D4/A6 D4*/ + , <5 0 &gpio0 13 0> /* D5 C6*/ + , <6 0 &gpio0 24 0> /* D6/A7 D7*/ + , <7 0 &gpio0 9 0> /* D7 E6*/ + , <8 0 &gpio0 10 0> /* D8/A8 B4*/ + , <9 0 &gpio1 6 0> /* D9/A9 B5*/ + , <10 0 &gpio1 11 0> /* D10/A10 B6*/ + , <16 0 &gpio0 28 0> /* D16 B2*/ + , <14 0 &gpio0 3 0> /* D14 B3*/ + , <15 0 &gpio1 13 0> /* D15 B1*/ + , <18 0 &gpio0 2 0> /* D18/A0 F7*/ + , <19 0 &gpio0 29 0> /* D19/A1 F6*/ + , <20 0 &gpio0 26 0> /* D20/A2 F5*/ + , <21 0 &gpio0 30 0> /* D21/A3 F4*/ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 F7*/ - , <1 0 &gpio0 29 0> /* D19/A1 F6*/ - , <2 0 &gpio0 26 0> /* D20/A2 F5*/ - , <3 0 &gpio0 30 0> /* D21/A3 F4*/ - , <6 0 &gpio0 20 0> /* D4/A6 D4*/ - , <7 0 &gpio0 24 0> /* D6/A7 D7*/ - , <8 0 &gpio0 10 0> /* D8/A8 B4*/ - , <9 0 &gpio1 6 0> /* D9/A9 B5*/ - , <10 0 &gpio1 11 0> /* D10/A10 B6*/ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 F7*/ + , <1 0 &gpio0 29 0> /* D19/A1 F6*/ + , <2 0 &gpio0 26 0> /* D20/A2 F5*/ + , <3 0 &gpio0 30 0> /* D21/A3 F4*/ + , <6 0 &gpio0 20 0> /* D4/A6 D4*/ + , <7 0 &gpio0 24 0> /* D6/A7 D7*/ + , <8 0 &gpio0 10 0> /* D8/A8 B4*/ + , <9 0 &gpio1 6 0> /* D9/A9 B5*/ + , <10 0 &gpio1 11 0> /* D10/A10 B6*/ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi index 18b90f21..15c48509 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index c636ca31..f1952601 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -10,117 +10,117 @@ #include "bluemicro840_v1-pinctrl.dtsi" / { - model = "BlueMicro840_V1"; - compatible = "bluemicro840,v1"; + model = "BlueMicro840_V1"; + compatible = "bluemicro840,v1"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - init-delay-ms = <20>; - control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + init-delay-ms = <20>; + control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 7>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/bt60/Kconfig b/app/boards/arm/bt60/Kconfig index 359e237d..d57a6b7e 100644 --- a/app/boards/arm/bt60/Kconfig +++ b/app/boards/arm/bt60/Kconfig @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_BT60_V1_HS || BOARD_BT60_V1) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_BT60_V1_HS || BOARD_BT60_V1) diff --git a/app/boards/arm/bt60/Kconfig.board b/app/boards/arm/bt60/Kconfig.board index 0f0a9c6e..24c0a8b5 100644 --- a/app/boards/arm/bt60/Kconfig.board +++ b/app/boards/arm/bt60/Kconfig.board @@ -4,9 +4,9 @@ # SPDX-License-Identifier: MIT config BOARD_BT60_V1 - bool "bt60" - depends on SOC_NRF52840_QIAA + bool "bt60" + depends on SOC_NRF52840_QIAA config BOARD_BT60_V1_HS - bool "bt60 hotswap" - depends on SOC_NRF52840_QIAA + bool "bt60 hotswap" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/bt60/Kconfig.defconfig b/app/boards/arm/bt60/Kconfig.defconfig index bad1e7cd..e7cf1a48 100644 --- a/app/boards/arm/bt60/Kconfig.defconfig +++ b/app/boards/arm/bt60/Kconfig.defconfig @@ -4,28 +4,28 @@ if BOARD_BT60_V1_HS || BOARD_BT60_V1 config BOARD - default "bt60" + default "bt60" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config ZMK_KEYBOARD_NAME - default "BT60" + default "BT60" endif # BOARD_BT60 diff --git a/app/boards/arm/bt60/bt60.dtsi b/app/boards/arm/bt60/bt60.dtsi index 3858ba46..6e4900af 100644 --- a/app/boards/arm/bt60/bt60.dtsi +++ b/app/boards/arm/bt60/bt60.dtsi @@ -9,126 +9,126 @@ #include / { - model = "BT60"; - compatible = "polarityworks,bt60"; + model = "BT60"; + compatible = "polarityworks,bt60"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "okay"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + compatible = "nordic,nrf-twi"; + sda-pin = <17>; + scl-pin = <20>; }; &uart0 { - compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1.dts b/app/boards/arm/bt60/bt60_v1.dts index 8b2f0cb4..0cfe184a 100644 --- a/app/boards/arm/bt60/bt60_v1.dts +++ b/app/boards/arm/bt60/bt60_v1.dts @@ -9,105 +9,105 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &ansi_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &ansi_transform; + }; - ansi_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) - >; - }; + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + >; + }; - hhkb_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + hhkb_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - iso_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + iso_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - all_1u_transform: keymap_transform_3 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) - >; - }; + all_1u_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + >; + }; - split_transform: keymap_transform_4 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + split_transform: keymap_transform_4 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&gpio1 13 GPIO_ACTIVE_HIGH> - , <&gpio1 10 GPIO_ACTIVE_HIGH> - , <&gpio1 11 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1.keymap b/app/boards/arm/bt60/bt60_v1.keymap index b42f3f3d..25ae269d 100644 --- a/app/boards/arm/bt60/bt60_v1.keymap +++ b/app/boards/arm/bt60/bt60_v1.keymap @@ -11,170 +11,170 @@ / { - chosen { - #ifdef ANSI - zmk,matrix_transform = &ansi_transform; - #elif defined(HHKB) - zmk,matrix_transform = &hhkb_transform; - #elif defined(ISO) - zmk,matrix_transform = &iso_transform; - #elif defined(ALL_1U) - zmk,matrix_transform = &all_1u_transform; - #else - zmk,matrix_transform = &split_transform; - #endif - }; + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #else + zmk,matrix_transform = &split_transform; + #endif + }; - keymap { - compatible = "zmk,keymap"; - #ifdef ANSI - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - // ------------------------------------------------------------------------------------------ - // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | - // | TAB | Q | UP | E | R | T | Y | U | INS | O |PSCRN|SLCK |PSEBRK| RESET | - // | CAPS |LEFT |DOWN |RIGHT| F | G | H | J | K | L |HOME |PGUP | BOOTLOADER | - // | PREV |VOLUP |VOLDN|MUTE | V | B | N | M | , | END | PGDN | NEXT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | BT_CLR | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(HHKB) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | BSPC | - // | CTRL | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | - // | CAPS | ALT | WIN | SPACE | WIN | ALT | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSPC - &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 - &kp LCTRL &kp LALT &kp LGUI &kp SPACE &kp RGUI &kp RALT &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL - &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset - &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans - &trans &trans &trans &bootloader &trans &trans &trans - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(ISO) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | - // | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET - &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(ALL_1U) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | - // | CTL | WIN | ALT | SPACE | ALT | CTRL | LEFT | DOWN | RIGHT | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #else - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP| DEL | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | - // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &kp C_MENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #endif - }; + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | R | T | Y | U | INS | O |PSCRN|SLCK |PSEBRK| RESET | + // | CAPS |LEFT |DOWN |RIGHT| F | G | H | J | K | L |HOME |PGUP | BOOTLOADER | + // | PREV |VOLUP |VOLDN|MUTE | V | B | N | M | , | END | PGDN | NEXT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | BSPC | + // | CTRL | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | + // | CAPS | ALT | WIN | SPACE | WIN | ALT | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSPC + &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 + &kp LCTRL &kp LALT &kp LGUI &kp SPACE &kp RGUI &kp RALT &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL + &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans + &trans &trans &trans &bootloader &trans &trans &trans + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | + // | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | + // | CTL | WIN | ALT | SPACE | ALT | CTRL | LEFT | DOWN | RIGHT | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP| DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &kp C_MENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #endif + }; }; diff --git a/app/boards/arm/bt60/bt60_v1_hs.dts b/app/boards/arm/bt60/bt60_v1_hs.dts index 0e686fd9..b24dee1e 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.dts +++ b/app/boards/arm/bt60/bt60_v1_hs.dts @@ -9,53 +9,53 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(2,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(2,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) + >; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&gpio1 11 GPIO_ACTIVE_HIGH> - , <&gpio1 10 GPIO_ACTIVE_HIGH> - , <&gpio1 13 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 23 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 23 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1_hs.keymap b/app/boards/arm/bt60/bt60_v1_hs.keymap index 167460c6..6c26756e 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.keymap +++ b/app/boards/arm/bt60/bt60_v1_hs.keymap @@ -3,35 +3,35 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &bt BT_CLR - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &bt BT_CLR + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board index 33baa110..ca82e330 100644 --- a/app/boards/arm/corneish_zen/Kconfig.board +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -4,9 +4,9 @@ # config BOARD_CORNEISH_ZEN_V2_LEFT - bool "corneish zen left v2" - depends on SOC_NRF52840_QIAA + bool "corneish zen left v2" + depends on SOC_NRF52840_QIAA config BOARD_CORNEISH_ZEN_V2_RIGHT - bool "corneish zen right v2" - depends on SOC_NRF52840_QIAA \ No newline at end of file + bool "corneish zen right v2" + depends on SOC_NRF52840_QIAA \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index 33ce1256..a161230c 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -6,10 +6,10 @@ if BOARD_CORNEISH_ZEN_V2_LEFT config ZMK_KEYBOARD_NAME - default "Corne-ish Zen" + default "Corne-ish Zen" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # BOARD_CORNEISH_ZEN_V2_LEFT @@ -17,65 +17,65 @@ endif # BOARD_CORNEISH_ZEN_V2_LEFT if BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT config BOARD - default "corneish_zen" + default "corneish_zen" config ZMK_SPLIT - default y + default y config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config ZMK_DISPLAY - select LV_USE_CONT - select LV_FONT_MONTSERRAT_26 - select LV_FONT_MONTSERRAT_20 - select LV_FONT_MONTSERRAT_16 - select LV_USE_LABEL - select LV_USE_IMG + select LV_USE_CONT + select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_20 + select LV_FONT_MONTSERRAT_16 + select LV_USE_LABEL + select LV_USE_IMG choice ZMK_DISPLAY_STATUS_SCREEN - default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM + default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM endchoice if ZMK_DISPLAY config SPI - default y + default y config IL0323 - default y + default y config ZMK_DISPLAY_BLANK_ON_IDLE - default n + default n endif # ZMK_DISPLAY menuconfig CUSTOM_WIDGET_BATTERY_STATUS - bool "custom battery status widget" + bool "custom battery status widget" menuconfig CUSTOM_WIDGET_OUTPUT_STATUS - bool "custom output status widget" + bool "custom output status widget" menuconfig CUSTOM_WIDGET_LAYER_STATUS - bool "custom layer status widget" + bool "custom layer status widget" menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS - bool "custom peripheral status widget" + bool "custom peripheral status widget" endif # BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index f203c9f8..10be54cc 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -11,116 +11,116 @@ #include / { - model = "corneish_zen_v2"; - compatible = "corneish_zen_v2"; + model = "corneish_zen_v2"; + compatible = "corneish_zen_v2"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zmk,kscan = &kscan0; - zmk,display = &epd; - zmk,battery = &vbatt; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,display = &epd; + zmk,battery = &vbatt; + zephyr,console = &cdc_acm_uart; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; - // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | - // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | - // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | - // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | + // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | + // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; - // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | - // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | - // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | - // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) - RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) - RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | + // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | + // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) + RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) + RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap index 72d0b8f1..2b9eeb14 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.keymap +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -45,7 +45,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -60,7 +60,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 65092dc5..9f3dd73a 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -8,90 +8,90 @@ #include "corneish_zen.dtsi" /{ - chosen { - zephyr,display = &epd; - zmk,battery = &vbatt; - }; + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1960000>; - full-ohms = <(1960000 + 810000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; }; &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; &spi0 { - status = "okay"; - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; - epd: il0323@0 { - compatible = "gooddisplay,il0323"; - reg = <0>; - label = "DISPLAY"; - width = <80>; - height = <128>; - spi-max-frequency = <4000000>; - dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; - busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; - pwr = [03 00 26 26]; - cdi = <0xd2>; - tcon = <0x22>; - }; + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 980c9900..3cb7556f 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -8,98 +8,98 @@ #include "corneish_zen.dtsi" /{ - chosen { - zephyr,display = &epd; - zmk,battery = &vbatt; - }; + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&gpio0 19 GPIO_ACTIVE_HIGH> - , <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + ; - }; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1960000>; - full-ohms = <(1960000 + 810000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; &spi0 { - status = "okay"; - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; - epd: il0323@0 { - compatible = "gooddisplay,il0323"; - reg = <0>; - label = "DISPLAY"; - width = <80>; - height = <128>; - spi-max-frequency = <4000000>; - dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; - busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; - pwr = [03 00 26 26]; - //softstart = [17 17 17 17]; - cdi = <0xd2>; - tcon = <0x22>; - }; + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + //softstart = [17 17 17 17]; + cdi = <0xd2>; + tcon = <0x22>; + }; }; diff --git a/app/boards/arm/dz60rgb/Kconfig.board b/app/boards/arm/dz60rgb/Kconfig.board index ec8dad68..ba09e2dd 100644 --- a/app/boards/arm/dz60rgb/Kconfig.board +++ b/app/boards/arm/dz60rgb/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_DZ60RGB_REV1 - bool "DZ60RGB Keyboard" - depends on SOC_STM32F303XC + bool "DZ60RGB Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/dz60rgb/Kconfig.defconfig b/app/boards/arm/dz60rgb/Kconfig.defconfig index 779d3123..2e30e3d0 100644 --- a/app/boards/arm/dz60rgb/Kconfig.defconfig +++ b/app/boards/arm/dz60rgb/Kconfig.defconfig @@ -6,9 +6,9 @@ if BOARD_DZ60RGB_REV1 config ZMK_KEYBOARD_NAME - default "DZ60RGB Rev 1" + default "DZ60RGB Rev 1" config ZMK_USB - default y + default y endif # BOARD_DZ60RGB_REV1 diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts index e2730d21..14be837d 100644 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts @@ -10,84 +10,84 @@ #include / { - model = "DZ60RGB, Rev 1"; - compatible = "dz60rgb,rev1", "st,stm32f303"; + model = "DZ60RGB, Rev 1"; + compatible = "dz60rgb,rev1", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpioa 6 GPIO_ACTIVE_HIGH> - , <&gpioa 7 GPIO_ACTIVE_HIGH> - , <&gpiob 0 GPIO_ACTIVE_HIGH> - , <&gpiob 13 GPIO_ACTIVE_HIGH> - , <&gpiob 15 GPIO_ACTIVE_HIGH> - , <&gpioa 8 GPIO_ACTIVE_HIGH> - , <&gpioa 15 GPIO_ACTIVE_HIGH> - , <&gpiob 3 GPIO_ACTIVE_HIGH> - , <&gpiob 4 GPIO_ACTIVE_HIGH> - , <&gpiob 5 GPIO_ACTIVE_HIGH> - , <&gpiob 8 GPIO_ACTIVE_HIGH> - , <&gpiob 9 GPIO_ACTIVE_HIGH> - , <&gpioc 13 GPIO_ACTIVE_HIGH> - , <&gpioc 14 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpioa 6 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + , <&gpiob 13 GPIO_ACTIVE_HIGH> + , <&gpiob 15 GPIO_ACTIVE_HIGH> + , <&gpioa 8 GPIO_ACTIVE_HIGH> + , <&gpioa 15 GPIO_ACTIVE_HIGH> + , <&gpiob 3 GPIO_ACTIVE_HIGH> + , <&gpiob 4 GPIO_ACTIVE_HIGH> + , <&gpiob 5 GPIO_ACTIVE_HIGH> + , <&gpiob 8 GPIO_ACTIVE_HIGH> + , <&gpiob 9 GPIO_ACTIVE_HIGH> + , <&gpioc 13 GPIO_ACTIVE_HIGH> + , <&gpioc 14 GPIO_ACTIVE_HIGH> + ; + }; }; &usb { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap b/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap index f95fce0e..e8cc6a7a 100644 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap @@ -2,10 +2,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | @@ -13,13 +13,13 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | SHIFT(/) | ^ | DEL | // | CTL | WIN | ALT | SPACE | ALT | MO(1) | <- | v | -> | // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH &kp UP &kp DEL - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp LEFT &kp DOWN &kp RIGHT - >; - }; - }; + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH &kp UP &kp DEL + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp LEFT &kp DOWN &kp RIGHT + >; + }; + }; }; \ No newline at end of file diff --git a/app/boards/arm/ferris/Kconfig.board b/app/boards/arm/ferris/Kconfig.board index ad96271a..70ee895d 100644 --- a/app/boards/arm/ferris/Kconfig.board +++ b/app/boards/arm/ferris/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_FERRIS - bool "Ferris rev 0.2" - depends on SOC_STM32F072XB + bool "Ferris rev 0.2" + depends on SOC_STM32F072XB diff --git a/app/boards/arm/ferris/Kconfig.defconfig b/app/boards/arm/ferris/Kconfig.defconfig index c59cb902..7cf43bcb 100644 --- a/app/boards/arm/ferris/Kconfig.defconfig +++ b/app/boards/arm/ferris/Kconfig.defconfig @@ -6,15 +6,15 @@ if BOARD_FERRIS config BOARD - default "ferris_rev02" + default "ferris_rev02" config ZMK_KEYBOARD_NAME - default "Ferris rev 0.2" + default "Ferris rev 0.2" config ZMK_USB - default y + default y config ZMK_KSCAN_MATRIX_POLLING - default y + default y endif # BOARD_FERRIS diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index 55055e9a..618a5591 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -11,153 +11,153 @@ #include / { - model = "Ferris rev0.2"; - compatible = "ferris,rev02", "st,stm32f072"; + model = "Ferris rev0.2"; + compatible = "ferris,rev02", "st,stm32f072"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan; - zmk,matrix_transform = &transform; - /* TODO: Enable once we support the IC for underglow - zmk,underglow = &led_strip; - */ - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan; + zmk,matrix_transform = &transform; + /* TODO: Enable once we support the IC for underglow + zmk,underglow = &led_strip; + */ + }; - transform: transform { - compatible = "zmk,matrix-transform"; - rows = <4>; - columns = <10>; + transform: transform { + compatible = "zmk,matrix-transform"; + rows = <4>; + columns = <10>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) - >; - }; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) + >; + }; - kscan: kscan { - compatible = "zmk,kscan-composite"; - label = "KSCAN"; - rows = <4>; - columns = <10>; + kscan: kscan { + compatible = "zmk,kscan-composite"; + label = "KSCAN"; + rows = <4>; + columns = <10>; - left { - kscan = <&kscan_left>; - }; + left { + kscan = <&kscan_left>; + }; - right { - kscan = <&kscan_right>; - column-offset = <5>; - }; - }; + right { + kscan = <&kscan_right>; + column-offset = <5>; + }; + }; - kscan_left: kscan_left { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_LEFT"; + kscan_left: kscan_left { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN_LEFT"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&gpiob 8 (GPIO_ACTIVE_HIGH)> - , <&gpiob 4 (GPIO_ACTIVE_HIGH)> - , <&gpiob 3 (GPIO_ACTIVE_HIGH)> - , <&gpioa 15 (GPIO_ACTIVE_HIGH)> - , <&gpioa 14 (GPIO_ACTIVE_HIGH)> - ; - row-gpios - = <&gpiob 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + col-gpios + = <&gpiob 8 (GPIO_ACTIVE_HIGH)> + , <&gpiob 4 (GPIO_ACTIVE_HIGH)> + , <&gpiob 3 (GPIO_ACTIVE_HIGH)> + , <&gpioa 15 (GPIO_ACTIVE_HIGH)> + , <&gpioa 14 (GPIO_ACTIVE_HIGH)> + ; + row-gpios + = <&gpiob 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - kscan_right: kscan_right { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_RIGHT"; + kscan_right: kscan_right { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN_RIGHT"; - diode-direction = "row2col"; + diode-direction = "row2col"; - col-gpios - = <&right_io 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - row-gpios - = <&right_io 8 (GPIO_ACTIVE_LOW)> - , <&right_io 9 (GPIO_ACTIVE_LOW)> - , <&right_io 10 (GPIO_ACTIVE_LOW)> - , <&right_io 11 (GPIO_ACTIVE_LOW)> - ; - }; + col-gpios + = <&right_io 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + row-gpios + = <&right_io 8 (GPIO_ACTIVE_LOW)> + , <&right_io 9 (GPIO_ACTIVE_LOW)> + , <&right_io 10 (GPIO_ACTIVE_LOW)> + , <&right_io 11 (GPIO_ACTIVE_LOW)> + ; + }; }; &i2c2 { - pinctrl-0 = <&i2c2_scl_pb10 &i2c2_sda_pb11>; - pinctrl-names = "default"; - status = "okay"; - clock-frequency = ; + pinctrl-0 = <&i2c2_scl_pb10 &i2c2_sda_pb11>; + pinctrl-names = "default"; + status = "okay"; + clock-frequency = ; - right_io: mcp23017@20 { - compatible = "microchip,mcp230xx"; - status = "okay"; - gpio-controller; - reg = <0x20>; - #gpio-cells = <2>; - ngpios = <16>; - }; + right_io: mcp23017@20 { + compatible = "microchip,mcp230xx"; + status = "okay"; + gpio-controller; + reg = <0x20>; + #gpio-cells = <2>; + ngpios = <16>; + }; }; &usb { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hsi { - status = "okay"; + status = "okay"; }; &pll { - prediv = <1>; - mul = <6>; - clocks = <&clk_hsi>; - status = "okay"; + prediv = <1>; + mul = <6>; + clocks = <&clk_hsi>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http: //docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http: //docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 128Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0001e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 128Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0001e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/mikoto/Kconfig b/app/boards/arm/mikoto/Kconfig index 646d119c..71ec9411 100644 --- a/app/boards/arm/mikoto/Kconfig +++ b/app/boards/arm/mikoto/Kconfig @@ -1,12 +1,12 @@ config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_MIKOTO_520) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_MIKOTO_520) choice BOARD_MIKOTO_CHARGER_CURRENT prompt "Charge current to supply to attached batteries" - depends on (BOARD_MIKOTO_520) + depends on (BOARD_MIKOTO_520) config BOARD_MIKOTO_CHARGER_CURRENT_40MA bool "40mA charge current, for battery capacity 40mAh or higher" diff --git a/app/boards/arm/mikoto/Kconfig.board b/app/boards/arm/mikoto/Kconfig.board index 067c2fbe..a872fa1f 100644 --- a/app/boards/arm/mikoto/Kconfig.board +++ b/app/boards/arm/mikoto/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_MIKOTO_520 - bool "mikoto_520" - depends on SOC_NRF52840_QIAA + bool "mikoto_520" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/mikoto/Kconfig.defconfig b/app/boards/arm/mikoto/Kconfig.defconfig index 6aafc613..8c7746db 100644 --- a/app/boards/arm/mikoto/Kconfig.defconfig +++ b/app/boards/arm/mikoto/Kconfig.defconfig @@ -6,29 +6,29 @@ if BOARD_MIKOTO_520 config BOARD - default "mikoto" + default "mikoto" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y choice BOARD_MIKOTO_CHARGER_CURRENT default BOARD_MIKOTO_CHARGER_CURRENT_100MA diff --git a/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi b/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi index 7c5cd12f..ed6097ec 100644 --- a/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 4 0> /* D0 */ - , <1 0 &gpio0 8 0> /* D1 */ - , <2 0 &gpio0 17 0> /* D2 */ - , <3 0 &gpio0 20 0> /* D3 */ - , <4 0 &gpio0 22 0> /* D4/A6 */ - , <5 0 &gpio0 24 0> /* D5 */ - , <6 0 &gpio1 0 0> /* D6/A7 */ - , <7 0 &gpio1 2 0> /* D7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio1 13 0> /* D14 */ - , <15 0 &gpio0 2 0> /* D15 */ - , <18 0 &gpio0 29 0> /* D18/A0 */ - , <19 0 &gpio0 31 0> /* D19/A1 */ - , <20 0 &gpio0 25 0> /* D20/A2 */ - , <21 0 &gpio0 11 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 4 0> /* D0 */ + , <1 0 &gpio0 8 0> /* D1 */ + , <2 0 &gpio0 17 0> /* D2 */ + , <3 0 &gpio0 20 0> /* D3 */ + , <4 0 &gpio0 22 0> /* D4/A6 */ + , <5 0 &gpio0 24 0> /* D5 */ + , <6 0 &gpio1 0 0> /* D6/A7 */ + , <7 0 &gpio1 2 0> /* D7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio1 13 0> /* D14 */ + , <15 0 &gpio0 2 0> /* D15 */ + , <18 0 &gpio0 29 0> /* D18/A0 */ + , <19 0 &gpio0 31 0> /* D19/A1 */ + , <20 0 &gpio0 25 0> /* D20/A2 */ + , <21 0 &gpio0 11 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 29 0> /* D18/A0 */ - , <1 0 &gpio0 31 0> /* D19/A1 */ - , <2 0 &gpio0 25 0> /* D20/A2 */ - , <3 0 &gpio0 11 0> /* D21/A3 */ - , <6 0 &gpio0 22 0> /* D4/A6 */ - , <7 0 &gpio1 0 0> /* D6/A7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 29 0> /* D18/A0 */ + , <1 0 &gpio0 31 0> /* D19/A1 */ + , <2 0 &gpio0 25 0> /* D20/A2 */ + , <3 0 &gpio0 11 0> /* D21/A3 */ + , <6 0 &gpio0 22 0> /* D4/A6 */ + , <7 0 &gpio1 0 0> /* D6/A7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi index 4a8ff82c..df43c407 100644 --- a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi +++ b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index 3fff0835..f8007033 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -10,117 +10,117 @@ #include "mikoto_520-pinctrl.dtsi" / { - model = "mikoto"; - compatible = "zhiayang,mikoto"; + model = "mikoto"; + compatible = "zhiayang,mikoto"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + init-delay-ms = <50>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 1>; - output-ohms = <10000000>; - full-ohms = <(10000000 + 4000000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 1>; + output-ohms = <10000000>; + full-ohms = <(10000000 + 4000000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - current-speed = <115200>; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice60/Kconfig b/app/boards/arm/nice60/Kconfig index db7cf398..dfca4f1b 100644 --- a/app/boards/arm/nice60/Kconfig +++ b/app/boards/arm/nice60/Kconfig @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_NICE60 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_NICE60 diff --git a/app/boards/arm/nice60/Kconfig.board b/app/boards/arm/nice60/Kconfig.board index 778f79eb..88db9ee8 100644 --- a/app/boards/arm/nice60/Kconfig.board +++ b/app/boards/arm/nice60/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_NICE60 - bool "nice!60" - depends on SOC_NRF52840_QIAA + bool "nice!60" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nice60/Kconfig.defconfig b/app/boards/arm/nice60/Kconfig.defconfig index 39cf1540..f3347df9 100644 --- a/app/boards/arm/nice60/Kconfig.defconfig +++ b/app/boards/arm/nice60/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NICE60 config ZMK_KEYBOARD_NAME - default "nice!60" + default "nice!60" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NICE60 diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi index ace80f10..9b0e198d 100644 --- a/app/boards/arm/nice60/nice60-pinctrl.dtsi +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -4,9 +4,9 @@ */ &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; }; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index fdc65d6b..651dd555 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -13,170 +13,170 @@ #include "nice60-pinctrl.dtsi" / { - model = "nice!60"; - compatible = "nice,60"; + model = "nice!60"; + compatible = "nice,60"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - zmk,underglow = &led_strip; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + zmk,underglow = &led_strip; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,9) RC(4,10) RC(4,11) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio1 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio1 3 GPIO_ACTIVE_HIGH> - , <&gpio1 7 GPIO_ACTIVE_HIGH> - , <&gpio1 4 GPIO_ACTIVE_HIGH> - , <&gpio1 6 GPIO_ACTIVE_HIGH> - , <&gpio1 5 GPIO_ACTIVE_HIGH> - , <&gpio1 1 GPIO_ACTIVE_HIGH> - , <&gpio1 2 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio1 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio1 3 GPIO_ACTIVE_HIGH> + , <&gpio1 7 GPIO_ACTIVE_HIGH> + , <&gpio1 4 GPIO_ACTIVE_HIGH> + , <&gpio1 6 GPIO_ACTIVE_HIGH> + , <&gpio1 5 GPIO_ACTIVE_HIGH> + , <&gpio1 1 GPIO_ACTIVE_HIGH> + , <&gpio1 2 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &spi3 { - compatible = "nordic,nrf-spim"; + compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi3_default>; - pinctrl-names = "default"; - status = "okay"; + pinctrl-0 = <&spi3_default>; + pinctrl-names = "default"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <12>; /* LED strip length */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <12>; /* LED strip length */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "mbr"; - reg = <0x00000000 0x00001000>; - }; + sd_partition: partition@0 { + label = "mbr"; + reg = <0x00000000 0x00001000>; + }; - code_partition: partition@1000 { - label = "code_partition"; - reg = <0x00001000 0x000d3000>; - }; + code_partition: partition@1000 { + label = "code_partition"; + reg = <0x00001000 0x000d3000>; + }; - /* - * The flash starting at 0x000d4000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000d4000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@d4000 { - label = "storage"; - reg = <0x000d4000 0x00020000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@d4000 { + label = "storage"; + reg = <0x000d4000 0x00020000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice60/nice60.keymap b/app/boards/arm/nice60/nice60.keymap index edfec32e..3a357163 100644 --- a/app/boards/arm/nice60/nice60.keymap +++ b/app/boards/arm/nice60/nice60.keymap @@ -10,10 +10,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | @@ -21,16 +21,16 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | CTL | WIN | ALT | SPACE | ALT | WIN | MO(1) | CTL | // ------------------------------------------------------------------------------------------ - bindings = < - &gresc &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &mo 1 &kp RCTRL - >; - }; + bindings = < + &gresc &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &mo 1 &kp RCTRL + >; + }; - rgb_layer { + rgb_layer { // ------------------------------------------------------------------------------------------------ // | BT CLR | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | EFFECT REV | // | BT 1 | | UP | | HUEUP | SATUP | BRIUP | SPDUP | | | | | | | @@ -38,13 +38,13 @@ // | BT 3 | | | | | | | | | | | | // | BT 4 | | | TOG RGB | PRT SCR | | | DEL | // ------------------------------------------------------------------------------------------------ - bindings = < - &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR - &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans - &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF - &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL - >; - }; - }; + bindings = < + &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR + &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans + &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF + &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL + >; + }; + }; }; diff --git a/app/boards/arm/nice_nano/Kconfig b/app/boards/arm/nice_nano/Kconfig index 0c9fbc79..ac6828a4 100644 --- a/app/boards/arm/nice_nano/Kconfig +++ b/app/boards/arm/nice_nano/Kconfig @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_NICE_NANO || BOARD_NICE_NANO_V2) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_NICE_NANO || BOARD_NICE_NANO_V2) diff --git a/app/boards/arm/nice_nano/Kconfig.board b/app/boards/arm/nice_nano/Kconfig.board index 4a80b448..8dd16512 100644 --- a/app/boards/arm/nice_nano/Kconfig.board +++ b/app/boards/arm/nice_nano/Kconfig.board @@ -4,10 +4,10 @@ # SPDX-License-Identifier: MIT config BOARD_NICE_NANO - bool "nice!nano" - depends on SOC_NRF52840_QIAA + bool "nice!nano" + depends on SOC_NRF52840_QIAA config BOARD_NICE_NANO_V2 - bool "nice!nano v2" - depends on SOC_NRF52840_QIAA + bool "nice!nano v2" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nice_nano/Kconfig.defconfig b/app/boards/arm/nice_nano/Kconfig.defconfig index ad3fefef..ada59dd9 100644 --- a/app/boards/arm/nice_nano/Kconfig.defconfig +++ b/app/boards/arm/nice_nano/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NICE_NANO || BOARD_NICE_NANO_V2 config BOARD - default "nice_nano" + default "nice_nano" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NICE_NANO || BOARD_NICE_NANO_V2 diff --git a/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi b/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi index b972451b..f1b569c0 100644 --- a/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 17 0> /* D2 */ - , <3 0 &gpio0 20 0> /* D3 */ - , <4 0 &gpio0 22 0> /* D4/A6 */ - , <5 0 &gpio0 24 0> /* D5 */ - , <6 0 &gpio1 0 0> /* D6/A7 */ - , <7 0 &gpio0 11 0> /* D7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio1 11 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio1 15 0> /* D18/A0 */ - , <19 0 &gpio0 2 0> /* D19/A1 */ - , <20 0 &gpio0 29 0> /* D20/A2 */ - , <21 0 &gpio0 31 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 17 0> /* D2 */ + , <3 0 &gpio0 20 0> /* D3 */ + , <4 0 &gpio0 22 0> /* D4/A6 */ + , <5 0 &gpio0 24 0> /* D5 */ + , <6 0 &gpio1 0 0> /* D6/A7 */ + , <7 0 &gpio0 11 0> /* D7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio1 11 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio1 15 0> /* D18/A0 */ + , <19 0 &gpio0 2 0> /* D19/A1 */ + , <20 0 &gpio0 29 0> /* D20/A2 */ + , <21 0 &gpio0 31 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio1 15 0> /* D18/A0 */ - , <1 0 &gpio0 2 0> /* D19/A1 */ - , <2 0 &gpio0 29 0> /* D20/A2 */ - , <3 0 &gpio0 31 0> /* D21/A3 */ - , <6 0 &gpio0 22 0> /* D4/A6 */ - , <7 0 &gpio1 0 0> /* D6/A7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio1 15 0> /* D18/A0 */ + , <1 0 &gpio0 2 0> /* D19/A1 */ + , <2 0 &gpio0 29 0> /* D20/A2 */ + , <3 0 &gpio0 31 0> /* D21/A3 */ + , <6 0 &gpio0 22 0> /* D4/A6 */ + , <7 0 &gpio1 0 0> /* D6/A7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi index 18b90f21..15c48509 100644 --- a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi +++ b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano.dts b/app/boards/arm/nice_nano/nice_nano.dts index e29df205..4ee0df7f 100644 --- a/app/boards/arm/nice_nano/nice_nano.dts +++ b/app/boards/arm/nice_nano/nice_nano.dts @@ -8,21 +8,21 @@ #include "nice_nano.dtsi" / { - chosen { - zmk,battery = &vbatt; - }; + chosen { + zmk,battery = &vbatt; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/arm/nice_nano/nice_nano.dtsi index ad5ef278..0c0a3823 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -9,101 +9,101 @@ #include "arduino_pro_micro_pins.dtsi" / { - model = "nice!nano"; - compatible = "nice,nano"; + model = "nice!nano"; + compatible = "nice,nano"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - current-speed = <115200>; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano_v2.dts b/app/boards/arm/nice_nano/nice_nano_v2.dts index ed2b35f4..b2fbcc81 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2.dts +++ b/app/boards/arm/nice_nano/nice_nano_v2.dts @@ -8,19 +8,19 @@ #include "nice_nano.dtsi" / { - chosen { - zmk,battery = &vbatt; - }; + chosen { + zmk,battery = &vbatt; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + init-delay-ms = <50>; + }; - vbatt: vbatt { - compatible = "zmk,battery-nrf-vddh"; - label = "BATTERY"; - }; + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY"; + }; }; diff --git a/app/boards/arm/nrf52840_m2/Kconfig b/app/boards/arm/nrf52840_m2/Kconfig index c7edeb8d..c9cb6523 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_NRF52840_M2 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_NRF52840_M2 diff --git a/app/boards/arm/nrf52840_m2/Kconfig.board b/app/boards/arm/nrf52840_m2/Kconfig.board index 49901039..b2927ff2 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.board +++ b/app/boards/arm/nrf52840_m2/Kconfig.board @@ -4,6 +4,6 @@ # SPDX-License-Identifier: MIT config BOARD_NRF52840_M2 - bool "nrf52480_m2" - depends on SOC_NRF52840_QIAA + bool "nrf52480_m2" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nrf52840_m2/Kconfig.defconfig b/app/boards/arm/nrf52840_m2/Kconfig.defconfig index 4e1679ba..50a049bb 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.defconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NRF52840_M2 config BOARD - default "nrf52480_m2" + default "nrf52480_m2" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NRF52840_M2 diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts index dc22c40b..253e6b77 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -8,105 +8,105 @@ #include / { - model = "Makerdiary nRF52840 M.2 module"; - compatible = "makerdiary,nrf52840_m2"; + model = "Makerdiary nRF52840 M.2 module"; + compatible = "makerdiary,nrf52840_m2"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - red_led: led_0 { - gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; - label = "Red LED"; - }; - green_led: led_1 { - gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>; - label = "Green LED"; - }; - blue_led: led_2 { - gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + red_led: led_0 { + gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; + label = "Red LED"; + }; + green_led: led_1 { + gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>; + label = "Green LED"; + }; + blue_led: led_2 { + gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1000000>; - full-ohms = <(1000000 + 1000000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1000000>; + full-ohms = <(1000000 + 1000000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - compatible = "nordic,nrf-usbd"; - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + compatible = "nordic,nrf-usbd"; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/Kconfig b/app/boards/arm/nrfmicro/Kconfig index 12b06621..233ddbad 100644 --- a/app/boards/arm/nrfmicro/Kconfig +++ b/app/boards/arm/nrfmicro/Kconfig @@ -1,10 +1,10 @@ config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) config BOARD_NRFMICRO_CHARGER - bool "Enable battery charger" - default y - depends on (BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) + bool "Enable battery charger" + default y + depends on (BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) diff --git a/app/boards/arm/nrfmicro/Kconfig.board b/app/boards/arm/nrfmicro/Kconfig.board index 244242a9..441de5cf 100644 --- a/app/boards/arm/nrfmicro/Kconfig.board +++ b/app/boards/arm/nrfmicro/Kconfig.board @@ -4,17 +4,17 @@ # SPDX-License-Identifier: MIT config BOARD_NRFMICRO_11 - bool "nrfmicro_11" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_11" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_11_FLIPPED - bool "nrfmicro_11_flipped" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_11_flipped" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_13 - bool "nrfmicro_13" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_13" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_13_52833 - bool "nrfmicro_13_52833" - depends on SOC_NRF52833_QIAA + bool "nrfmicro_13_52833" + depends on SOC_NRF52833_QIAA diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig index 751d592b..7d752ac6 100644 --- a/app/boards/arm/nrfmicro/Kconfig.defconfig +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -6,31 +6,31 @@ if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD - default "nrfmicro" + default "nrfmicro" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y -if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 +if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD_NRFMICRO_CHARGER - default y + default y endif # BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi index 537aaed3..01e342c0 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi index 651edb94..76ece25f 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 4 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 5 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 4 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 5 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi index 887a3144..923efbbf 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 30 0> /* D2 */ - , <3 0 &gpio0 31 0> /* D3 */ - , <4 0 &gpio0 29 0> /* D4/A6 */ - , <5 0 &gpio0 2 0> /* D5 */ - , <6 0 &gpio1 13 0> /* D6/A7 */ - , <7 0 &gpio0 3 0> /* D7 */ - , <8 0 &gpio0 28 0> /* D8/A8 */ - , <9 0 &gpio1 11 0> /* D9/A9 */ - , <10 0 &gpio1 6 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio0 9 0> /* D14 */ - , <15 0 &gpio0 24 0> /* D15 */ - , <18 0 &gpio0 13 0> /* D18/A0 */ - , <19 0 &gpio0 20 0> /* D19/A1 */ - , <20 0 &gpio0 17 0> /* D20/A2 */ - , <21 0 &gpio0 15 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 30 0> /* D2 */ + , <3 0 &gpio0 31 0> /* D3 */ + , <4 0 &gpio0 29 0> /* D4/A6 */ + , <5 0 &gpio0 2 0> /* D5 */ + , <6 0 &gpio1 13 0> /* D6/A7 */ + , <7 0 &gpio0 3 0> /* D7 */ + , <8 0 &gpio0 28 0> /* D8/A8 */ + , <9 0 &gpio1 11 0> /* D9/A9 */ + , <10 0 &gpio1 6 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio0 9 0> /* D14 */ + , <15 0 &gpio0 24 0> /* D15 */ + , <18 0 &gpio0 13 0> /* D18/A0 */ + , <19 0 &gpio0 20 0> /* D19/A1 */ + , <20 0 &gpio0 17 0> /* D20/A2 */ + , <21 0 &gpio0 15 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 13 0> /* D18/A0 */ - , <1 0 &gpio0 20 0> /* D19/A1 */ - , <2 0 &gpio0 17 0> /* D20/A2 */ - , <3 0 &gpio0 15 0> /* D21/A3 */ - , <6 0 &gpio0 29 0> /* D4/A6 */ - , <7 0 &gpio1 13 0> /* D6/A7 */ - , <8 0 &gpio0 28 0> /* D8/A8 */ - , <9 0 &gpio1 11 0> /* D9/A9 */ - , <10 0 &gpio1 6 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 13 0> /* D18/A0 */ + , <1 0 &gpio0 20 0> /* D19/A1 */ + , <2 0 &gpio0 17 0> /* D20/A2 */ + , <3 0 &gpio0 15 0> /* D21/A3 */ + , <6 0 &gpio0 29 0> /* D4/A6 */ + , <7 0 &gpio1 13 0> /* D6/A7 */ + , <8 0 &gpio0 28 0> /* D8/A8 */ + , <9 0 &gpio1 11 0> /* D9/A9 */ + , <10 0 &gpio1 6 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi index a54c2598..22bc11d4 100644 --- a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi +++ b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi index a5385690..35a46e5a 100644 --- a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi +++ b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 48186ac9..68331edc 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -10,102 +10,102 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; + }; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index 656873a0..9977617c 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -10,102 +10,102 @@ #include "nrfmicro-flipped-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; + }; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index 9fb68562..300838ff 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -10,115 +10,115 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 9ade364d..86bcb5e5 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -10,115 +10,115 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x00046000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x00046000>; + }; - /* - * The flash starting at 0x0006c000 and ending at - * 0x00073fff is reserved for use by the application. - */ + /* + * The flash starting at 0x0006c000 and ending at + * 0x00073fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@6c000 { - label = "storage"; - reg = <0x0006c000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@6c000 { + label = "storage"; + reg = <0x0006c000 0x00008000>; + }; - boot_partition: partition@74000 { - label = "adafruit_boot"; - reg = <0x00074000 0x0000c000>; - }; - }; + boot_partition: partition@74000 { + label = "adafruit_boot"; + reg = <0x00074000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi index 8751bc4b..8a9e9fc2 100644 --- a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi +++ b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi @@ -4,53 +4,53 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/planck/Kconfig.board b/app/boards/arm/planck/Kconfig.board index fe15e1a9..28b7381f 100644 --- a/app/boards/arm/planck/Kconfig.board +++ b/app/boards/arm/planck/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PLANCK_REV6 - bool "Planck V6 Keyboard" - depends on SOC_STM32F303XC + bool "Planck V6 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/planck/Kconfig.defconfig b/app/boards/arm/planck/Kconfig.defconfig index 913c1c13..d1304da0 100644 --- a/app/boards/arm/planck/Kconfig.defconfig +++ b/app/boards/arm/planck/Kconfig.defconfig @@ -6,10 +6,10 @@ if BOARD_PLANCK_REV6 config ZMK_KEYBOARD_NAME - default "Planck V6" + default "Planck V6" config ZMK_USB - default y + default y config ZMK_KSCAN_MATRIX_POLLING default y diff --git a/app/boards/arm/planck/planck_rev6.dts b/app/boards/arm/planck/planck_rev6.dts index 97239595..5fdd2c21 100644 --- a/app/boards/arm/planck/planck_rev6.dts +++ b/app/boards/arm/planck/planck_rev6.dts @@ -10,123 +10,123 @@ #include / { - model = "Plack PCD, rev6"; - compatible = "planck,rev6", "st,stm32f303"; + model = "Plack PCD, rev6"; + compatible = "planck,rev6", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan0; - zmk,matrix_transform = &layout_grid_transform; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan0; + zmk,matrix_transform = &layout_grid_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; - row-gpios - = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpiob 11 GPIO_ACTIVE_HIGH> - , <&gpiob 10 GPIO_ACTIVE_HIGH> - , <&gpiob 2 GPIO_ACTIVE_HIGH> - , <&gpiob 1 GPIO_ACTIVE_HIGH> - , <&gpioa 7 GPIO_ACTIVE_HIGH> - , <&gpiob 0 GPIO_ACTIVE_HIGH> - ; - }; + row-gpios + = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpiob 11 GPIO_ACTIVE_HIGH> + , <&gpiob 10 GPIO_ACTIVE_HIGH> + , <&gpiob 2 GPIO_ACTIVE_HIGH> + , <&gpiob 1 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + ; + }; layout_grid_transform: - keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,5) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,5) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; layout_mit_transform: - keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; layout_2x2u_transform: - keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,5) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,5) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; }; &usb { - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hse { - status = "okay"; - clock-frequency = ; + status = "okay"; + clock-frequency = ; }; &pll { - prediv = <1>; - mul = <9>; - clocks = <&clk_hse>; - status = "okay"; + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <2>; - apb2-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/planck/planck_rev6.keymap b/app/boards/arm/planck/planck_rev6.keymap index 7e4f6732..65138057 100644 --- a/app/boards/arm/planck/planck_rev6.keymap +++ b/app/boards/arm/planck/planck_rev6.keymap @@ -8,39 +8,39 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ----------------------------------------------------------------------------------------- - // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | - // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET - &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT - >; - }; + default_layer { + // ----------------------------------------------------------------------------------------- + // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + }; - lower { - bindings = < - &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans - &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; - }; + lower { + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; + }; - raise { - bindings = < - &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; - }; - }; + raise { + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; + }; + }; }; diff --git a/app/boards/arm/preonic/Kconfig.board b/app/boards/arm/preonic/Kconfig.board index a930b90f..39f35db6 100644 --- a/app/boards/arm/preonic/Kconfig.board +++ b/app/boards/arm/preonic/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PREONIC_REV3 - bool "Preonic V3 Keyboard" - depends on SOC_STM32F303XC + bool "Preonic V3 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/proton_c/Kconfig.board b/app/boards/arm/proton_c/Kconfig.board index ffa7ffd6..1596077f 100644 --- a/app/boards/arm/proton_c/Kconfig.board +++ b/app/boards/arm/proton_c/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_QMK_PROTON_C - bool "QMK Proton-C" - depends on SOC_STM32F303XC + bool "QMK Proton-C" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/proton_c/Kconfig.defconfig b/app/boards/arm/proton_c/Kconfig.defconfig index 78ccbabd..f5089119 100644 --- a/app/boards/arm/proton_c/Kconfig.defconfig +++ b/app/boards/arm/proton_c/Kconfig.defconfig @@ -6,9 +6,9 @@ if BOARD_QMK_PROTON_C config BOARD - default "proton_c" + default "proton_c" config ZMK_USB - default y + default y endif # BOARD_QMK_PROTON_C diff --git a/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi b/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi index 9a026adf..18311942 100644 --- a/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpioa 10 0> /* D0 */ - , <1 0 &gpioa 9 0> /* D1 */ - , <2 0 &gpiob 7 0> /* D2 */ - , <3 0 &gpiob 6 0> /* D3 */ - , <4 0 &gpiob 5 0> /* D4/A6 */ - , <5 0 &gpiob 4 0> /* D5 */ - , <6 0 &gpiob 3 0> /* D6/A7 */ - , <7 0 &gpiob 2 0> /* D7 */ - , <8 0 &gpiob 1 0> /* D8/A8 */ - , <9 0 &gpiob 0 0> /* D9/A9 */ - , <10 0 &gpiob 9 0> /* D10/A10 */ - , <16 0 &gpiob 15 0> /* D16 */ - , <14 0 &gpiob 14 0> /* D14 */ - , <15 0 &gpiob 13 0> /* D15 */ - , <18 0 &gpiob 8 0> /* D18/A0 */ - , <19 0 &gpioa 0 0> /* D19/A1 */ - , <20 0 &gpioa 1 0> /* D20/A2 */ - , <21 0 &gpioa 2 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpioa 10 0> /* D0 */ + , <1 0 &gpioa 9 0> /* D1 */ + , <2 0 &gpiob 7 0> /* D2 */ + , <3 0 &gpiob 6 0> /* D3 */ + , <4 0 &gpiob 5 0> /* D4/A6 */ + , <5 0 &gpiob 4 0> /* D5 */ + , <6 0 &gpiob 3 0> /* D6/A7 */ + , <7 0 &gpiob 2 0> /* D7 */ + , <8 0 &gpiob 1 0> /* D8/A8 */ + , <9 0 &gpiob 0 0> /* D9/A9 */ + , <10 0 &gpiob 9 0> /* D10/A10 */ + , <16 0 &gpiob 15 0> /* D16 */ + , <14 0 &gpiob 14 0> /* D14 */ + , <15 0 &gpiob 13 0> /* D15 */ + , <18 0 &gpiob 8 0> /* D18/A0 */ + , <19 0 &gpioa 0 0> /* D19/A1 */ + , <20 0 &gpioa 1 0> /* D20/A2 */ + , <21 0 &gpioa 2 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpiob 8 0> /* D18/A0 */ - , <1 0 &gpioa 0 0> /* D19/A1 */ - , <2 0 &gpioa 1 0> /* D20/A2 */ - , <3 0 &gpioa 2 0> /* D21/A3 */ - , <6 0 &gpiob 5 0> /* D4/A6 */ - , <7 0 &gpiob 3 0> /* D6/A7 */ - , <8 0 &gpiob 1 0> /* D8/A8 */ - , <9 0 &gpiob 0 0> /* D9/A9 */ - , <10 0 &gpiob 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpiob 8 0> /* D18/A0 */ + , <1 0 &gpioa 0 0> /* D19/A1 */ + , <2 0 &gpioa 1 0> /* D20/A2 */ + , <3 0 &gpioa 2 0> /* D21/A3 */ + , <6 0 &gpiob 5 0> /* D4/A6 */ + , <7 0 &gpiob 3 0> /* D6/A7 */ + , <8 0 &gpiob 1 0> /* D8/A8 */ + , <9 0 &gpiob 0 0> /* D9/A9 */ + , <10 0 &gpiob 9 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/proton_c/proton_c.dts b/app/boards/arm/proton_c/proton_c.dts index df63427f..b5a490ee 100644 --- a/app/boards/arm/proton_c/proton_c.dts +++ b/app/boards/arm/proton_c/proton_c.dts @@ -10,91 +10,91 @@ #include "arduino_pro_micro_pins.dtsi" / { - model = "QMK Proton C"; - compatible = "qmk,proton_c", "st,stm32f303"; + model = "QMK Proton C"; + compatible = "qmk,proton_c", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart0; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart0; + }; - aliases { - led0 = &led; - }; + aliases { + led0 = &led; + }; - leds { - compatible = "gpio-leds"; - led: led_0 { - gpios = <&gpioc 13 GPIO_ACTIVE_HIGH>; - label = "User LED"; - }; - }; + leds { + compatible = "gpio-leds"; + led: led_0 { + gpios = <&gpioc 13 GPIO_ACTIVE_HIGH>; + label = "User LED"; + }; + }; }; &usart1 { - pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; - pinctrl-names = "default"; + pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; + pinctrl-names = "default"; }; &spi2 { - pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; - pinctrl-names = "default"; + pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; + pinctrl-names = "default"; }; &i2c1 { - pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>; - pinctrl-names = "default"; + pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>; + pinctrl-names = "default"; }; &clk_hse { - status = "okay"; - clock-frequency = ; + status = "okay"; + clock-frequency = ; }; &pll { - prediv = <1>; - mul = <9>; - clocks = <&clk_hse>; - status = "okay"; + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <2>; - apb2-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; }; &usb { - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - status = "okay"; - cdc_acm_uart0: cdc_acm_uart0 { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/puchi_ble/Kconfig.board b/app/boards/arm/puchi_ble/Kconfig.board index 07638885..0f5b7f96 100644 --- a/app/boards/arm/puchi_ble/Kconfig.board +++ b/app/boards/arm/puchi_ble/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PUCHI_BLE_v1 - bool "puchi_ble_v1" - depends on SOC_NRF52840_QIAA + bool "puchi_ble_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/puchi_ble/Kconfig.defconfig b/app/boards/arm/puchi_ble/Kconfig.defconfig index 94d12c17..c4fca8e1 100644 --- a/app/boards/arm/puchi_ble/Kconfig.defconfig +++ b/app/boards/arm/puchi_ble/Kconfig.defconfig @@ -4,25 +4,25 @@ if BOARD_PUCHI_BLE_v1 config BOARD - default "puchi_ble" + default "puchi_ble" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y endif # BOARD_PUCHI_BLE_v1 diff --git a/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi index ed3317f1..3037ea3e 100644 --- a/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi index a5385690..35a46e5a 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi +++ b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts index a8f25c37..b056f711 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.dts +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.dts @@ -10,115 +10,115 @@ #include "puchi_ble_v1-pinctrl.dtsi" / { - model = "puchi_ble"; - compatible = "puchi_ble"; + model = "puchi_ble"; + compatible = "puchi_ble"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/s40nc/Kconfig.board b/app/boards/arm/s40nc/Kconfig.board index 673e3b24..e703d726 100644 --- a/app/boards/arm/s40nc/Kconfig.board +++ b/app/boards/arm/s40nc/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_S40NC - bool "S40NC" - depends on SOC_NRF52840_QIAA + bool "S40NC" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/s40nc/Kconfig.defconfig b/app/boards/arm/s40nc/Kconfig.defconfig index 266f8443..11e62cf5 100644 --- a/app/boards/arm/s40nc/Kconfig.defconfig +++ b/app/boards/arm/s40nc/Kconfig.defconfig @@ -4,25 +4,25 @@ if BOARD_S40NC config ZMK_KEYBOARD_NAME - default "S40NC" + default "S40NC" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_S40NC diff --git a/app/boards/arm/s40nc/s40nc.dts b/app/boards/arm/s40nc/s40nc.dts index 5b588b45..6eb9e2a5 100644 --- a/app/boards/arm/s40nc/s40nc.dts +++ b/app/boards/arm/s40nc/s40nc.dts @@ -9,137 +9,137 @@ #include / { - model = "S40NC"; - compatible = "s40nc"; + model = "S40NC"; + compatible = "s40nc"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,11) RC(2,0) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,4) RC(3,6) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio1 2 GPIO_ACTIVE_HIGH> - , <&gpio1 1 GPIO_ACTIVE_HIGH> - , <&gpio1 3 GPIO_ACTIVE_HIGH> - , <&gpio1 0 GPIO_ACTIVE_HIGH> - , <&gpio0 22 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio1 2 GPIO_ACTIVE_HIGH> + , <&gpio1 1 GPIO_ACTIVE_HIGH> + , <&gpio1 3 GPIO_ACTIVE_HIGH> + , <&gpio1 0 GPIO_ACTIVE_HIGH> + , <&gpio0 22 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "mbr"; - reg = <0x00000000 0x00001000>; - }; + sd_partition: partition@0 { + label = "mbr"; + reg = <0x00000000 0x00001000>; + }; - code_partition: partition@1000 { - label = "code_partition"; - reg = <0x00001000 0x000d3000>; - }; + code_partition: partition@1000 { + label = "code_partition"; + reg = <0x00001000 0x000d3000>; + }; - /* - * The flash starting at 0x000d4000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000d4000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@d4000 { - label = "storage"; - reg = <0x000d4000 0x00020000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@d4000 { + label = "storage"; + reg = <0x000d4000 0x00020000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index f0e60e7d..dfc352d7 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -15,44 +15,44 @@ #define CONTROL 3 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &mo LOWER &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp ENTER &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp FSLH &kp UP &kp RSHFT &kp LCTRL &kp LGUI &kp LALT < LOWER SPACE < CONTROL SPACE < RAISE SPACE &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - lower_layer { - bindings = < + lower_layer { + bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &kp PSCRN &kp MINUS &kp EQUAL &trans &trans &trans &trans &kp LBKT &kp RBKT &kp SEMI &kp APOS &trans &trans &trans &trans &trans &trans &trans &kp COMMA &kp DOT &kp PG_UP &kp BSLH &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END - >; - }; + >; + }; raise_layer { - bindings = < + bindings = < &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &trans &kp PSCRN &kp UNDER &kp PLUS &trans &trans &trans &trans &kp LBRC &kp RBRC &kp COLON &kp DQT &trans &trans &trans &trans &trans &trans &trans &kp LT &kp GT &kp PG_UP &kp PIPE &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END - >; - }; + >; + }; control_layer { - bindings = < + bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP &bt BT_SEL 0 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &kp K_LOCK &bt BT_SEL 1 &out OUT_USB &kp CAPS &kp KP_NUM &kp SLCK &trans &trans &kp COMMA &kp DOT &kp K_VOL_UP &kp K_MUTE &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &sys_reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/native_posix.overlay b/app/boards/native_posix.overlay index 2c1ed79d..f8a8f700 100644 --- a/app/boards/native_posix.overlay +++ b/app/boards/native_posix.overlay @@ -3,16 +3,16 @@ #include / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-mock"; - label = "KSCAN_MOCK"; + kscan: kscan { + compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; - rows = <2>; - columns = <2>; - exit-after; - }; + rows = <2>; + columns = <2>; + exit-after; + }; }; diff --git a/app/boards/native_posix_64.overlay b/app/boards/native_posix_64.overlay index 2c1ed79d..f8a8f700 100644 --- a/app/boards/native_posix_64.overlay +++ b/app/boards/native_posix_64.overlay @@ -3,16 +3,16 @@ #include / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-mock"; - label = "KSCAN_MOCK"; + kscan: kscan { + compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; - rows = <2>; - columns = <2>; - exit-after; - }; + rows = <2>; + columns = <2>; + exit-after; + }; }; diff --git a/app/boards/seeeduino_xiao.overlay b/app/boards/seeeduino_xiao.overlay index 70080286..a2ddaea4 100644 --- a/app/boards/seeeduino_xiao.overlay +++ b/app/boards/seeeduino_xiao.overlay @@ -5,15 +5,15 @@ */ / { - chosen { - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,console = &cdc_acm_uart; + }; }; &usb0 { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay index 452786d1..51671a80 100644 --- a/app/boards/seeeduino_xiao_ble.overlay +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -6,29 +6,29 @@ / { - chosen { - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 7>; - power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; - output-ohms = <510000>; - full-ohms = <(1000000 + 510000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + output-ohms = <510000>; + full-ohms = <(1000000 + 510000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &usbd { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/shields/Kconfig.defconfig b/app/boards/shields/Kconfig.defconfig index 5b9ca9a1..58dd45d6 100644 --- a/app/boards/shields/Kconfig.defconfig +++ b/app/boards/shields/Kconfig.defconfig @@ -2,13 +2,13 @@ config ZMK_KEYBOARD_NAME - default "cradios" + default "cradios" # Unable to use interrupts as the same pin number is used # across A & B controllers, and STM32F303CCT6 can't enable # interrutps for multiple controllers for the same "line" # for the external interrupts. config ZMK_KSCAN_GPIO_POLLING - default y + default y diff --git a/app/boards/shields/Kconfig.shield b/app/boards/shields/Kconfig.shield index 844d4332..cab78898 100644 --- a/app/boards/shields/Kconfig.shield +++ b/app/boards/shields/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CRADIOS - def_bool $(shields_list_contains,cradios) + def_bool $(shields_list_contains,cradios) diff --git a/app/boards/shields/a_dux/Kconfig.defconfig b/app/boards/shields/a_dux/Kconfig.defconfig index 53cd1986..2dc40dbe 100644 --- a/app/boards/shields/a_dux/Kconfig.defconfig +++ b/app/boards/shields/a_dux/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_A_DUX_LEFT config ZMK_KEYBOARD_NAME - default "A. Dux" + default "A. Dux" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_A_DUX_LEFT || SHIELD_A_DUX_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/a_dux/Kconfig.shield b/app/boards/shields/a_dux/Kconfig.shield index 6058f290..928f432c 100644 --- a/app/boards/shields/a_dux/Kconfig.shield +++ b/app/boards/shields/a_dux/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_A_DUX_LEFT - def_bool $(shields_list_contains,a_dux_left) + def_bool $(shields_list_contains,a_dux_left) config SHIELD_A_DUX_RIGHT - def_bool $(shields_list_contains,a_dux_right) + def_bool $(shields_list_contains,a_dux_right) diff --git a/app/boards/shields/a_dux/a_dux.dtsi b/app/boards/shields/a_dux/a_dux.dtsi index 4840227c..28156f42 100644 --- a/app/boards/shields/a_dux/a_dux.dtsi +++ b/app/boards/shields/a_dux/a_dux.dtsi @@ -8,45 +8,45 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; - input-gpios = - <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; + input-gpios = + <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/a_dux/a_dux.keymap b/app/boards/shields/a_dux/a_dux.keymap index eda03ff9..0f162a33 100644 --- a/app/boards/shields/a_dux/a_dux.keymap +++ b/app/boards/shields/a_dux/a_dux.keymap @@ -9,18 +9,18 @@ / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - // This is a sample keymap intended to be replaced with your own - base_layer { - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI - &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH - &kp TAB &kp BSPC &kp SPACE &kp ENTER - >; - }; + // This is a sample keymap intended to be replaced with your own + base_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH + &kp TAB &kp BSPC &kp SPACE &kp ENTER + >; + }; - }; + }; }; diff --git a/app/boards/shields/a_dux/a_dux_right.overlay b/app/boards/shields/a_dux/a_dux_right.overlay index 0034317e..d4aed65c 100644 --- a/app/boards/shields/a_dux/a_dux_right.overlay +++ b/app/boards/shields/a_dux/a_dux_right.overlay @@ -7,5 +7,5 @@ #include "a_dux.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/bfo9000/Kconfig.defconfig b/app/boards/shields/bfo9000/Kconfig.defconfig index 7e9ccf9c..7e41b04a 100644 --- a/app/boards/shields/bfo9000/Kconfig.defconfig +++ b/app/boards/shields/bfo9000/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_BFO9000_LEFT config ZMK_KEYBOARD_NAME - default "BFO-9000" + default "BFO-9000" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_BFO9000_LEFT || SHIELD_BFO9000_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/bfo9000/Kconfig.shield b/app/boards/shields/bfo9000/Kconfig.shield index 4750e43a..5746abbe 100644 --- a/app/boards/shields/bfo9000/Kconfig.shield +++ b/app/boards/shields/bfo9000/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_BFO9000_LEFT - def_bool $(shields_list_contains,bfo9000_left) + def_bool $(shields_list_contains,bfo9000_left) config SHIELD_BFO9000_RIGHT - def_bool $(shields_list_contains,bfo9000_right) + def_bool $(shields_list_contains,bfo9000_right) diff --git a/app/boards/shields/bfo9000/bfo9000.dtsi b/app/boards/shields/bfo9000/bfo9000.dtsi index 0ceb9127..c5547920 100644 --- a/app/boards/shields/bfo9000/bfo9000.dtsi +++ b/app/boards/shields/bfo9000/bfo9000.dtsi @@ -7,38 +7,38 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <18>; - rows = <6>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(1,16) RC(1,17) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(2,16) RC(2,17) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) RC(3,15) RC(3,16) RC(3,17) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) RC(4,16) RC(4,17) - RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) RC(5,6) RC(5,7) RC(5,8) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) RC(5,16) RC(5,17) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <18>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(1,16) RC(1,17) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(2,16) RC(2,17) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) RC(3,15) RC(3,16) RC(3,17) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) RC(4,16) RC(4,17) + RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) RC(5,6) RC(5,7) RC(5,8) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) RC(5,16) RC(5,17) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/bfo9000/bfo9000.keymap b/app/boards/shields/bfo9000/bfo9000.keymap index 22186a1d..18a2085c 100644 --- a/app/boards/shields/bfo9000/bfo9000.keymap +++ b/app/boards/shields/bfo9000/bfo9000.keymap @@ -15,41 +15,41 @@ #define LOWER 1 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // | Esc | Vol Up | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | - // | Home | Vol Dn | ` | 1 | 2 | 3 | 4 | 5 | 6 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bk Spc | - // | End | Tab | Tab | Q | W | E | R | T | Y | T | Y | U | I | O | P | [ | ] | \ | - // | Pg Up | Caps | Ctrl | A | S | D | F | G | H | G | H | J | K | L | ; | ' | Enter | Enter | - // | Pg Dn | Up | Shift | Z | X | C | V | B | N | B | N | M | , | . | / | Shift | Up | | - // | Left | Dn | Right | Ctrl | Alt | Win | Spc | Spc | Enter | Bk Spc | Spc | Spc | Win | Alt | Ctrl | Left | Dn | Right | - bindings = < - &kp ESC &kp C_VOL_UP &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &kp HOME &kp C_VOL_DN &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp END &kp TAB &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp PG_UP &kp CAPS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp APOS &kp ENTER &kp ENTER - &kp PG_DN &kp UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP &mo LOWER - &kp LEFT &kp DOWN &kp RIGHT &kp LCTRL &kp LALT &kp LMETA &kp SPACE &kp SPACE &kp ENTER &kp BSPC &kp SPACE &kp SPACE &kp RMETA &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; + default_layer { + // | Esc | Vol Up | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | + // | Home | Vol Dn | ` | 1 | 2 | 3 | 4 | 5 | 6 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bk Spc | + // | End | Tab | Tab | Q | W | E | R | T | Y | T | Y | U | I | O | P | [ | ] | \ | + // | Pg Up | Caps | Ctrl | A | S | D | F | G | H | G | H | J | K | L | ; | ' | Enter | Enter | + // | Pg Dn | Up | Shift | Z | X | C | V | B | N | B | N | M | , | . | / | Shift | Up | | + // | Left | Dn | Right | Ctrl | Alt | Win | Spc | Spc | Enter | Bk Spc | Spc | Spc | Win | Alt | Ctrl | Left | Dn | Right | + bindings = < + &kp ESC &kp C_VOL_UP &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &kp HOME &kp C_VOL_DN &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp END &kp TAB &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp PG_UP &kp CAPS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp APOS &kp ENTER &kp ENTER + &kp PG_DN &kp UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP &mo LOWER + &kp LEFT &kp DOWN &kp RIGHT &kp LCTRL &kp LALT &kp LMETA &kp SPACE &kp SPACE &kp ENTER &kp BSPC &kp SPACE &kp SPACE &kp RMETA &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + }; - lower_layer { - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - bindings = < - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 - &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans - &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans - &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans - &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans - &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans - >; - }; - }; + lower_layer { + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + bindings = < + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 + &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans + &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans + &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans + &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/bfo9000/bfo9000_left.overlay b/app/boards/shields/bfo9000/bfo9000_left.overlay index 3f034d95..9e921053 100644 --- a/app/boards/shields/bfo9000/bfo9000_left.overlay +++ b/app/boards/shields/bfo9000/bfo9000_left.overlay @@ -7,15 +7,15 @@ #include "bfo9000.dtsi" &kscan0 { - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/bfo9000/bfo9000_right.overlay b/app/boards/shields/bfo9000/bfo9000_right.overlay index 30bd35e2..897c6b0b 100644 --- a/app/boards/shields/bfo9000/bfo9000_right.overlay +++ b/app/boards/shields/bfo9000/bfo9000_right.overlay @@ -7,19 +7,19 @@ #include "bfo9000.dtsi" &default_transform { - col-offset = <9>; + col-offset = <9>; }; &kscan0 { - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/boardsource3x4/Kconfig.shield b/app/boards/shields/boardsource3x4/Kconfig.shield index cda55d07..7f574cea 100644 --- a/app/boards/shields/boardsource3x4/Kconfig.shield +++ b/app/boards/shields/boardsource3x4/Kconfig.shield @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config SHIELD_BOARDSOURCE3X4 - def_bool $(shields_list_contains,boardsource3x4) + def_bool $(shields_list_contains,boardsource3x4) diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/clog/Kconfig.defconfig b/app/boards/shields/clog/Kconfig.defconfig index 1ca779f3..53ded4d7 100644 --- a/app/boards/shields/clog/Kconfig.defconfig +++ b/app/boards/shields/clog/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_CLOG_LEFT config ZMK_KEYBOARD_NAME - default "Clog" + default "Clog" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CLOG_LEFT || SHIELD_CLOG_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/clog/Kconfig.shield b/app/boards/shields/clog/Kconfig.shield index 2301af94..69ecef8d 100644 --- a/app/boards/shields/clog/Kconfig.shield +++ b/app/boards/shields/clog/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CLOG_LEFT - def_bool $(shields_list_contains,clog_left) + def_bool $(shields_list_contains,clog_left) config SHIELD_CLOG_RIGHT - def_bool $(shields_list_contains,clog_right) + def_bool $(shields_list_contains,clog_right) diff --git a/app/boards/shields/clog/clog.dtsi b/app/boards/shields/clog/clog.dtsi index ccad150c..40e9a39f 100644 --- a/app/boards/shields/clog/clog.dtsi +++ b/app/boards/shields/clog/clog.dtsi @@ -8,44 +8,44 @@ / { chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) RC(0,21) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) RC(0,21) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; }; kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; }; diff --git a/app/boards/shields/clog/clog_right.overlay b/app/boards/shields/clog/clog_right.overlay index 0dc5d64f..8b0efb3d 100644 --- a/app/boards/shields/clog/clog_right.overlay +++ b/app/boards/shields/clog/clog_right.overlay @@ -7,5 +7,5 @@ #include "clog.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/clueboard_california/Kconfig.defconfig b/app/boards/shields/clueboard_california/Kconfig.defconfig index e101ea76..278aaa44 100644 --- a/app/boards/shields/clueboard_california/Kconfig.defconfig +++ b/app/boards/shields/clueboard_california/Kconfig.defconfig @@ -2,13 +2,13 @@ if SHIELD_CLUEBOARD_CALIFORNIA config ZMK_KEYBOARD_NAME - default "Clueboard California Macropad" + default "Clueboard California Macropad" # Unable to use interrupts as the same pin number is used # across A & B controllers, and STM32F303CCT6 can't enable # interrutps for multiple controllers for the same "line" # for the external interrupts. config ZMK_KSCAN_DIRECT_POLLING - default y + default y endif diff --git a/app/boards/shields/clueboard_california/Kconfig.shield b/app/boards/shields/clueboard_california/Kconfig.shield index eca025d1..e987d29a 100644 --- a/app/boards/shields/clueboard_california/Kconfig.shield +++ b/app/boards/shields/clueboard_california/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CLUEBOARD_CALIFORNIA - def_bool $(shields_list_contains,clueboard_california) + def_bool $(shields_list_contains,clueboard_california) diff --git a/app/boards/shields/clueboard_california/clueboard_california.keymap b/app/boards/shields/clueboard_california/clueboard_california.keymap index b9041c37..9af22fa1 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.keymap +++ b/app/boards/shields/clueboard_california/clueboard_california.keymap @@ -8,18 +8,18 @@ #include / { - keymap0: keymap { - compatible = "zmk,keymap"; + keymap0: keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp N9 &kp N8 - &kp N7 &kp N6 - &kp N5 - &kp N4 &kp N3 - &kp N2 &kp N1 - &kp N0 - >; - }; - }; + default_layer { + bindings = < + &kp N9 &kp N8 + &kp N7 &kp N6 + &kp N5 + &kp N4 &kp N3 + &kp N2 &kp N1 + &kp N0 + >; + }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/clueboard_california/clueboard_california.overlay b/app/boards/shields/clueboard_california/clueboard_california.overlay index 9f52d0d3..dfa5d9cf 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.overlay +++ b/app/boards/shields/clueboard_california/clueboard_california.overlay @@ -5,30 +5,30 @@ */ / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-direct"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + label = "KSCAN"; - input-gpios - = <&gpioa 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&gpioa 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; - // TODO: Per-key LED node(s) + // TODO: Per-key LED node(s) }; diff --git a/app/boards/shields/contra/Kconfig.shield b/app/boards/shields/contra/Kconfig.shield index 59412ff5..e9f8e804 100644 --- a/app/boards/shields/contra/Kconfig.shield +++ b/app/boards/shields/contra/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CONTRA - def_bool $(shields_list_contains,contra) \ No newline at end of file + def_bool $(shields_list_contains,contra) \ No newline at end of file diff --git a/app/boards/shields/corne/Kconfig.defconfig b/app/boards/shields/corne/Kconfig.defconfig index acf542d7..07dd07e9 100644 --- a/app/boards/shields/corne/Kconfig.defconfig +++ b/app/boards/shields/corne/Kconfig.defconfig @@ -1,44 +1,44 @@ if SHIELD_CORNE_LEFT config ZMK_KEYBOARD_NAME - default "Corne" + default "Corne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CORNE_LEFT || SHIELD_CORNE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/corne/Kconfig.shield b/app/boards/shields/corne/Kconfig.shield index 3cac86fe..099680b9 100644 --- a/app/boards/shields/corne/Kconfig.shield +++ b/app/boards/shields/corne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CORNE_LEFT - def_bool $(shields_list_contains,corne_left) + def_bool $(shields_list_contains,corne_left) config SHIELD_CORNE_RIGHT - def_bool $(shields_list_contains,corne_right) + def_bool $(shields_list_contains,corne_right) diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/corne/corne.dtsi b/app/boards/shields/corne/corne.dtsi index a9c1c287..0e9eddf9 100644 --- a/app/boards/shields/corne/corne.dtsi +++ b/app/boards/shields/corne/corne.dtsi @@ -7,77 +7,77 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/corne/corne.keymap b/app/boards/shields/corne/corne.keymap index 53218a86..0555cf41 100644 --- a/app/boards/shields/corne/corne.keymap +++ b/app/boards/shields/corne/corne.keymap @@ -35,7 +35,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -49,7 +49,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/shields/corne/corne_left.overlay b/app/boards/shields/corne/corne_left.overlay index fe7e3c78..117cb19e 100644 --- a/app/boards/shields/corne/corne_left.overlay +++ b/app/boards/shields/corne/corne_left.overlay @@ -7,12 +7,12 @@ #include "corne.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/corne/corne_right.overlay b/app/boards/shields/corne/corne_right.overlay index 1d7ed9ec..a8a0cfe7 100644 --- a/app/boards/shields/corne/corne_right.overlay +++ b/app/boards/shields/corne/corne_right.overlay @@ -7,20 +7,20 @@ #include "corne.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/cradio/Kconfig.defconfig b/app/boards/shields/cradio/Kconfig.defconfig index b600383a..c5d03f4e 100644 --- a/app/boards/shields/cradio/Kconfig.defconfig +++ b/app/boards/shields/cradio/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_CRADIO_LEFT config ZMK_KEYBOARD_NAME - default "Cradio" + default "Cradio" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CRADIO_LEFT || SHIELD_CRADIO_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/cradio/Kconfig.shield b/app/boards/shields/cradio/Kconfig.shield index bb5f0735..affb1c53 100644 --- a/app/boards/shields/cradio/Kconfig.shield +++ b/app/boards/shields/cradio/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CRADIO_LEFT - def_bool $(shields_list_contains,cradio_left) + def_bool $(shields_list_contains,cradio_left) config SHIELD_CRADIO_RIGHT - def_bool $(shields_list_contains,cradio_right) + def_bool $(shields_list_contains,cradio_right) diff --git a/app/boards/shields/cradio/README.md b/app/boards/shields/cradio/README.md index ee1cab0e..2c4e2e60 100644 --- a/app/boards/shields/cradio/README.md +++ b/app/boards/shields/cradio/README.md @@ -10,25 +10,25 @@ Some revisions of the aforementioned PCBs have slightly different pin arrangemen /* Adjusted Cradio pin arrangement */ /* The position of Q and B keys have been swapped */ &kscan0 { - input-gpios - = <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; ``` diff --git a/app/boards/shields/cradio/cradio.dtsi b/app/boards/shields/cradio/cradio.dtsi index ca464c95..57dcfd4b 100644 --- a/app/boards/shields/cradio/cradio.dtsi +++ b/app/boards/shields/cradio/cradio.dtsi @@ -8,45 +8,45 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; - input-gpios - = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; + input-gpios + = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/cradio/cradio_right.overlay b/app/boards/shields/cradio/cradio_right.overlay index 41436e97..fea9ae1c 100644 --- a/app/boards/shields/cradio/cradio_right.overlay +++ b/app/boards/shields/cradio/cradio_right.overlay @@ -7,5 +7,5 @@ #include "cradio.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/crbn/Kconfig.defconfig b/app/boards/shields/crbn/Kconfig.defconfig index 2a5c8e39..c00e97a4 100644 --- a/app/boards/shields/crbn/Kconfig.defconfig +++ b/app/boards/shields/crbn/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_CRBN config ZMK_KEYBOARD_NAME - default "CRBN" + default "CRBN" endif diff --git a/app/boards/shields/crbn/Kconfig.shield b/app/boards/shields/crbn/Kconfig.shield index ceeb5f63..bf92dbf1 100644 --- a/app/boards/shields/crbn/Kconfig.shield +++ b/app/boards/shields/crbn/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CRBN - def_bool $(shields_list_contains,crbn) + def_bool $(shields_list_contains,crbn) diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index b967e5e2..f963ba84 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -9,54 +9,54 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ----------------------------------------------------------------------------------------- - // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | - // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET - &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT - >; + default_layer { + // ----------------------------------------------------------------------------------------- + // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - }; + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + }; - lower { - bindings = < - &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; + lower { + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise { - bindings = < - &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &trans &trans &trans &trans &mo 3 &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; + raise { + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans + &trans &trans &trans &trans &mo 3 &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - }; + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + }; - control { - bindings = < - &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; - }; - }; + control { + bindings = < + &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/crbn/crbn.overlay b/app/boards/shields/crbn/crbn.overlay index 18382cce..817a83d0 100644 --- a/app/boards/shields/crbn/crbn.overlay +++ b/app/boards/shields/crbn/crbn.overlay @@ -7,49 +7,49 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 3 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 3 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - encoder: encoder { - compatible = "alps,ec11"; - label = "ENCODER"; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <2>; - status = "okay"; - }; + encoder: encoder { + compatible = "alps,ec11"; + label = "ENCODER"; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + status = "okay"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; }; diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index 55ee6c87..70a312c1 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -14,34 +14,34 @@ endif if SHIELD_ELEPHANT42_LEFT || SHIELD_ELEPHANT42_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/elephant42/boards/nice_nano.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/elephant42/elephant42.dtsi b/app/boards/shields/elephant42/elephant42.dtsi index 2d3f5166..b0e9a32e 100644 --- a/app/boards/shields/elephant42/elephant42.dtsi +++ b/app/boards/shields/elephant42/elephant42.dtsi @@ -40,21 +40,21 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; \ No newline at end of file diff --git a/app/boards/shields/ergodash/Kconfig.defconfig b/app/boards/shields/ergodash/Kconfig.defconfig index 43cab0b1..34a87e8e 100644 --- a/app/boards/shields/ergodash/Kconfig.defconfig +++ b/app/boards/shields/ergodash/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_ERGODASH_LEFT config ZMK_KEYBOARD_NAME - default "Ergodash" + default "Ergodash" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_ERGODASH_LEFT || SHIELD_ERGODASH_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/ergodash/Kconfig.shield b/app/boards/shields/ergodash/Kconfig.shield index b3cca293..5814e21e 100644 --- a/app/boards/shields/ergodash/Kconfig.shield +++ b/app/boards/shields/ergodash/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ERGODASH_LEFT - def_bool $(shields_list_contains,ergodash_left) + def_bool $(shields_list_contains,ergodash_left) config SHIELD_ERGODASH_RIGHT - def_bool $(shields_list_contains,ergodash_right) + def_bool $(shields_list_contains,ergodash_right) diff --git a/app/boards/shields/ergodash/ergodash.dtsi b/app/boards/shields/ergodash/ergodash.dtsi index a2b76075..d109fa66 100644 --- a/app/boards/shields/ergodash/ergodash.dtsi +++ b/app/boards/shields/ergodash/ergodash.dtsi @@ -7,15 +7,15 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // Numbering based on rev 1.2 schema // * keys that can be in different positions are denoted as MW // * MW40 can be broken off @@ -24,38 +24,38 @@ // | SW3 | SW7 | SW11 | SW15 | SW19 | SW23 | SW27 | | | | SW27 | SW23 | SW19 | SW15 | SW11 | SW7 | SW3 | // | SW4 | SW8 | SW12 | SW16 | SW20 | SW24 | | MW28 | | MW28 | | SW24 | SW20 | SW16 | SW12 | SW8 | SW4 | // | SW30 | SW31 | SW32 | MW33 | SW34 | | MW35 | MW40 | | MW40 | MW35 | | SW34 | MW33 | SW32 | SW31 | SW30 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(0,7) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,7) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,13) RC(2,12) RC(2,11) RC(2,10) RC(2,9) RC(2,8) RC(2,7) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,13) RC(3,12) RC(3,11) RC(3,10) RC(3,9) RC(3,8) RC(3,7) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,13) RC(4,12) RC(4,11) RC(4,10) RC(4,9) RC(4,8) RC(4,7) - >; + >; }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + col-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/shields/ergodash/ergodash_right.overlay b/app/boards/shields/ergodash/ergodash_right.overlay index 464b3f5d..07fbbb70 100644 --- a/app/boards/shields/ergodash/ergodash_right.overlay +++ b/app/boards/shields/ergodash/ergodash_right.overlay @@ -7,5 +7,5 @@ #include "ergodash.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; diff --git a/app/boards/shields/eternal_keypad/Kconfig.defconfig b/app/boards/shields/eternal_keypad/Kconfig.defconfig index 4d4195ef..72514192 100644 --- a/app/boards/shields/eternal_keypad/Kconfig.defconfig +++ b/app/boards/shields/eternal_keypad/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_ETERNAL_KEYPAD || SHIELD_ETERNAL_KEYPAD_LEFTY config ZMK_KEYBOARD_NAME - default "Eternal Keypad" + default "Eternal Keypad" endif diff --git a/app/boards/shields/eternal_keypad/Kconfig.shield b/app/boards/shields/eternal_keypad/Kconfig.shield index 4a59379e..23015153 100644 --- a/app/boards/shields/eternal_keypad/Kconfig.shield +++ b/app/boards/shields/eternal_keypad/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ETERNAL_KEYPAD - def_bool $(shields_list_contains,eternal_keypad) + def_bool $(shields_list_contains,eternal_keypad) config SHIELD_ETERNAL_KEYPAD_LEFTY - def_bool $(shields_list_contains,eternal_keypad_lefty) + def_bool $(shields_list_contains,eternal_keypad_lefty) diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/fourier/Kconfig.defconfig b/app/boards/shields/fourier/Kconfig.defconfig index b887870c..a07ca714 100644 --- a/app/boards/shields/fourier/Kconfig.defconfig +++ b/app/boards/shields/fourier/Kconfig.defconfig @@ -5,16 +5,16 @@ if SHIELD_FOURIER_LEFT config ZMK_KEYBOARD_NAME - default "Fourier" + default "Fourier" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_FOURIER_LEFT || SHIELD_FOURIER_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/fourier/Kconfig.shield b/app/boards/shields/fourier/Kconfig.shield index 2e337410..ee28c7ac 100644 --- a/app/boards/shields/fourier/Kconfig.shield +++ b/app/boards/shields/fourier/Kconfig.shield @@ -3,7 +3,7 @@ config SHIELD_FOURIER_LEFT - def_bool $(shields_list_contains,fourier_left) + def_bool $(shields_list_contains,fourier_left) config SHIELD_FOURIER_RIGHT - def_bool $(shields_list_contains,fourier_right) + def_bool $(shields_list_contains,fourier_right) diff --git a/app/boards/shields/fourier/fourier.dtsi b/app/boards/shields/fourier/fourier.dtsi index 99027ea9..0902d687 100644 --- a/app/boards/shields/fourier/fourier.dtsi +++ b/app/boards/shields/fourier/fourier.dtsi @@ -7,37 +7,37 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - /* - * This transform correspondsto the 60% left without macro keypad and 65% right, even this - * combination of PCBs can have keys in different locations based on configuration. - */ - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <13>; - rows = <4>; - map = < + /* + * This transform correspondsto the 60% left without macro keypad and 65% right, even this + * combination of PCBs can have keys in different locations based on configuration. + */ + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <13>; + rows = <4>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) /**/ RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0, 11) RC(0,12) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/ RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,12) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,6) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) /**/ RC(3,6) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D - ; - }; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D + ; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/helix/boards/nice_nano_v2.overlay +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/helix_right.overlay b/app/boards/shields/helix/helix_right.overlay index 42dd0f52..0d3cc63d 100644 --- a/app/boards/shields/helix/helix_right.overlay +++ b/app/boards/shields/helix/helix_right.overlay @@ -7,7 +7,7 @@ #include "helix.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 0c48c128..1b40acba 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -10,8 +10,8 @@ chosen { zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; - /delete-property/ zephyr,console; - /delete-property/ zephyr,shell-uart; + /delete-property/ zephyr,console; + /delete-property/ zephyr,shell-uart; }; default_transform: keymap_transform_0 { diff --git a/app/boards/shields/iris/Kconfig.defconfig b/app/boards/shields/iris/Kconfig.defconfig index 83331d10..b68bc999 100644 --- a/app/boards/shields/iris/Kconfig.defconfig +++ b/app/boards/shields/iris/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_IRIS_LEFT config ZMK_KEYBOARD_NAME - default "Iris" + default "Iris" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_IRIS_LEFT || SHIELD_IRIS_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/iris/Kconfig.shield b/app/boards/shields/iris/Kconfig.shield index 370bd222..764d8101 100644 --- a/app/boards/shields/iris/Kconfig.shield +++ b/app/boards/shields/iris/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_IRIS_LEFT - def_bool $(shields_list_contains,iris_left) + def_bool $(shields_list_contains,iris_left) config SHIELD_IRIS_RIGHT - def_bool $(shields_list_contains,iris_right) + def_bool $(shields_list_contains,iris_right) diff --git a/app/boards/shields/iris/iris.dtsi b/app/boards/shields/iris/iris.dtsi index 0e976f86..a0caf1ad 100644 --- a/app/boards/shields/iris/iris.dtsi +++ b/app/boards/shields/iris/iris.dtsi @@ -7,41 +7,41 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/iris/iris.keymap b/app/boards/shields/iris/iris.keymap index 7c00d0a5..209c2277 100644 --- a/app/boards/shields/iris/iris.keymap +++ b/app/boards/shields/iris/iris.keymap @@ -9,55 +9,55 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | -// | GUI | LOWER| SPACE | | ENTER | RAISE| ALT | - bindings = < +// | GUI | LOWER| SPACE | | ENTER | RAISE| ALT | + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT - >; - }; + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp TILDE &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &trans &trans &trans &trans &trans - >; - }; + &trans &trans &trans &trans &trans &trans + >; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | ^ | v | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &trans &trans &trans &trans &trans - >; - }; - }; + &trans &trans &trans &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/iris/iris_left.overlay b/app/boards/shields/iris/iris_left.overlay index 2c52fca8..eb330d31 100644 --- a/app/boards/shields/iris/iris_left.overlay +++ b/app/boards/shields/iris/iris_left.overlay @@ -7,12 +7,12 @@ #include "iris.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/iris/iris_right.overlay b/app/boards/shields/iris/iris_right.overlay index 2ed712a2..d2375b18 100644 --- a/app/boards/shields/iris/iris_right.overlay +++ b/app/boards/shields/iris/iris_right.overlay @@ -7,16 +7,16 @@ #include "iris.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jian/Kconfig.defconfig b/app/boards/shields/jian/Kconfig.defconfig index bbdafbae..2f3d0a17 100644 --- a/app/boards/shields/jian/Kconfig.defconfig +++ b/app/boards/shields/jian/Kconfig.defconfig @@ -2,16 +2,16 @@ if SHIELD_JIAN_LEFT config ZMK_KEYBOARD_NAME - default "Jian" + default "Jian" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JIAN_LEFT || SHIELD_JIAN_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/jian/Kconfig.shield b/app/boards/shields/jian/Kconfig.shield index 5b874f03..efcfa214 100644 --- a/app/boards/shields/jian/Kconfig.shield +++ b/app/boards/shields/jian/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JIAN_LEFT - def_bool $(shields_list_contains,jian_left) + def_bool $(shields_list_contains,jian_left) config SHIELD_JIAN_RIGHT - def_bool $(shields_list_contains,jian_right) + def_bool $(shields_list_contains,jian_right) diff --git a/app/boards/shields/jian/jian.dtsi b/app/boards/shields/jian/jian.dtsi index 2b1eb391..8e772791 100644 --- a/app/boards/shields/jian/jian.dtsi +++ b/app/boards/shields/jian/jian.dtsi @@ -7,70 +7,70 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW0 | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | SW0 | // | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(2,0) RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) RC(2,11) RC(1,0) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(1,11) RC(2,1) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(2,10) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - crkbd_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + crkbd_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) + map = < + RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(1,11) RC(2,1) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(2,10) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - five_column_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) + map = < + RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/jian/jian_left.overlay b/app/boards/shields/jian/jian_left.overlay index e7f9d5b5..e402f03b 100644 --- a/app/boards/shields/jian/jian_left.overlay +++ b/app/boards/shields/jian/jian_left.overlay @@ -7,12 +7,12 @@ #include "jian.dtsi" &kscan0 { - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jian/jian_right.overlay b/app/boards/shields/jian/jian_right.overlay index cac83fd3..f646741b 100644 --- a/app/boards/shields/jian/jian_right.overlay +++ b/app/boards/shields/jian/jian_right.overlay @@ -7,24 +7,24 @@ #include "jian.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jiran/Kconfig.defconfig b/app/boards/shields/jiran/Kconfig.defconfig index b5b1f97b..0c6683f4 100644 --- a/app/boards/shields/jiran/Kconfig.defconfig +++ b/app/boards/shields/jiran/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_JIRAN_LEFT config ZMK_KEYBOARD_NAME - default "Jiran" + default "Jiran" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JIRAN_LEFT || SHIELD_JIRAN_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/jiran/Kconfig.shield b/app/boards/shields/jiran/Kconfig.shield index 8a24ace0..8f480723 100644 --- a/app/boards/shields/jiran/Kconfig.shield +++ b/app/boards/shields/jiran/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JIRAN_LEFT - def_bool $(shields_list_contains,jiran_left) + def_bool $(shields_list_contains,jiran_left) config SHIELD_JIRAN_RIGHT - def_bool $(shields_list_contains,jiran_right) + def_bool $(shields_list_contains,jiran_right) diff --git a/app/boards/shields/jiran/jiran.dtsi b/app/boards/shields/jiran/jiran.dtsi index f0727dd4..b7e74c27 100644 --- a/app/boards/shields/jiran/jiran.dtsi +++ b/app/boards/shields/jiran/jiran.dtsi @@ -7,76 +7,76 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW0 | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | SW0 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(4,0) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(4,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - jian_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + jian_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW0 | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | SW0 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(4,0) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(4,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - crkbd_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + crkbd_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/jiran/jiran_left.overlay b/app/boards/shields/jiran/jiran_left.overlay index 4466202c..3b7f5e55 100644 --- a/app/boards/shields/jiran/jiran_left.overlay +++ b/app/boards/shields/jiran/jiran_left.overlay @@ -7,12 +7,12 @@ #include "jiran.dtsi" &kscan0 { - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jiran/jiran_right.overlay b/app/boards/shields/jiran/jiran_right.overlay index c3648797..668c5513 100644 --- a/app/boards/shields/jiran/jiran_right.overlay +++ b/app/boards/shields/jiran/jiran_right.overlay @@ -7,24 +7,24 @@ #include "jiran.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &jian_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 775bb56a..04beb792 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_JORNE_LEFT config ZMK_KEYBOARD_NAME - default "Jorne" + default "Jorne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JORNE_LEFT || SHIELD_JORNE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/jorne/Kconfig.shield b/app/boards/shields/jorne/Kconfig.shield index 88fd4e5a..37a3cab5 100644 --- a/app/boards/shields/jorne/Kconfig.shield +++ b/app/boards/shields/jorne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JORNE_LEFT - def_bool $(shields_list_contains,jorne_left) + def_bool $(shields_list_contains,jorne_left) config SHIELD_JORNE_RIGHT - def_bool $(shields_list_contains,jorne_right) + def_bool $(shields_list_contains,jorne_right) diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/jorne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/jorne/jorne.dtsi b/app/boards/shields/jorne/jorne.dtsi index bb862b8d..1d12b85c 100644 --- a/app/boards/shields/jorne/jorne.dtsi +++ b/app/boards/shields/jorne/jorne.dtsi @@ -7,93 +7,93 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW0 | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | SW0 | // | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(3,0) RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(3,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - crkbd_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + crkbd_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/jorne/jorne_left.overlay b/app/boards/shields/jorne/jorne_left.overlay index 7e132cd9..f0476b41 100644 --- a/app/boards/shields/jorne/jorne_left.overlay +++ b/app/boards/shields/jorne/jorne_left.overlay @@ -7,12 +7,12 @@ #include "jorne.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jorne/jorne_right.overlay b/app/boards/shields/jorne/jorne_right.overlay index 698bf9dd..604f4816 100644 --- a/app/boards/shields/jorne/jorne_right.overlay +++ b/app/boards/shields/jorne/jorne_right.overlay @@ -7,24 +7,24 @@ #include "jorne.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 82f48b4c..2d162736 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT || SHIELD_KYRIA_REV3_LEFT config ZMK_KEYBOARD_NAME - default "Kyria" + default "Kyria" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_KYRIA config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/kyria/Kconfig.shield b/app/boards/shields/kyria/Kconfig.shield index 52df9378..a9d5ac4f 100644 --- a/app/boards/shields/kyria/Kconfig.shield +++ b/app/boards/shields/kyria/Kconfig.shield @@ -5,25 +5,25 @@ config SHIELD_KYRIA bool config SHIELD_KYRIA_LEFT - def_bool $(shields_list_contains,kyria_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_left) + select SHIELD_KYRIA config SHIELD_KYRIA_RIGHT - def_bool $(shields_list_contains,kyria_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_right) + select SHIELD_KYRIA config SHIELD_KYRIA_REV2_LEFT - def_bool $(shields_list_contains,kyria_rev2_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev2_left) + select SHIELD_KYRIA config SHIELD_KYRIA_REV2_RIGHT - def_bool $(shields_list_contains,kyria_rev2_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev2_right) + select SHIELD_KYRIA config SHIELD_KYRIA_REV3_LEFT - def_bool $(shields_list_contains,kyria_rev3_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev3_left) + select SHIELD_KYRIA config SHIELD_KYRIA_REV3_RIGHT - def_bool $(shields_list_contains,kyria_rev3_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev3_right) + select SHIELD_KYRIA diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11.overlay b/app/boards/shields/kyria/boards/nrfmicro_11.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_13.overlay b/app/boards/shields/kyria/boards/nrfmicro_13.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_13.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_13.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/kyria.dtsi b/app/boards/shields/kyria/kyria.dtsi index cffe23b0..b98240e4 100644 --- a/app/boards/shields/kyria/kyria.dtsi +++ b/app/boards/shields/kyria/kyria.dtsi @@ -7,58 +7,58 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; // | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | // | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | // | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - map = < + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; }; &kscan0 { - row-gpios - = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; &left_encoder { - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - a-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria.keymap b/app/boards/shields/kyria/kyria.keymap index a8804dd9..9a2163db 100644 --- a/app/boards/shields/kyria/kyria.keymap +++ b/app/boards/shields/kyria/kyria.keymap @@ -8,23 +8,23 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index 1e61cc6b..2e10cd37 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -7,54 +7,54 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - }; + diode-direction = "col2row"; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - // TODO: RGB node(s) + // TODO: RGB node(s) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <64>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <63>; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <63>; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/kyria/kyria_left.overlay b/app/boards/shields/kyria/kyria_left.overlay index 20ced548..d89a0775 100644 --- a/app/boards/shields/kyria/kyria_left.overlay +++ b/app/boards/shields/kyria/kyria_left.overlay @@ -7,18 +7,18 @@ #include "kyria.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev2.dtsi b/app/boards/shields/kyria/kyria_rev2.dtsi index b40af365..e61131bf 100644 --- a/app/boards/shields/kyria/kyria_rev2.dtsi +++ b/app/boards/shields/kyria/kyria_rev2.dtsi @@ -7,49 +7,49 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) - >; - }; + >; + }; // | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | // | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | // | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - map = < + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) - >; - }; + >; + }; }; &left_encoder { - a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria_rev2.keymap b/app/boards/shields/kyria/kyria_rev2.keymap index a8804dd9..9a2163db 100644 --- a/app/boards/shields/kyria/kyria_rev2.keymap +++ b/app/boards/shields/kyria/kyria_rev2.keymap @@ -8,23 +8,23 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_rev2_left.overlay b/app/boards/shields/kyria/kyria_rev2_left.overlay index cee2e2a8..67eaeac2 100644 --- a/app/boards/shields/kyria/kyria_rev2_left.overlay +++ b/app/boards/shields/kyria/kyria_rev2_left.overlay @@ -7,24 +7,24 @@ #include "kyria_rev2.dtsi" &kscan0 { - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 9e29c6f7..acc806cf 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -7,32 +7,32 @@ #include "kyria_rev2.dtsi" &default_transform { - col-offset = <8>; + col-offset = <8>; }; &five_column_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan0 { - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev3.dtsi b/app/boards/shields/kyria/kyria_rev3.dtsi index 4a500006..0cf91c60 100644 --- a/app/boards/shields/kyria/kyria_rev3.dtsi +++ b/app/boards/shields/kyria/kyria_rev3.dtsi @@ -7,35 +7,35 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | - // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | - // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | - // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | + // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | + // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | + // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) + >; + }; }; &left_encoder { - resolution = <2>; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - resolution = <2>; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria_rev3.keymap b/app/boards/shields/kyria/kyria_rev3.keymap index fff2e051..d74757ca 100644 --- a/app/boards/shields/kyria/kyria_rev3.keymap +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -9,30 +9,30 @@ /* Uncomment this block if using RGB &led_strip { - chain-length = <6>; - // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs - // chain-length = <25>; // Uncomment if using only per-key LEDs. + chain-length = <6>; + // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <25>; // Uncomment if using only per-key LEDs. }; */ / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // --------------------------------------------------------------------------------------------------------------------------------- - // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | - // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | - // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | + // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_rev3_left.overlay b/app/boards/shields/kyria/kyria_rev3_left.overlay index d00b9e4a..577b89dc 100644 --- a/app/boards/shields/kyria/kyria_rev3_left.overlay +++ b/app/boards/shields/kyria/kyria_rev3_left.overlay @@ -7,23 +7,23 @@ #include "kyria_rev3.dtsi" &kscan0 { - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev3_right.overlay b/app/boards/shields/kyria/kyria_rev3_right.overlay index ee69730c..88ed6589 100644 --- a/app/boards/shields/kyria/kyria_rev3_right.overlay +++ b/app/boards/shields/kyria/kyria_rev3_right.overlay @@ -7,27 +7,27 @@ #include "kyria_rev3.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index 00ba5b2f..72d97027 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -7,27 +7,27 @@ #include "kyria.dtsi" &default_transform { - col-offset = <8>; + col-offset = <8>; }; &five_column_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index d5bfab3d..7388a4b9 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -4,28 +4,28 @@ if SHIELD_LEELOO_LEFT config ZMK_KEYBOARD_NAME - default "Leeloo" + default "Leeloo" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY @@ -33,16 +33,16 @@ if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/leeloo/Kconfig.shield b/app/boards/shields/leeloo/Kconfig.shield index 1736c6eb..46ea9640 100644 --- a/app/boards/shields/leeloo/Kconfig.shield +++ b/app/boards/shields/leeloo/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LEELOO_LEFT - def_bool $(shields_list_contains,leeloo_left) + def_bool $(shields_list_contains,leeloo_left) config SHIELD_LEELOO_RIGHT - def_bool $(shields_list_contains,leeloo_right) + def_bool $(shields_list_contains,leeloo_right) diff --git a/app/boards/shields/leeloo/leeloo.dtsi b/app/boards/shields/leeloo/leeloo.dtsi index 5f2cbeac..438f9a9d 100644 --- a/app/boards/shields/leeloo/leeloo.dtsi +++ b/app/boards/shields/leeloo/leeloo.dtsi @@ -67,21 +67,21 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/leeloo/leeloo_left.overlay b/app/boards/shields/leeloo/leeloo_left.overlay index 1d6424fd..59fce1b0 100644 --- a/app/boards/shields/leeloo/leeloo_left.overlay +++ b/app/boards/shields/leeloo/leeloo_left.overlay @@ -6,16 +6,16 @@ #include "leeloo.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/leeloo/leeloo_right.overlay b/app/boards/shields/leeloo/leeloo_right.overlay index 2f3fbf5c..80e89529 100644 --- a/app/boards/shields/leeloo/leeloo_right.overlay +++ b/app/boards/shields/leeloo/leeloo_right.overlay @@ -6,20 +6,20 @@ #include "leeloo.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index 97cecce1..e77a9c22 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_LILY58_LEFT config ZMK_KEYBOARD_NAME - default "Lily58" + default "Lily58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LILY58_LEFT || SHIELD_LILY58_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lily58/Kconfig.shield b/app/boards/shields/lily58/Kconfig.shield index 932e33b3..1b3bb6ba 100644 --- a/app/boards/shields/lily58/Kconfig.shield +++ b/app/boards/shields/lily58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LILY58_LEFT - def_bool $(shields_list_contains,lily58_left) + def_bool $(shields_list_contains,lily58_left) config SHIELD_LILY58_RIGHT - def_bool $(shields_list_contains,lily58_right) + def_bool $(shields_list_contains,lily58_right) diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 1a296a8c..ec520f6b 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -7,75 +7,75 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/lily58/lily58.keymap b/app/boards/shields/lily58/lily58.keymap index dd935c7a..7df3277f 100644 --- a/app/boards/shields/lily58/lily58.keymap +++ b/app/boards/shields/lily58/lily58.keymap @@ -10,61 +10,61 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | // | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp TILDE &trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/shields/lily58/lily58_left.overlay b/app/boards/shields/lily58/lily58_left.overlay index daa53651..b95332d9 100644 --- a/app/boards/shields/lily58/lily58_left.overlay +++ b/app/boards/shields/lily58/lily58_left.overlay @@ -7,16 +7,16 @@ #include "lily58.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lily58/lily58_right.overlay b/app/boards/shields/lily58/lily58_right.overlay index 18ec806b..15820ad2 100644 --- a/app/boards/shields/lily58/lily58_right.overlay +++ b/app/boards/shields/lily58/lily58_right.overlay @@ -7,16 +7,16 @@ #include "lily58.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index b6bb37d8..62695c20 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_LOTUS58_LEFT config ZMK_KEYBOARD_NAME - default "Lotus58" + default "Lotus58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LOTUS58_LEFT || SHIELD_LOTUS58_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lotus58/Kconfig.shield b/app/boards/shields/lotus58/Kconfig.shield index dbf7ba01..2d91c58c 100644 --- a/app/boards/shields/lotus58/Kconfig.shield +++ b/app/boards/shields/lotus58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LOTUS58_LEFT - def_bool $(shields_list_contains,lotus58_left) + def_bool $(shields_list_contains,lotus58_left) config SHIELD_LOTUS58_RIGHT - def_bool $(shields_list_contains,lotus58_right) + def_bool $(shields_list_contains,lotus58_right) diff --git a/app/boards/shields/lotus58/lotus58_left.overlay b/app/boards/shields/lotus58/lotus58_left.overlay index a51659df..a1fc1e28 100644 --- a/app/boards/shields/lotus58/lotus58_left.overlay +++ b/app/boards/shields/lotus58/lotus58_left.overlay @@ -7,16 +7,16 @@ #include "lotus58.dtsi" &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lotus58/lotus58_right.overlay b/app/boards/shields/lotus58/lotus58_right.overlay index dffcaeb1..5bdfe710 100644 --- a/app/boards/shields/lotus58/lotus58_right.overlay +++ b/app/boards/shields/lotus58/lotus58_right.overlay @@ -7,20 +7,20 @@ #include "lotus58.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/m60/Kconfig.defconfig b/app/boards/shields/m60/Kconfig.defconfig index ad105ed9..a4696954 100644 --- a/app/boards/shields/m60/Kconfig.defconfig +++ b/app/boards/shields/m60/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_M60 config ZMK_KEYBOARD_NAME - default "m60" + default "m60" endif diff --git a/app/boards/shields/m60/Kconfig.shield b/app/boards/shields/m60/Kconfig.shield index 4ed58c49..b1414b96 100644 --- a/app/boards/shields/m60/Kconfig.shield +++ b/app/boards/shields/m60/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_M60 - def_bool $(shields_list_contains,m60) + def_bool $(shields_list_contains,m60) diff --git a/app/boards/shields/m60/m60.keymap b/app/boards/shields/m60/m60.keymap index aa656929..8daa6b7c 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.keymap @@ -9,10 +9,10 @@ #include / { - keymap0: keymap { - compatible = "zmk,keymap"; + keymap0: keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | @@ -20,23 +20,23 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | CTL | WIN | ALT | SPACE | ALT | MO(1) | WIN | CTRL | // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RGUI &kp RCTRL - >; - }; + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RGUI &kp RCTRL + >; + }; - fn_layer { - bindings = < + fn_layer { + bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader &trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &sys_reset &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &none &none &trans &trans &none &none &none &none &none &none &none &none &none &none &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/m60/m60.overlay b/app/boards/shields/m60/m60.overlay index 18d06511..a2ab2593 100644 --- a/app/boards/shields/m60/m60.overlay +++ b/app/boards/shields/m60/m60.overlay @@ -7,42 +7,42 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio0 19 GPIO_ACTIVE_HIGH> - , <&gpio0 20 GPIO_ACTIVE_HIGH> - , <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 22 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 24 GPIO_ACTIVE_HIGH> - , <&gpio0 25 GPIO_ACTIVE_HIGH> - , <&gpio0 26 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 20 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 22 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 24 GPIO_ACTIVE_HIGH> + , <&gpio0 25 GPIO_ACTIVE_HIGH> + , <&gpio0 26 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <8>; - rows = <8>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <8>; // | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | MX13 | MX14 | // | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | MX21 | MX22 | MX23 | MX24 | MX25 | MX26 | MX27 | MX28 | // | MX29 | MX30 | MX31 | MX32 | MX33 | MX34 | MX35 | MX36 | MX37 | MX38 | MX39 | MX40 | MX41 | @@ -55,6 +55,6 @@ RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4 RC(6,4) RC(6,3) RC(6,2) RC(6,1) RC(6,0) RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(6,5) RC(6,6) RC(6,7) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) >; - }; + }; }; diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 8c0b042e..d05ae045 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_MICRODOX_LEFT config ZMK_KEYBOARD_NAME - default "Microdox" + default "Microdox" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/microdox/Kconfig.shield b/app/boards/shields/microdox/Kconfig.shield index ac79eab6..47543760 100644 --- a/app/boards/shields/microdox/Kconfig.shield +++ b/app/boards/shields/microdox/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_MICRODOX_LEFT - def_bool $(shields_list_contains,microdox_left) + def_bool $(shields_list_contains,microdox_left) config SHIELD_MICRODOX_RIGHT - def_bool $(shields_list_contains,microdox_right) + def_bool $(shields_list_contains,microdox_right) diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/microdox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index e3fabb3e..e02aa554 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -7,59 +7,59 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 | // | SW11 | SW12 | SW13 | SW14 | SW15 | | SW15 | SW14 | SW13 | SW12 | SW11 | // | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/microdox/microdox_left.overlay b/app/boards/shields/microdox/microdox_left.overlay index 307776e7..d38f50da 100644 --- a/app/boards/shields/microdox/microdox_left.overlay +++ b/app/boards/shields/microdox/microdox_left.overlay @@ -7,11 +7,11 @@ #include "microdox.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/microdox/microdox_right.overlay b/app/boards/shields/microdox/microdox_right.overlay index 5475c31f..4dd29016 100644 --- a/app/boards/shields/microdox/microdox_right.overlay +++ b/app/boards/shields/microdox/microdox_right.overlay @@ -7,20 +7,20 @@ #include "microdox.dtsi" &default_transform { - col-offset = <5>; + col-offset = <5>; }; &oled { - segment-remap; - com-invdir; + segment-remap; + com-invdir; }; &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 07e71826..80e65351 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -4,34 +4,34 @@ if SHIELD_MURPHPAD config ZMK_KEYBOARD_NAME - default "MurphPad" + default "MurphPad" if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/murphpad/Kconfig.shield b/app/boards/shields/murphpad/Kconfig.shield index 389caa26..1c961aea 100644 --- a/app/boards/shields/murphpad/Kconfig.shield +++ b/app/boards/shields/murphpad/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_MURPHPAD - def_bool $(shields_list_contains,murphpad) \ No newline at end of file + def_bool $(shields_list_contains,murphpad) \ No newline at end of file diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index 3e2241a2..ac6c51d5 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay index 3e2241a2..ac6c51d5 100644 --- a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index b7fead60..13905092 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -7,69 +7,69 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + diode-direction = "col2row"; + row-gpios + = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_2: encoder_2 { - compatible = "alps,ec11"; - label = "Encoder 2"; - a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "Encoder 2"; + a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index d5e8cbeb..31ac7cfe 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -4,38 +4,38 @@ if SHIELD_NIBBLE config ZMK_KEYBOARD_NAME - default "NIBBLE" + default "NIBBLE" config ZMK_USB - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nibble/Kconfig.shield b/app/boards/shields/nibble/Kconfig.shield index 44364f4e..cb6fd15e 100644 --- a/app/boards/shields/nibble/Kconfig.shield +++ b/app/boards/shields/nibble/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NIBBLE - def_bool $(shields_list_contains,nibble) + def_bool $(shields_list_contains,nibble) diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index 54ab9fec..45c55263 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay index 54ab9fec..45c55263 100644 --- a/app/boards/shields/nibble/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/nibble/nibble.keymap b/app/boards/shields/nibble/nibble.keymap index c02aad75..5b90f6c1 100644 --- a/app/boards/shields/nibble/nibble.keymap +++ b/app/boards/shields/nibble/nibble.keymap @@ -9,39 +9,39 @@ #include / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_1>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "Default"; + default_layer { + label = "Default"; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp HOME &kp C_MUTE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp DEL &trans &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &trans &kp LSHFT &trans &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &trans &kp LCTRL &kp LGUI &kp LALT &kp SPACE &mo 1 &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; - function_layer { - label = "Function"; + >; + }; + function_layer { + label = "Function"; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - bindings = < + bindings = < &kp TILDE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &kp END &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_PRV &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &kp C_PREV &kp C_PP &kp C_NEXT - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index baf1eb10..cd117640 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -7,69 +7,69 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "okay"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-demux"; - label = "KSCAN"; - polling-interval-msec = <25>; - input-gpios - = <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-demux"; + label = "KSCAN"; + polling-interval-msec = <25>; + input-gpios + = <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) RC(3,0) RC(3,1) RC(0,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) RC(3,15) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) - >; - }; + >; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index 22c5f647..d2378409 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -4,24 +4,24 @@ if SHIELD_NICE_VIEW config ZMK_DISPLAY - select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_26 if ZMK_DISPLAY config SPI - default y + default y config LS0XX - default y + default y config ZMK_WIDGET_WPM_STATUS - default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL + default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # ZMK_DISPLAY diff --git a/app/boards/shields/nice_view/Kconfig.shield b/app/boards/shields/nice_view/Kconfig.shield index 55cba788..fbe4fde8 100644 --- a/app/boards/shields/nice_view/Kconfig.shield +++ b/app/boards/shields/nice_view/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NICE_VIEW - def_bool $(shields_list_contains,nice_view) + def_bool $(shields_list_contains,nice_view) diff --git a/app/boards/shields/nice_view/nice_view.overlay b/app/boards/shields/nice_view/nice_view.overlay index eacdd41a..49ce0f23 100644 --- a/app/boards/shields/nice_view/nice_view.overlay +++ b/app/boards/shields/nice_view/nice_view.overlay @@ -5,19 +5,19 @@ */ &nice_view_spi { - status = "okay"; - nice_view: ls0xx@0 { - compatible = "sharp,ls0xx"; - label = "DISPLAY"; - spi-max-frequency = <1000000>; - reg = <0>; - width = <160>; - height = <68>; - }; + status = "okay"; + nice_view: ls0xx@0 { + compatible = "sharp,ls0xx"; + label = "DISPLAY"; + spi-max-frequency = <1000000>; + reg = <0>; + width = <160>; + height = <68>; + }; }; / { - chosen { - zephyr,display = &nice_view; - }; + chosen { + zephyr,display = &nice_view; + }; }; diff --git a/app/boards/shields/nice_view_adapter/Kconfig.shield b/app/boards/shields/nice_view_adapter/Kconfig.shield index bf9ba7cb..f95a209c 100644 --- a/app/boards/shields/nice_view_adapter/Kconfig.shield +++ b/app/boards/shields/nice_view_adapter/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NICE_VIEW_ADAPTER - def_bool $(shields_list_contains,nice_view_adapter) + def_bool $(shields_list_contains,nice_view_adapter) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index d9cc0835..e00b599c 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 2a1b757d..45ba34de 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 2a1b757d..45ba34de 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 1cd19db9..5b5dbfb1 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/pancake/Kconfig.shield b/app/boards/shields/pancake/Kconfig.shield index 784d25a4..ca00d303 100644 --- a/app/boards/shields/pancake/Kconfig.shield +++ b/app/boards/shields/pancake/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_PANCAKE - def_bool $(shields_list_contains,pancake) \ No newline at end of file + def_bool $(shields_list_contains,pancake) \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.defconfig b/app/boards/shields/quefrency/Kconfig.defconfig index 28e46a56..db618287 100644 --- a/app/boards/shields/quefrency/Kconfig.defconfig +++ b/app/boards/shields/quefrency/Kconfig.defconfig @@ -5,16 +5,16 @@ if SHIELD_QUEFRENCY_LEFT config ZMK_KEYBOARD_NAME - default "Quefrency" + default "Quefrency" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_QUEFRENCY_LEFT || SHIELD_QUEFRENCY_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.shield b/app/boards/shields/quefrency/Kconfig.shield index d205e58f..d30d30f1 100644 --- a/app/boards/shields/quefrency/Kconfig.shield +++ b/app/boards/shields/quefrency/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_QUEFRENCY_LEFT - def_bool $(shields_list_contains,quefrency_left) + def_bool $(shields_list_contains,quefrency_left) config SHIELD_QUEFRENCY_RIGHT - def_bool $(shields_list_contains,quefrency_right) + def_bool $(shields_list_contains,quefrency_right) diff --git a/app/boards/shields/quefrency/quefrency.dtsi b/app/boards/shields/quefrency/quefrency.dtsi index c9cb7d43..f7dc4489 100644 --- a/app/boards/shields/quefrency/quefrency.dtsi +++ b/app/boards/shields/quefrency/quefrency.dtsi @@ -7,26 +7,26 @@ #include / { - chosen { - zmk,kscan = &kscan0; + chosen { + zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + zmk,matrix_transform = &default_transform; + }; - /* - * This transform correspondsto the 60% left without macro keypad and 65% right, even this - * combination of PCBs can have keys in different locations based on configuration. - */ - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <6>; - map = < + /* + * This transform correspondsto the 60% left without macro keypad and 65% right, even this + * combination of PCBs can have keys in different locations based on configuration. + */ + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <6>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(5,14) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) - >; - }; + >; + }; }; diff --git a/app/boards/shields/redox/Kconfig.defconfig b/app/boards/shields/redox/Kconfig.defconfig index bf122b5e..32e30ad5 100644 --- a/app/boards/shields/redox/Kconfig.defconfig +++ b/app/boards/shields/redox/Kconfig.defconfig @@ -3,16 +3,16 @@ if SHIELD_REDOX_LEFT config ZMK_KEYBOARD_NAME - default "Redox" + default "Redox" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_REDOX_LEFT || SHIELD_REDOX_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/redox/Kconfig.shield b/app/boards/shields/redox/Kconfig.shield index 2df91c11..8e6c601d 100644 --- a/app/boards/shields/redox/Kconfig.shield +++ b/app/boards/shields/redox/Kconfig.shield @@ -1,7 +1,7 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT config SHIELD_REDOX_LEFT - def_bool $(shields_list_contains,redox_left) + def_bool $(shields_list_contains,redox_left) config SHIELD_REDOX_RIGHT - def_bool $(shields_list_contains,redox_right) + def_bool $(shields_list_contains,redox_right) diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/redox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/redox/redox.dtsi b/app/boards/shields/redox/redox.dtsi index 9c0705a6..d2d72d0f 100644 --- a/app/boards/shields/redox/redox.dtsi +++ b/app/boards/shields/redox/redox.dtsi @@ -7,42 +7,42 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | SW13 | | SW13 | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW14 | SW15 | SW16 | SW17 | SW18 | SW19 | SW20 | | SW20 | SW19 | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW21 | SW22 | SW23 | SW24 | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 | SW24 | SW23 | SW22 | SW21 | // | SW29 | SW30 | SW31 | SW32 | SW33 | SW34 | SW35 | | SW35 | SW34 | SW33 | SW32 | SW31 | SW30 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(0,6) RC(0,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(1,6) RC(1,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(2,6) RC(3,6) RC(3,7) RC(2,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/redox/redox_left.overlay b/app/boards/shields/redox/redox_left.overlay index 322dca79..d68029d8 100644 --- a/app/boards/shields/redox/redox_left.overlay +++ b/app/boards/shields/redox/redox_left.overlay @@ -7,13 +7,13 @@ #include "redox.dtsi" &kscan0 { - col-gpios - = <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/redox/redox_right.overlay b/app/boards/shields/redox/redox_right.overlay index f2dcfed0..09b14637 100644 --- a/app/boards/shields/redox/redox_right.overlay +++ b/app/boards/shields/redox/redox_right.overlay @@ -7,17 +7,17 @@ #include "redox.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index 741237e1..8590149e 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <11>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <11>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay index 741237e1..8590149e 100644 --- a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <11>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <11>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac/Kconfig.defconfig b/app/boards/shields/romac/Kconfig.defconfig index 53527971..5cd94faa 100644 --- a/app/boards/shields/romac/Kconfig.defconfig +++ b/app/boards/shields/romac/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_ROMAC config ZMK_KEYBOARD_NAME - default "RoMac" + default "RoMac" endif diff --git a/app/boards/shields/romac/Kconfig.shield b/app/boards/shields/romac/Kconfig.shield index 59669d33..9bdd2c5f 100644 --- a/app/boards/shields/romac/Kconfig.shield +++ b/app/boards/shields/romac/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ROMAC - def_bool $(shields_list_contains,romac) + def_bool $(shields_list_contains,romac) diff --git a/app/boards/shields/romac/romac.overlay b/app/boards/shields/romac/romac.overlay index 827273a4..480d3f84 100644 --- a/app/boards/shields/romac/romac.overlay +++ b/app/boards/shields/romac/romac.overlay @@ -7,28 +7,28 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; - }; + }; }; diff --git a/app/boards/shields/romac_plus/Kconfig.defconfig b/app/boards/shields/romac_plus/Kconfig.defconfig index c4efdb97..442bc0bd 100644 --- a/app/boards/shields/romac_plus/Kconfig.defconfig +++ b/app/boards/shields/romac_plus/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_ROMAC_PLUS config ZMK_KEYBOARD_NAME - default "RoMac+ v4" + default "RoMac+ v4" endif \ No newline at end of file diff --git a/app/boards/shields/romac_plus/Kconfig.shield b/app/boards/shields/romac_plus/Kconfig.shield index a7c7c614..277f1eb3 100644 --- a/app/boards/shields/romac_plus/Kconfig.shield +++ b/app/boards/shields/romac_plus/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ROMAC_PLUS - def_bool $(shields_list_contains,romac_plus) + def_bool $(shields_list_contains,romac_plus) diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac_plus/romac_plus.dtsi b/app/boards/shields/romac_plus/romac_plus.dtsi index 0fd4374a..71ec87b2 100644 --- a/app/boards/shields/romac_plus/romac_plus.dtsi +++ b/app/boards/shields/romac_plus/romac_plus.dtsi @@ -7,50 +7,50 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <3>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <3>; + rows = <4>; - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(1,0) RC(1,1) RC(1,2) RC(2,0) RC(2,1) RC(2,2) RC(3,0) RC(3,1) RC(3,2) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; \ No newline at end of file diff --git a/app/boards/shields/romac_plus/romac_plus.overlay b/app/boards/shields/romac_plus/romac_plus.overlay index 4ef38744..2308e284 100644 --- a/app/boards/shields/romac_plus/romac_plus.overlay +++ b/app/boards/shields/romac_plus/romac_plus.overlay @@ -7,22 +7,22 @@ #include "romac_plus.dtsi" / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; + }; }; diff --git a/app/boards/shields/settings_reset/Kconfig.defconfig b/app/boards/shields/settings_reset/Kconfig.defconfig index 6d050cb4..05f3b406 100644 --- a/app/boards/shields/settings_reset/Kconfig.defconfig +++ b/app/boards/shields/settings_reset/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_SETTINGS_RESET config ZMK_KEYBOARD_NAME - default "SETTINGS RESET" + default "SETTINGS RESET" endif diff --git a/app/boards/shields/settings_reset/Kconfig.shield b/app/boards/shields/settings_reset/Kconfig.shield index b5ce97f9..b1e6ed0e 100644 --- a/app/boards/shields/settings_reset/Kconfig.shield +++ b/app/boards/shields/settings_reset/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_SETTINGS_RESET - def_bool $(shields_list_contains,settings_reset) + def_bool $(shields_list_contains,settings_reset) diff --git a/app/boards/shields/settings_reset/settings_reset.overlay b/app/boards/shields/settings_reset/settings_reset.overlay index 51e04ba7..77a9d858 100644 --- a/app/boards/shields/settings_reset/settings_reset.overlay +++ b/app/boards/shields/settings_reset/settings_reset.overlay @@ -7,18 +7,18 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index c4a67e65..e21111e9 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_SNAP_LEFT config ZMK_KEYBOARD_NAME - default "SNAP" + default "SNAP" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SNAP_LEFT || SHIELD_SNAP_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/snap/Kconfig.shield b/app/boards/shields/snap/Kconfig.shield index eb02c45f..edbd1b57 100644 --- a/app/boards/shields/snap/Kconfig.shield +++ b/app/boards/shields/snap/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SNAP_LEFT - def_bool $(shields_list_contains,snap_left) + def_bool $(shields_list_contains,snap_left) config SHIELD_SNAP_RIGHT - def_bool $(shields_list_contains,snap_right) + def_bool $(shields_list_contains,snap_right) diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index 28e9ce69..1a51eb16 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index 28e9ce69..1a51eb16 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi index 77070db9..a374ad17 100644 --- a/app/boards/shields/snap/snap.dtsi +++ b/app/boards/shields/snap/snap.dtsi @@ -7,30 +7,30 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan_composite; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan_composite; + zmk,matrix_transform = &default_transform; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <17>; - rows = <6>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <17>; + rows = <6>; // | R0C06L | R0C05L | R0C04L | R0C03L | R0C02L | R0C01L | R0C00L | | R0C15R | R0C14R | R0C13R | R0C12R | R0C11R | R0C10R | R0C09R | R0C08R | // R1C07L | R1C06L | R1C05L | R1C04L | R1C03L | R1C02L | R1C01L | R1C00L | | R1C15R | R1C14R | R1C13R | R1C12R | R1C11R | R1C10R | R1C09R | R1C08R | R2C0XR | @@ -39,48 +39,48 @@ // R4C07L | R4C06L | R4C05L | R4C04L | R4C03L | R4C02L | R4C01L | R4C00L | | R4C15R | R4C14R | R4C13R | R4C12R | R4C11R | R4C10R | R4C09R | R5C08R | // R5C07L | R5C06L | R5C05L | R5C04L | R5C02L | R5C00L | | R5C15R | R5C14R | R5C13R | R5C12R | R5C11R | R5C10R | R5C09R | - map = < - RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) + map = < + RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,15) RC(1,14) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,16) RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,0) RC(2,15) RC(2,14) RC(2,13) RC(2,12) RC(2,11) RC(2,10) RC(2,9) RC(3,8) RC(2,8) RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,0) RC(3,15) RC(3,14) RC(3,13) RC(3,12) RC(3,11) RC(3,10) RC(3,9) RC(4,8) RC(4,7) RC(4,6) RC(4,5) RC(4,4) RC(4,3) RC(4,2) RC(4,1) RC(4,0) RC(4,15) RC(4,14) RC(4,13) RC(4,12) RC(4,11) RC(4,10) RC(4,9) RC(5,8) RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) RC(5,14) RC(5,13) RC(5,12) RC(5,11) RC(5,10) RC(5,9) - >; - }; + >; + }; - kscan_composite: kscan { - compatible = "zmk,kscan-composite"; - label = "KSCAN"; - rows = <6>; - columns = <17>; + kscan_composite: kscan { + compatible = "zmk,kscan-composite"; + label = "KSCAN"; + rows = <6>; + columns = <17>; - demux { - kscan = <&kscan_demux>; - }; - }; + demux { + kscan = <&kscan_demux>; + }; + }; - kscan_demux: kscan_demux { - compatible = "zmk,kscan-gpio-demux"; - label = "DEMUX"; - polling-interval-msec = <25>; - }; + kscan_demux: kscan_demux { + compatible = "zmk,kscan-gpio-demux"; + label = "DEMUX"; + polling-interval-msec = <25>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap index cc4c5255..7c750f9f 100644 --- a/app/boards/shields/snap/snap.keymap +++ b/app/boards/shields/snap/snap.keymap @@ -10,38 +10,38 @@ #include / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "Default"; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; - bindings = < + default_layer { + label = "Default"; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; + bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp KP_NUM &kp PAUSE_BREAK &kp C_MUTE &kp TILDE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME &kp F13 &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END &kp F14 &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &kp F15 &kp LSHFT &kp NUHS &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &kp F16 &kp LCTRL &kp LGUI &kp LALT &mo 1 &kp SPACE &kp BSPC &mo 1 &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - function_layer { - label = "Function"; - sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; - bindings = < + function_layer { + label = "Function"; + sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; + bindings = < &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_BRI &rgb_ug RGB_EFF &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_HUI - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/snap/snap_left.overlay b/app/boards/shields/snap/snap_left.overlay index b5b8a841..abbe9450 100644 --- a/app/boards/shields/snap/snap_left.overlay +++ b/app/boards/shields/snap/snap_left.overlay @@ -7,28 +7,28 @@ #include "snap.dtsi" &kscan_demux { - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - ; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - status = "okay"; + a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; }; &oled { - segment-remap; - com-invdir; + segment-remap; + com-invdir; }; diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay index dc71a5cf..ad04ae24 100644 --- a/app/boards/shields/snap/snap_right.overlay +++ b/app/boards/shields/snap/snap_right.overlay @@ -8,44 +8,44 @@ / { kscan_direct: kscan_direct { - compatible = "zmk,kscan-gpio-direct"; - label = "DIRECT"; - input-gpios - = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + compatible = "zmk,kscan-gpio-direct"; + label = "DIRECT"; + input-gpios + = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; &default_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan_composite { - direct { - kscan = <&kscan_direct>; - row-offset = <1>; - column-offset = <8>; - }; + direct { + kscan = <&kscan_direct>; + row-offset = <1>; + column-offset = <8>; + }; }; &kscan_demux { - input-gpios - = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - ; + input-gpios + = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - status = "okay"; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; }; diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index afa710ff..cc598d67 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_SOFLE_LEFT config ZMK_KEYBOARD_NAME - default "Sofle" + default "Sofle" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SOFLE_LEFT || SHIELD_SOFLE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/sofle/Kconfig.shield b/app/boards/shields/sofle/Kconfig.shield index e23a97a1..a865e839 100644 --- a/app/boards/shields/sofle/Kconfig.shield +++ b/app/boards/shields/sofle/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SOFLE_LEFT - def_bool $(shields_list_contains,sofle_left) + def_bool $(shields_list_contains,sofle_left) config SHIELD_SOFLE_RIGHT - def_bool $(shields_list_contains,sofle_right) + def_bool $(shields_list_contains,sofle_right) diff --git a/app/boards/shields/sofle/sofle_left.overlay b/app/boards/shields/sofle/sofle_left.overlay index 13bfb397..057e6050 100644 --- a/app/boards/shields/sofle/sofle_left.overlay +++ b/app/boards/shields/sofle/sofle_left.overlay @@ -7,16 +7,16 @@ #include "sofle.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/sofle/sofle_right.overlay b/app/boards/shields/sofle/sofle_right.overlay index 53b10e60..65e5f330 100644 --- a/app/boards/shields/sofle/sofle_right.overlay +++ b/app/boards/shields/sofle/sofle_right.overlay @@ -7,20 +7,20 @@ #include "sofle.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 03078cd6..a28792c7 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_CORNE_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Corne" + default "Aurora Corne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_CORNE_LEFT if SHIELD_SPLITKB_AURORA_CORNE_LEFT || SHIELD_SPLITKB_AURORA_CORNE_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.shield b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield index 3de10105..1efcdf00 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_CORNE_LEFT - def_bool $(shields_list_contains,splitkb_aurora_corne_left) + def_bool $(shields_list_contains,splitkb_aurora_corne_left) config SHIELD_SPLITKB_AURORA_CORNE_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_corne_right) + def_bool $(shields_list_contains,splitkb_aurora_corne_right) diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi index aa525948..a1b7b643 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi @@ -8,85 +8,85 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - left_encoder: left_encoder { - compatible = "alps,ec11"; - label = "L_ENCODER"; - resolution = <4>; - status = "disabled"; + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 4 GPIO_PULL_UP>; - b-gpios = <&pro_micro 5 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 4 GPIO_PULL_UP>; + b-gpios = <&pro_micro 5 GPIO_PULL_UP>; + }; - right_encoder: right_encoder { - compatible = "alps,ec11"; - label = "R_ENCODER"; - resolution = <4>; - status = "disabled"; + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 19 GPIO_PULL_UP>; - b-gpios = <&pro_micro 18 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 19 GPIO_PULL_UP>; + b-gpios = <&pro_micro 18 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap index 53218a86..0555cf41 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap @@ -35,7 +35,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -49,7 +49,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay index 82234278..89563f42 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -7,36 +7,36 @@ #include "splitkb_aurora_corne.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + label = "KSCAN"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; + row-gpios + = <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; + }; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index c1d34ffd..e05df223 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -7,42 +7,42 @@ #include "splitkb_aurora_corne.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + label = "KSCAN"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; + row-gpios + = <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; + }; }; &right_encoder { - status = "okay"; + status = "okay"; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 221bf90a..e54e2b43 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_LILY58_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Lily58" + default "Aurora Lily58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT if SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield index 35f8b2d1..a64f47dc 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_LILY58_LEFT - def_bool $(shields_list_contains,splitkb_aurora_lily58_left) + def_bool $(shields_list_contains,splitkb_aurora_lily58_left) config SHIELD_SPLITKB_AURORA_LILY58_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_lily58_right) + def_bool $(shields_list_contains,splitkb_aurora_lily58_right) diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index 5b9ce4a8..0eafa704 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -2,46 +2,46 @@ &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index 9e168625..6601d27d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,46 +1,46 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi index 08e2ac9e..908356c7 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi @@ -8,71 +8,71 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) - >; - }; + >; + }; - left_encoder: left_encoder { - compatible = "alps,ec11"; - label = "L_ENCODER"; - resolution = <4>; - status = "disabled"; + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 5 GPIO_PULL_UP>; - b-gpios = <&pro_micro 4 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 5 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + }; - right_encoder: right_encoder { - compatible = "alps,ec11"; - label = "R_ENCODER"; - resolution = <4>; - status = "disabled"; + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 18 GPIO_PULL_UP>; - b-gpios = <&pro_micro 19 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 18 GPIO_PULL_UP>; + b-gpios = <&pro_micro 19 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap index 376bcf26..b8a9103b 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap @@ -10,61 +10,61 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | // | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE &trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay index 10a195ff..c4f12dda 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -7,37 +7,37 @@ #include "splitkb_aurora_lily58.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay index eaebff36..09da298c 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -7,39 +7,39 @@ #include "splitkb_aurora_lily58.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &right_encoder { - status = "okay"; + status = "okay"; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index ac07c935..83cb1bf6 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_SWEEP_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Sweep" + default "Aurora Sweep" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_SWEEP_LEFT if SHIELD_SPLITKB_AURORA_SWEEP_LEFT || SHIELD_SPLITKB_AURORA_SWEEP_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield index abb05282..7d92134c 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_SWEEP_LEFT - def_bool $(shields_list_contains,splitkb_aurora_sweep_left) + def_bool $(shields_list_contains,splitkb_aurora_sweep_left) config SHIELD_SPLITKB_AURORA_SWEEP_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_sweep_right) + def_bool $(shields_list_contains,splitkb_aurora_sweep_right) diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi index a999df6a..ab568a09 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi @@ -8,73 +8,73 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; - map = < - RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) - RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) - RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) - RC(3,1) RC(3,0) RC(3,5) RC(3,6) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; + map = < + RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) + RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) + RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,1) RC(3,0) RC(3,5) RC(3,6) + >; + }; - left_encoder1: left_encoder1 { - compatible = "alps,ec11"; - label = "L_ENCODER1"; - resolution = <4>; - status = "disabled"; - }; + left_encoder1: left_encoder1 { + compatible = "alps,ec11"; + label = "L_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; - left_encoder2: left_encoder2 { - compatible = "alps,ec11"; - label = "L_ENCODER2"; - resolution = <4>; - status = "disabled"; - }; + left_encoder2: left_encoder2 { + compatible = "alps,ec11"; + label = "L_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; - right_encoder1: right_encoder1 { - compatible = "alps,ec11"; - label = "R_ENCODER1"; - resolution = <4>; - status = "disabled"; - }; + right_encoder1: right_encoder1 { + compatible = "alps,ec11"; + label = "R_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; - right_encoder2: right_encoder2 { - compatible = "alps,ec11"; - label = "R_ENCODER2"; - resolution = <4>; - status = "disabled"; - }; + right_encoder2: right_encoder2 { + compatible = "alps,ec11"; + label = "R_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder1 &right_encoder1>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder1 &right_encoder1>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 385d2022..4b57beac 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -62,41 +62,41 @@ keymap { compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT - &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET - &mo 1 &kp LCTL &kp SPC &mo 2 - >; - }; + default_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT + &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET + &mo 1 &kp LCTL &kp SPC &mo 2 + >; + }; - left_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL - &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL - &mo 1 &kp LGUI &kp RGUI &mo 2 - >; - }; + left_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL + &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL + &mo 1 &kp LGUI &kp RGUI &mo 2 + >; + }; - right_layer { - bindings = < - &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN - &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP - &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTL &kp SPC &mo 2 - >; - }; + right_layer { + bindings = < + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP + &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTL &kp SPC &mo 2 + >; + }; - tri_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans - &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans - &trans &trans &trans &trans - >; - }; + tri_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans + &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans + &trans &trans &trans &trans + >; + }; - }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay index 1ff5ed5e..f62d24fa 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -7,42 +7,42 @@ #include "splitkb_aurora_sweep.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &left_encoder1 { - status = "okay"; - a-gpios = <&pro_micro 9 GPIO_PULL_UP>; - b-gpios = <&pro_micro 8 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 9 GPIO_PULL_UP>; + b-gpios = <&pro_micro 8 GPIO_PULL_UP>; }; &left_encoder2 { - status = "okay"; - a-gpios = <&pro_micro 14 GPIO_PULL_UP>; - b-gpios = <&pro_micro 16 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 14 GPIO_PULL_UP>; + b-gpios = <&pro_micro 16 GPIO_PULL_UP>; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay index 81ddca40..ff1d16d3 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -7,45 +7,45 @@ #include "splitkb_aurora_sweep.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &right_encoder1 { - status = "okay"; - a-gpios = <&pro_micro 16 GPIO_PULL_UP>; - b-gpios = <&pro_micro 10 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; }; &right_encoder2 { - status = "okay"; - a-gpios = <&pro_micro 20 GPIO_PULL_UP>; - b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 20 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; }; &default_transform { - col-offset = <5>; + col-offset = <5>; }; diff --git a/app/boards/shields/splitreus62/Kconfig.defconfig b/app/boards/shields/splitreus62/Kconfig.defconfig index 14063d3e..52d62c9d 100644 --- a/app/boards/shields/splitreus62/Kconfig.defconfig +++ b/app/boards/shields/splitreus62/Kconfig.defconfig @@ -6,16 +6,16 @@ if SHIELD_SPLITREUS62_LEFT config ZMK_KEYBOARD_NAME - default "Splitreus62" + default "Splitreus62" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SPLITREUS62_LEFT || SHIELD_SPLITREUS62_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/splitreus62/Kconfig.shield b/app/boards/shields/splitreus62/Kconfig.shield index 762d991b..951ab9fb 100644 --- a/app/boards/shields/splitreus62/Kconfig.shield +++ b/app/boards/shields/splitreus62/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITREUS62_LEFT - def_bool $(shields_list_contains,splitreus62_left) + def_bool $(shields_list_contains,splitreus62_left) config SHIELD_SPLITREUS62_RIGHT - def_bool $(shields_list_contains,splitreus62_right) + def_bool $(shields_list_contains,splitreus62_right) diff --git a/app/boards/shields/splitreus62/splitreus62.dtsi b/app/boards/shields/splitreus62/splitreus62.dtsi index 905605e9..abc3b7f7 100644 --- a/app/boards/shields/splitreus62/splitreus62.dtsi +++ b/app/boards/shields/splitreus62/splitreus62.dtsi @@ -7,44 +7,44 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <6>; -// | SW0 | SW5 | SW10 | SW15 | SW20 | SW25 | SW25 | SW20 | SW15 | SW10 | SW5 | SW1 | -// | SW1 | SW6 | SW11 | SW16 | SW21 | SW26 | SW26 | SW21 | SW16 | SW11 | SW6 | SW2 | -// | SW2 | SW7 | SW12 | SW17 | SW22 | SW27 | SW27 | SW22 | SW17 | SW12 | SW7 | SW3 | -// | SW3 | SW8 | SW13 | SW18 | SW23 | SW28 | SW28 | SW23 | SW18 | SW13 | SW8 | SW4 | + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <6>; +// | SW0 | SW5 | SW10 | SW15 | SW20 | SW25 | SW25 | SW20 | SW15 | SW10 | SW5 | SW1 | +// | SW1 | SW6 | SW11 | SW16 | SW21 | SW26 | SW26 | SW21 | SW16 | SW11 | SW6 | SW2 | +// | SW2 | SW7 | SW12 | SW17 | SW22 | SW27 | SW27 | SW22 | SW17 | SW12 | SW7 | SW3 | +// | SW3 | SW8 | SW13 | SW18 | SW23 | SW28 | SW28 | SW23 | SW18 | SW13 | SW8 | SW4 | // | SW4 | SW9 | SW14 | SW19 | SW24 | SW29 | SW29 | SW24 | SW19 | SW14 | SW9 | SW5 | // SW30 | SW30 - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(5,5) RC(5,6) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "row2col"; - row-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH > - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - ; + diode-direction = "row2col"; + row-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH > + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + ; - }; + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62.keymap b/app/boards/shields/splitreus62/splitreus62.keymap index c1b0f50f..c7bdb443 100644 --- a/app/boards/shields/splitreus62/splitreus62.keymap +++ b/app/boards/shields/splitreus62/splitreus62.keymap @@ -9,24 +9,24 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | | N | M | , | . | / | SHIFT | // | LCTL | LGUI | LALT | GRAV | | EQL | DEL | BKSP| | RET | SPC | LBKT | RBKT | LBKT | HOME | END | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LCTRL &kp LGUI &kp LALT &kp GRAVE &kp EQUAL &kp DEL &kp SPACE &kp LBKT &kp RBKT &kp MINUS &kp HOME &kp END &kp BSPC &kp RET - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62_left.overlay b/app/boards/shields/splitreus62/splitreus62_left.overlay index ba5c21ff..992eb0db 100644 --- a/app/boards/shields/splitreus62/splitreus62_left.overlay +++ b/app/boards/shields/splitreus62/splitreus62_left.overlay @@ -7,12 +7,12 @@ #include "splitreus62.dtsi" &kscan0 { - col-gpios - = <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; diff --git a/app/boards/shields/splitreus62/splitreus62_right.overlay b/app/boards/shields/splitreus62/splitreus62_right.overlay index 9f76e7eb..d83db26d 100644 --- a/app/boards/shields/splitreus62/splitreus62_right.overlay +++ b/app/boards/shields/splitreus62/splitreus62_right.overlay @@ -7,16 +7,16 @@ #include "splitreus62.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; diff --git a/app/boards/shields/tg4x/Kconfig.shield b/app/boards/shields/tg4x/Kconfig.shield index 27166b10..d7fc1c13 100644 --- a/app/boards/shields/tg4x/Kconfig.shield +++ b/app/boards/shields/tg4x/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TG4X - def_bool $(shields_list_contains,tg4x) + def_bool $(shields_list_contains,tg4x) diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index 54046bf5..85ab6fbc 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay index 54046bf5..85ab6fbc 100644 --- a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tg4x/tg4x.keymap b/app/boards/shields/tg4x/tg4x.keymap index e68d0f92..89a478ae 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -9,46 +9,46 @@ #include / { - behaviors { - ht: hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "Hold Tap"; - #binding-cells = <2>; - tapping-term-ms = <200>; - flavor = "tap-preferred"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht: hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "Hold Tap"; + #binding-cells = <2>; + tapping-term-ms = <200>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp SEMI &kp BSPC &ht CAPS TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp APOS &kp RET &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp RSHFT &kp LCTRL &kp LGUI &kp LALT < 1 SPACE &kp SPACE &kp RALT &kp RGUI &mo 2 &kp RCTRL - >; - }; + >; + }; - function_layer { - bindings = < + function_layer { + bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp DEL &none &kp HOME &kp PG_UP &trans &trans &trans &kp LBKT &kp RBKT &kp EQUAL &kp BSLH &kp FSLH &trans &trans &kp END &kp PG_DN &trans &trans &trans &trans &trans &trans &kp UP &trans &trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - other_layer { - bindings = < + other_layer { + bindings = < &kp PRINTSCREEN &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &sys_reset &trans &trans &trans &trans &trans &trans &kp C_VOL_UP &kp C_VOL_DN &kp C_PP - >; - }; + >; + }; - }; + }; }; diff --git a/app/boards/shields/tg4x/tg4x.overlay b/app/boards/shields/tg4x/tg4x.overlay index ca6e23c3..c0b1b3bc 100644 --- a/app/boards/shields/tg4x/tg4x.overlay +++ b/app/boards/shields/tg4x/tg4x.overlay @@ -7,49 +7,49 @@ #include / { - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - rows = <8>; - columns = <7>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + rows = <8>; + columns = <7>; - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(6,0) RC(6,1) RC(6,2) RC(6,4) RC(3,0) RC(3,1) RC(3,2) RC(3,4) RC(3,5) RC(7,1) RC(7,2) RC(7,3) RC(7,4) - >; - }; + >; + }; - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; }; diff --git a/app/boards/shields/tidbit/Kconfig.defconfig b/app/boards/shields/tidbit/Kconfig.defconfig index e3655a9e..393fbef1 100644 --- a/app/boards/shields/tidbit/Kconfig.defconfig +++ b/app/boards/shields/tidbit/Kconfig.defconfig @@ -4,35 +4,35 @@ if SHIELD_TIDBIT config ZMK_KEYBOARD_NAME - default "tidbit" + default "tidbit" if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/tidbit/Kconfig.shield b/app/boards/shields/tidbit/Kconfig.shield index c1e8ecca..dc811bb2 100644 --- a/app/boards/shields/tidbit/Kconfig.shield +++ b/app/boards/shields/tidbit/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TIDBIT - def_bool $(shields_list_contains,tidbit) + def_bool $(shields_list_contains,tidbit) diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tidbit/tidbit.dtsi b/app/boards/shields/tidbit/tidbit.dtsi index ba97a57a..fb84c89e 100644 --- a/app/boards/shields/tidbit/tidbit.dtsi +++ b/app/boards/shields/tidbit/tidbit.dtsi @@ -7,111 +7,111 @@ #include / { - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "row2col"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <4>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <4>; + rows = <5>; - map = < - RC(0,1) RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) - >; - }; + map = < + RC(0,1) RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) + >; + }; - encoder_1_top_row: encoder_1_top_row { - compatible = "alps,ec11"; - label = "Top Row Encoder"; - a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1_top_row: encoder_1_top_row { + compatible = "alps,ec11"; + label = "Top Row Encoder"; + a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_2: encoder_2 { - compatible = "alps,ec11"; - label = "Encoder 2"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "Encoder 2"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_3: encoder_3 { - compatible = "alps,ec11"; - label = "Encoder 3"; - a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_3: encoder_3 { + compatible = "alps,ec11"; + label = "Encoder 3"; + a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_4: encoder_4 { - compatible = "alps,ec11"; - label = "Encoder 4"; - a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_4: encoder_4 { + compatible = "alps,ec11"; + label = "Encoder 4"; + a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 11424dc8..2e415bf8 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -10,40 +10,40 @@ #include &encoder_1_top_row { - status = "okay"; + status = "okay"; }; / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_1_top_row>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1_top_row>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS - &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none - &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER - &none &kp KP_NUMBER_0 &kp KP_DOT &none - >; + default_layer { + bindings = < + &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS + &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none + &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER + &none &kp KP_NUMBER_0 &kp KP_DOT &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; - func_layer { - bindings = < - &none &sys_reset &bootloader - &out OUT_TOG &out OUT_USB &out OUT_BLE &none - &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR - &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 - &kp C_MUTE &none &none &none - >; + func_layer { + bindings = < + &none &sys_reset &bootloader + &out OUT_TOG &out OUT_USB &out OUT_BLE &none + &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR + &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 + &kp C_MUTE &none &none &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; + }; }; diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 5710aeaf..1be71e7a 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -11,40 +11,40 @@ #include &encoder_4 { - status = "okay"; + status = "okay"; }; / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_4>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_4>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &tog 1 &kp KP_NUMLOCK &kp KP_SLASH - &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_ASTERISK - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_MINUS - &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &kp KP_PLUS - &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER - >; + default_layer { + bindings = < + &tog 1 &kp KP_NUMLOCK &kp KP_SLASH + &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_ASTERISK + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_MINUS + &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &kp KP_PLUS + &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; - func_layer { - bindings = < - &tog 0 &sys_reset &bootloader - &out OUT_TOG &out OUT_USB &out OUT_BLE &none - &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR - &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none - &kp C_MUTE &none &none &none - >; + func_layer { + bindings = < + &tog 0 &sys_reset &bootloader + &out OUT_TOG &out OUT_USB &out OUT_BLE &none + &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR + &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none + &kp C_MUTE &none &none &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; + }; }; diff --git a/app/boards/shields/two_percent_milk/Kconfig.shield b/app/boards/shields/two_percent_milk/Kconfig.shield index ec2c3b1f..b6fbcfdc 100644 --- a/app/boards/shields/two_percent_milk/Kconfig.shield +++ b/app/boards/shields/two_percent_milk/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TWO_PERCENT_MILK - def_bool $(shields_list_contains,two_percent_milk) + def_bool $(shields_list_contains,two_percent_milk) diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay index 64d16572..d20e58e7 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay index b84beb93..31678980 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay index 64d16572..d20e58e7 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.overlay b/app/boards/shields/two_percent_milk/two_percent_milk.overlay index d43ed321..8d4a244a 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.overlay +++ b/app/boards/shields/two_percent_milk/two_percent_milk.overlay @@ -5,20 +5,20 @@ */ / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + label = "KSCAN"; - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 5a77ca11..dbee82b8 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_WATERFOWL_LEFT config ZMK_KEYBOARD_NAME - default "Waterfowl" + default "Waterfowl" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_WATERFOWL_LEFT || SHIELD_WATERFOWL_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/waterfowl/Kconfig.shield b/app/boards/shields/waterfowl/Kconfig.shield index a321b73d..ec01a626 100644 --- a/app/boards/shields/waterfowl/Kconfig.shield +++ b/app/boards/shields/waterfowl/Kconfig.shield @@ -3,7 +3,7 @@ config SHIELD_WATERFOWL_LEFT - def_bool $(shields_list_contains,waterfowl_left) + def_bool $(shields_list_contains,waterfowl_left) config SHIELD_WATERFOWL_RIGHT - def_bool $(shields_list_contains,waterfowl_right) + def_bool $(shields_list_contains,waterfowl_right) diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi index a156360e..7f4929b3 100644 --- a/app/boards/shields/waterfowl/waterfowl.dtsi +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -7,79 +7,79 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; -// | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | -// | MX10 | MX9 | MX8 | MX7 | MX6 | | MX6 | MX7 | MX8 | MX9 | MX10 | -// | MX15 | MX14 | MX13 | MX12 | MX11 | | MX11 | MX12 | MX13 | MX14 | MX15 | -// | MX20 | MX19 | MX18 | MX17 | MX16 | | MX16 | MX17 | MX18 | MX19 | MX20 | - map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) -RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; +// | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | +// | MX10 | MX9 | MX8 | MX7 | MX6 | | MX6 | MX7 | MX8 | MX9 | MX10 | +// | MX15 | MX14 | MX13 | MX12 | MX11 | | MX11 | MX12 | MX13 | MX14 | MX15 | +// | MX20 | MX19 | MX18 | MX17 | MX16 | | MX16 | MX17 | MX18 | MX19 | MX20 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - left_encoder: encoder_left { //roller - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; + left_encoder: encoder_left { //roller + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; - right_encoder: encoder_right { //Standard encoder on left half - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <2>; - }; + right_encoder: encoder_right { //Standard encoder on left half + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - // TODO: RGB node(s) + // TODO: RGB node(s) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <64>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <63>; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <63>; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index 9583499c..c47f188b 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -9,10 +9,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { /* QWERTY * * ,----------------------------------. ,----------------------------------. @@ -26,17 +26,17 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &mt LGUI A &mt LALT S &mt LCTRL D &mt LSHFT F &kp G &kp H &mt LSHFT J &mt LCTRL K &mt LALT L &mt LGUI SEMI - &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &mt LGUI A &mt LALT S &mt LCTRL D &mt LSHFT F &kp G &kp H &mt LSHFT J &mt LCTRL K &mt LALT L &mt LGUI SEMI + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - navnum_layer { + navnum_layer { /* NAVNUM * * ,----------------------------------. ,----------------------------------. @@ -50,17 +50,17 @@ * | 1 | | DEL | SPACE | MO(3)| | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &trans &kp PG_UP &kp UP &kp PG_DN &trans &kp FSLH &kp N7 &kp N8 &kp N9 &kp MINUS - &kp HOME &kp LEFT &kp DOWN &kp RIGHT &kp END &kp EQUAL &kp N4 &kp N5 &kp N6 &kp PLUS - &trans &trans &kp INS &trans &trans &kp N0 &kp N1 &kp N2 &kp N3 &kp ASTERISK - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &trans &kp PG_UP &kp UP &kp PG_DN &trans &kp FSLH &kp N7 &kp N8 &kp N9 &kp MINUS + &kp HOME &kp LEFT &kp DOWN &kp RIGHT &kp END &kp EQUAL &kp N4 &kp N5 &kp N6 &kp PLUS + &trans &trans &kp INS &trans &trans &kp N0 &kp N1 &kp N2 &kp N3 &kp ASTERISK + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - symbol_layer { + symbol_layer { /* SYM * * ,----------------------------------. ,----------------------------------. @@ -74,17 +74,17 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &kp PRCNT &kp AT &kp LBKT &kp RBKT &kp NON_US_BSLH &trans &trans &kp CARET &trans &trans - &kp HASH &kp EXCL &kp LPAR &kp RPAR &kp PIPE &kp UNDER &kp APOS &kp DOUBLE_QUOTES &kp TILDE &kp GRAVE - &kp DLLR &trans &kp LBRC &kp RBRC &kp AMPS &trans &trans &trans &trans &trans - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &kp PRCNT &kp AT &kp LBKT &kp RBKT &kp NON_US_BSLH &trans &trans &kp CARET &trans &trans + &kp HASH &kp EXCL &kp LPAR &kp RPAR &kp PIPE &kp UNDER &kp APOS &kp DOUBLE_QUOTES &kp TILDE &kp GRAVE + &kp DLLR &trans &kp LBRC &kp RBRC &kp AMPS &trans &trans &trans &trans &trans + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - function_layer { + function_layer { /* FUNC * * ,----------------------------------. ,----------------------------------. @@ -98,15 +98,15 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 - &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 + &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl_left.overlay b/app/boards/shields/waterfowl/waterfowl_left.overlay index 031936ea..3b9fd42d 100644 --- a/app/boards/shields/waterfowl/waterfowl_left.overlay +++ b/app/boards/shields/waterfowl/waterfowl_left.overlay @@ -7,15 +7,15 @@ #include "waterfowl.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/waterfowl/waterfowl_right.overlay b/app/boards/shields/waterfowl/waterfowl_right.overlay index cff0d53c..bf8f3a44 100644 --- a/app/boards/shields/waterfowl/waterfowl_right.overlay +++ b/app/boards/shields/waterfowl/waterfowl_right.overlay @@ -7,20 +7,20 @@ #include "waterfowl.dtsi" &default_transform { - col-offset = <5>; + col-offset = <5>; }; &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/zmk_uno/Kconfig.shield b/app/boards/shields/zmk_uno/Kconfig.shield index 3f7331c3..958915f5 100644 --- a/app/boards/shields/zmk_uno/Kconfig.shield +++ b/app/boards/shields/zmk_uno/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ZMK_UNO - def_bool $(shields_list_contains,zmk_uno) + def_bool $(shields_list_contains,zmk_uno) diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index 12b5e2b3..04332911 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -8,172 +8,172 @@ #include &arduino_i2c { - status = "okay"; + status = "okay"; }; &arduino_spi { - status = "okay"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,kscan = &kscan_matrix_comp; - zmk,backlight = &backlight; - zmk,underglow = &led_strip; - zmk,matrix-transform = &matrix_transform; - }; + chosen { + zmk,kscan = &kscan_matrix_comp; + zmk,backlight = &backlight; + zmk,underglow = &led_strip; + zmk,matrix-transform = &matrix_transform; + }; - // Commented out until we add more powerful power domain support - // external_power { - // compatible = "zmk,ext-power-generic"; - // label = "EXT_POWER"; - // init-delay-ms = <200>; - // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; - // }; + // Commented out until we add more powerful power domain support + // external_power { + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // }; - rgb_power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - // label = "RGB_POWER"; - init-delay-ms = <200>; - control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; - }; + rgb_power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + // label = "RGB_POWER"; + init-delay-ms = <200>; + control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + }; - backlight: gpioleds { - compatible = "gpio-leds"; - label = "Backlight LEDs"; - gpio_led_0 { - gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - }; + backlight: gpioleds { + compatible = "gpio-leds"; + label = "Backlight LEDs"; + gpio_led_0 { + gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + }; - matrix_transform: matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <4>; + matrix_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; - map = < - RC(0,0) RC(0,1) - RC(1,0) RC(1,1) - RC(2,0) RC(2,1) RC(2,2) - >; - }; + map = < + RC(0,0) RC(0,1) + RC(1,0) RC(1,1) + RC(2,0) RC(2,1) RC(2,2) + >; + }; - direct_matrix_transform: direct_matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <4>; + direct_matrix_transform: direct_matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; - map = < - RC(0,0) RC(0,1) - RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) - >; - }; + map = < + RC(0,0) RC(0,1) + RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) + >; + }; - kscan_matrix_comp: kscan_matrix_comp { - compatible = "zmk,kscan-composite"; - rows = <1>; - columns = <7>; + kscan_matrix_comp: kscan_matrix_comp { + compatible = "zmk,kscan-composite"; + rows = <1>; + columns = <7>; - label = "KSCAN_MATRIX_COMP"; + label = "KSCAN_MATRIX_COMP"; - matrix { - kscan = <&kscan_matrix>; - }; + matrix { + kscan = <&kscan_matrix>; + }; - toggle { - kscan = <&kscan_sp3t_toggle>; - row-offset = <2>; - }; + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <2>; + }; - }; + }; - kscan_direct_comp: kscan_direct_comp { - compatible = "zmk,kscan-composite"; + kscan_direct_comp: kscan_direct_comp { + compatible = "zmk,kscan-composite"; - label = "KSCAN_DIRECT_COMP"; - status = "disabled"; + label = "KSCAN_DIRECT_COMP"; + status = "disabled"; - matrix { - kscan = <&kscan_direct>; - }; + matrix { + kscan = <&kscan_direct>; + }; - toggle { - kscan = <&kscan_sp3t_toggle>; - row-offset = <1>; - }; + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <1>; + }; - }; + }; - kscan_matrix: kscan_matrix { - compatible = "zmk,kscan-gpio-matrix"; + kscan_matrix: kscan_matrix { + compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&arduino_header 10 GPIO_ACTIVE_HIGH> - , <&arduino_header 9 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - kscan_direct: kscan_direct { - compatible = "zmk,kscan-gpio-direct"; - status = "disabled"; + kscan_direct: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + status = "disabled"; - input-gpios - = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; - kscan_sp3t_toggle: kscan_sp3t_toggle { - compatible = "zmk,kscan-gpio-direct"; - toggle-mode; + kscan_sp3t_toggle: kscan_sp3t_toggle { + compatible = "zmk,kscan-gpio-direct"; + toggle-mode; - input-gpios - = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; - encoder: encoder { - label = "ENCODER"; - resolution = <4>; - compatible = "alps,ec11"; - a-gpios = <&arduino_header 14 GPIO_PULL_UP>; - b-gpios = <&arduino_header 15 GPIO_PULL_UP>; - }; + encoder: encoder { + label = "ENCODER"; + resolution = <4>; + compatible = "alps,ec11"; + a-gpios = <&arduino_header 14 GPIO_PULL_UP>; + b-gpios = <&arduino_header 15 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; }; diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index c6024694..e7538c41 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_ZODIARK_LEFT config ZMK_KEYBOARD_NAME - default "Zodiark" + default "Zodiark" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_ZODIARK_LEFT || SHIELD_ZODIARK_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/zodiark/Kconfig.shield b/app/boards/shields/zodiark/Kconfig.shield index 25e23a14..0eb4e8ad 100644 --- a/app/boards/shields/zodiark/Kconfig.shield +++ b/app/boards/shields/zodiark/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ZODIARK_LEFT - def_bool $(shields_list_contains,zodiark_left) + def_bool $(shields_list_contains,zodiark_left) config SHIELD_ZODIARK_RIGHT - def_bool $(shields_list_contains,zodiark_right) + def_bool $(shields_list_contains,zodiark_right) diff --git a/app/boards/shields/zodiark/zodiark_left.overlay b/app/boards/shields/zodiark/zodiark_left.overlay index fe55edc6..1f866f78 100644 --- a/app/boards/shields/zodiark/zodiark_left.overlay +++ b/app/boards/shields/zodiark/zodiark_left.overlay @@ -7,17 +7,17 @@ #include "zodiark.dtsi" &kscan0 { - col-gpios - = <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/zodiark/zodiark_right.overlay b/app/boards/shields/zodiark/zodiark_right.overlay index 3405f59b..998f1e00 100644 --- a/app/boards/shields/zodiark/zodiark_right.overlay +++ b/app/boards/shields/zodiark/zodiark_right.overlay @@ -7,21 +7,21 @@ #include "zodiark.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/usb_console.dtsi b/app/boards/usb_console.dtsi index 4ce59408..3cc76ad3 100644 --- a/app/boards/usb_console.dtsi +++ b/app/boards/usb_console.dtsi @@ -6,15 +6,15 @@ / { - chosen { - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,console = &cdc_acm_uart; + }; }; &usbd { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/cmake/ZephyrBuildConfig.cmake b/app/cmake/ZephyrBuildConfig.cmake index 931dd7ac..ade34199 100644 --- a/app/cmake/ZephyrBuildConfig.cmake +++ b/app/cmake/ZephyrBuildConfig.cmake @@ -14,13 +14,13 @@ get_property(cached_user_config_value CACHE ZMK_CONFIG PROPERTY VALUE) set(user_config_cli_argument ${cached_user_config_value}) # Either new or old if(user_config_cli_argument STREQUAL CACHED_ZMK_CONFIG) - # We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI + # We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI unset(user_config_cli_argument) endif() set(user_config_app_cmake_lists ${ZMK_CONFIG}) if(cached_user_config_value STREQUAL ZMK_CONFIG) - # The app build scripts did not set a default, The ZMK_CONFIG we are + # The app build scripts did not set a default, The ZMK_CONFIG we are # reading is the cached value from the CLI unset(user_config_app_cmake_lists) endif() @@ -29,172 +29,172 @@ if(CACHED_ZMK_CONFIG) # Warn the user if it looks like he is trying to change the user_config # without cleaning first if(user_config_cli_argument) - if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument)) + if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument)) message(WARNING "The build directory must be cleaned pristinely when changing user ZMK config") endif() endif() set(ZMK_CONFIG ${CACHED_ZMK_CONFIG}) elseif(user_config_cli_argument) - set(ZMK_CONFIG ${user_config_cli_argument}) + set(ZMK_CONFIG ${user_config_cli_argument}) elseif(DEFINED ENV{ZMK_CONFIG}) - set(ZMK_CONFIG $ENV{ZMK_CONFIG}) + set(ZMK_CONFIG $ENV{ZMK_CONFIG}) elseif(user_config_app_cmake_lists) - set(ZMK_CONFIG ${user_config_app_cmake_lists}) + set(ZMK_CONFIG ${user_config_app_cmake_lists}) endif() # Store the selected user_config in the cache set(CACHED_ZMK_CONFIG ${ZMK_CONFIG} CACHE STRING "Selected user ZMK config") if (ZMK_CONFIG) - set(ENV{ZMK_CONFIG} "${ZMK_CONFIG}") - if(EXISTS ${ZMK_CONFIG}/boards) - message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") - list(APPEND BOARD_ROOT ${ZMK_CONFIG}) - endif() - if(EXISTS ${ZMK_CONFIG}/dts) - message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") - list(APPEND DTS_ROOT ${ZMK_CONFIG}) - endif() + set(ENV{ZMK_CONFIG} "${ZMK_CONFIG}") + if(EXISTS ${ZMK_CONFIG}/boards) + message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") + list(APPEND BOARD_ROOT ${ZMK_CONFIG}) + endif() + if(EXISTS ${ZMK_CONFIG}/dts) + message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") + list(APPEND DTS_ROOT ${ZMK_CONFIG}) + endif() endif() if(DEFINED SHIELD) - string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") + string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") endif() foreach(root ${BOARD_ROOT}) - set(shield_dir ${root}/boards/shields) - # Match the Kconfig.shield files in the shield directories to make sure we are - # finding shields, e.g. x_nucleo_iks01a1/Kconfig.shield - file(GLOB_RECURSE shields_refs_list ${shield_dir}/*/Kconfig.shield) - unset(SHIELD_LIST) - foreach(shields_refs ${shields_refs_list}) - get_filename_component(shield_path ${shields_refs} DIRECTORY) - file(GLOB shield_overlays RELATIVE ${shield_path} ${shield_path}/*.overlay) - foreach(overlay ${shield_overlays}) - get_filename_component(shield ${overlay} NAME_WE) - list(APPEND SHIELD_LIST ${shield}) - set(SHIELD_DIR_${shield} ${shield_path}) - endforeach() - endforeach() + set(shield_dir ${root}/boards/shields) + # Match the Kconfig.shield files in the shield directories to make sure we are + # finding shields, e.g. x_nucleo_iks01a1/Kconfig.shield + file(GLOB_RECURSE shields_refs_list ${shield_dir}/*/Kconfig.shield) + unset(SHIELD_LIST) + foreach(shields_refs ${shields_refs_list}) + get_filename_component(shield_path ${shields_refs} DIRECTORY) + file(GLOB shield_overlays RELATIVE ${shield_path} ${shield_path}/*.overlay) + foreach(overlay ${shield_overlays}) + get_filename_component(shield ${overlay} NAME_WE) + list(APPEND SHIELD_LIST ${shield}) + set(SHIELD_DIR_${shield} ${shield_path}) + endforeach() + endforeach() - if (EXISTS "${root}/boards/${BOARD}.overlay") - list(APPEND shield_dts_files "${root}/boards/${BOARD}.overlay") - endif() - if (NOT DEFINED BOARD_DIR_NAME) - find_path(BOARD_DIR - NAMES ${BOARD}_defconfig - PATHS ${root}/boards/*/* - NO_DEFAULT_PATH - ) - if(BOARD_DIR) - get_filename_component(BOARD_DIR_NAME ${BOARD_DIR} NAME) - list(APPEND KEYMAP_DIRS ${BOARD_DIR}) - endif() - endif() + if (EXISTS "${root}/boards/${BOARD}.overlay") + list(APPEND shield_dts_files "${root}/boards/${BOARD}.overlay") + endif() + if (NOT DEFINED BOARD_DIR_NAME) + find_path(BOARD_DIR + NAMES ${BOARD}_defconfig + PATHS ${root}/boards/*/* + NO_DEFAULT_PATH + ) + if(BOARD_DIR) + get_filename_component(BOARD_DIR_NAME ${BOARD_DIR} NAME) + list(APPEND KEYMAP_DIRS ${BOARD_DIR}) + endif() + endif() - if(DEFINED SHIELD) - foreach(s ${SHIELD_AS_LIST}) - if(NOT ${s} IN_LIST SHIELD_LIST) - message(WARNING "Didn't find ${s}") - continue() - endif() - message(STATUS "Adding ${SHIELD_DIR_${s}}") - list(APPEND KEYMAP_DIRS ${SHIELD_DIR_${s}}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - list(APPEND SHIELD_DIR ${shield_dir_name}) - endforeach() - endif() + if(DEFINED SHIELD) + foreach(s ${SHIELD_AS_LIST}) + if(NOT ${s} IN_LIST SHIELD_LIST) + message(WARNING "Didn't find ${s}") + continue() + endif() + message(STATUS "Adding ${SHIELD_DIR_${s}}") + list(APPEND KEYMAP_DIRS ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + list(APPEND SHIELD_DIR ${shield_dir_name}) + endforeach() + endif() endforeach() # Give a shield like `kyria_rev2_left` we want to use `kyria_rev2` and `kyria` as candidate names for # overlay/conf/keymap files. if(DEFINED SHIELD) - foreach(s ${SHIELD_AS_LIST}) - if (DEFINED $SHIELD_DIR_${s}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - endif() - string(REPLACE "_" ";" S_PIECES ${s}) - list(LENGTH S_PIECES S_PIECES_LEN) - while(NOT S_PIECES STREQUAL "") - list(POP_BACK S_PIECES) - list(JOIN S_PIECES "_" s_substr) - if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") - break() - endif() - list(APPEND shield_candidate_names ${s_substr}) - endwhile() - endforeach() + foreach(s ${SHIELD_AS_LIST}) + if (DEFINED $SHIELD_DIR_${s}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + string(REPLACE "_" ";" S_PIECES ${s}) + list(LENGTH S_PIECES S_PIECES_LEN) + while(NOT S_PIECES STREQUAL "") + list(POP_BACK S_PIECES) + list(JOIN S_PIECES "_" s_substr) + if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") + break() + endif() + list(APPEND shield_candidate_names ${s_substr}) + endwhile() + endforeach() endif() if (ZMK_CONFIG) - if (EXISTS ${ZMK_CONFIG}) - message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") - list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") + if (EXISTS ${ZMK_CONFIG}) + message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") + list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") - if (DEFINED SHIELD) - foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) - if (DEFINED ${SHIELD_DIR_${s}}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - endif() - list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") - if (NOT "${shield_dir_name}" STREQUAL "${s}") - list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") - endif() - list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") - endforeach() - endif() + if (DEFINED SHIELD) + foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) + if (DEFINED ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") + if (NOT "${shield_dir_name}" STREQUAL "${s}") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") + endif() + list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") + endforeach() + endif() - # TODO: Board revisions? - list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay") - list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/default.conf") + # TODO: Board revisions? + list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay") + list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/default.conf") - foreach(overlay ${overlay_candidates}) - if (EXISTS "${overlay}") - message(STATUS "ZMK Config devicetree overlay: ${overlay}") - list(APPEND shield_dts_files "${overlay}") - break() - endif() - endforeach() + foreach(overlay ${overlay_candidates}) + if (EXISTS "${overlay}") + message(STATUS "ZMK Config devicetree overlay: ${overlay}") + list(APPEND shield_dts_files "${overlay}") + break() + endif() + endforeach() - foreach(conf ${config_candidates}) - if (EXISTS "${conf}") - message(STATUS "ZMK Config Kconfig: ${conf}") - list(APPEND shield_conf_files "${conf}") - endif() - endforeach() - else() - message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}") - endif() + foreach(conf ${config_candidates}) + if (EXISTS "${conf}") + message(STATUS "ZMK Config Kconfig: ${conf}") + list(APPEND shield_conf_files "${conf}") + endif() + endforeach() + else() + message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}") + endif() endif() if(NOT KEYMAP_FILE) - foreach(keymap_dir ${KEYMAP_DIRS}) - foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) - if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) - set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") - message(STATUS "Using keymap file: ${KEYMAP_FILE}") - set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) - break() - endif() - endforeach() - endforeach() + foreach(keymap_dir ${KEYMAP_DIRS}) + foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) + if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) + set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) + break() + endif() + endforeach() + endforeach() else() - message(STATUS "Using keymap file: ${KEYMAP_FILE}") - set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) endif() if (NOT KEYMAP_FILE) - message(WARNING "Failed to locate keymap file!") + message(WARNING "Failed to locate keymap file!") endif() diff --git a/app/drivers/display/CMakeLists.txt b/app/drivers/display/CMakeLists.txt index 13b97193..d5e83c1d 100644 --- a/app/drivers/display/CMakeLists.txt +++ b/app/drivers/display/CMakeLists.txt @@ -1,4 +1,4 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT -zephyr_sources_ifdef(CONFIG_IL0323 il0323.c) \ No newline at end of file +zephyr_sources_ifdef(CONFIG_IL0323 il0323.c) \ No newline at end of file diff --git a/app/drivers/display/Kconfig.il0323 b/app/drivers/display/Kconfig.il0323 index f39015ef..f3308c16 100644 --- a/app/drivers/display/Kconfig.il0323 +++ b/app/drivers/display/Kconfig.il0323 @@ -4,8 +4,8 @@ # IL0323 display controller configuration options config IL0323 - bool "IL0323 compatible display controller driver" - depends on SPI - depends on HEAP_MEM_POOL_SIZE != 0 - help - Enable driver for IL0323 compatible controller. \ No newline at end of file + bool "IL0323 compatible display controller driver" + depends on SPI + depends on HEAP_MEM_POOL_SIZE != 0 + help + Enable driver for IL0323 compatible controller. \ No newline at end of file diff --git a/app/drivers/gpio/Kconfig.595 b/app/drivers/gpio/Kconfig.595 index f43e807b..b4b6bdcc 100644 --- a/app/drivers/gpio/Kconfig.595 +++ b/app/drivers/gpio/Kconfig.595 @@ -6,20 +6,20 @@ DT_COMPAT_ZMK_GPIO_595 := zmk,gpio-595 menuconfig GPIO_595 - bool "595 Shift Register SPI driver" - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) - depends on SPI - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for 595 shift register chip using SPI. + bool "595 Shift Register SPI driver" + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) + depends on SPI + select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO + help + Enable driver for 595 shift register chip using SPI. if GPIO_595 config GPIO_595_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. + int "Init priority" + default 75 + help + Device driver initialization priority. endif #GPIO_595 diff --git a/app/drivers/gpio/Kconfig.max7318 b/app/drivers/gpio/Kconfig.max7318 index ded7f926..d572b970 100644 --- a/app/drivers/gpio/Kconfig.max7318 +++ b/app/drivers/gpio/Kconfig.max7318 @@ -6,20 +6,20 @@ DT_COMPAT_MAXIM_MAX7318 := maxim,max7318 menuconfig GPIO_MAX7318 - bool "MAX7318 I2C-based GPIO chip" - default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX7318)) - depends on I2C - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for MAX7318 I2C-based GPIO chip. + bool "MAX7318 I2C-based GPIO chip" + default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX7318)) + depends on I2C + select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO + help + Enable driver for MAX7318 I2C-based GPIO chip. if GPIO_MAX7318 config GPIO_MAX7318_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. + int "Init priority" + default 75 + help + Device driver initialization priority. endif #GPIO_MAX7318 diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index 216651a1..1d165669 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -8,87 +8,87 @@ DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX := zmk,kscan-gpio-matrix DT_COMPAT_ZMK_KSCAN_MOCK := zmk,kscan-mock config ZMK_KSCAN_COMPOSITE_DRIVER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) config ZMK_KSCAN_GPIO_DRIVER - bool - select GPIO + bool + select GPIO config ZMK_KSCAN_GPIO_DEMUX - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX)) + select ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_GPIO_DIRECT - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT)) + select ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_GPIO_MATRIX - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) + select ZMK_KSCAN_GPIO_DRIVER if ZMK_KSCAN_GPIO_MATRIX config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS - int "Ticks to wait before reading inputs after an output set active" - default 0 - help - When iterating over each output to drive it active, read inputs, then set - inactive again, some boards may take time for output to propagate to the - inputs. In that scenario, set this value to a positive value to configure - the number of ticks to wait after setting an output active before reading - the inputs for their active state. + int "Ticks to wait before reading inputs after an output set active" + default 0 + help + When iterating over each output to drive it active, read inputs, then set + inactive again, some boards may take time for output to propagate to the + inputs. In that scenario, set this value to a positive value to configure + the number of ticks to wait after setting an output active before reading + the inputs for their active state. config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS int "Ticks to wait between each output when scanning" - default 1 if SOC_RP2040 - default 0 - help - When iterating over each output to drive it active, read inputs, then set - inactive again, some boards may take time for the previous output to - "settle" before reading inputs for the next active output column. In that - scenario, set this value to a positive value to configure the number of - ticks to wait after reading each column of keys. + default 1 if SOC_RP2040 + default 0 + help + When iterating over each output to drive it active, read inputs, then set + inactive again, some boards may take time for the previous output to + "settle" before reading inputs for the next active output column. In that + scenario, set this value to a positive value to configure the number of + ticks to wait after reading each column of keys. endif # ZMK_KSCAN_GPIO_MATRIX config ZMK_KSCAN_MOCK_DRIVER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) if ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_MATRIX_POLLING - bool "Poll for key event triggers instead of using interrupts on matrix boards." + bool "Poll for key event triggers instead of using interrupts on matrix boards." config ZMK_KSCAN_DIRECT_POLLING - bool "Poll for key event triggers instead of using interrupts on direct wired boards." + bool "Poll for key event triggers instead of using interrupts on direct wired boards." config ZMK_KSCAN_DEBOUNCE_PRESS_MS - int "Debounce time for key press in milliseconds." - default -1 - help - Global debounce time for key press in milliseconds. - If this is -1, the debounce time is controlled by the debounce-press-ms - Devicetree property, which defaults to 5 ms. Otherwise this overrides the - debounce time for all key scan drivers to the chosen value. + int "Debounce time for key press in milliseconds." + default -1 + help + Global debounce time for key press in milliseconds. + If this is -1, the debounce time is controlled by the debounce-press-ms + Devicetree property, which defaults to 5 ms. Otherwise this overrides the + debounce time for all key scan drivers to the chosen value. config ZMK_KSCAN_DEBOUNCE_RELEASE_MS - int "Debounce time for key release in milliseconds." - default -1 - help - Global debounce time for key release in milliseconds. - If this is -1, the debounce time is controlled by the debounce-release-ms - Devicetree property, which defaults to 5 ms. Otherwise this overrides the - debounce time for all key scan drivers to the chosen value. + int "Debounce time for key release in milliseconds." + default -1 + help + Global debounce time for key release in milliseconds. + If this is -1, the debounce time is controlled by the debounce-release-ms + Devicetree property, which defaults to 5 ms. Otherwise this overrides the + debounce time for all key scan drivers to the chosen value. endif config ZMK_KSCAN_INIT_PRIORITY - int "Keyboard scan driver init priority" - default 40 - help - Keyboard scan device driver initialization priority. + int "Keyboard scan driver init priority" + default 40 + help + Keyboard scan device driver initialization priority. diff --git a/app/drivers/sensor/battery/Kconfig b/app/drivers/sensor/battery/Kconfig index d7c82bb0..a9d7189e 100644 --- a/app/drivers/sensor/battery/Kconfig +++ b/app/drivers/sensor/battery/Kconfig @@ -5,22 +5,22 @@ DT_COMPAT_ZMK_BATTERY_NRF_VDDH := zmk,battery-nrf-vddh DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER := zmk,battery-voltage-divider config ZMK_BATTERY - bool "ZMK battery monitoring" - help - Enable battery monitoring + bool "ZMK battery monitoring" + help + Enable battery monitoring config ZMK_BATTERY_NRF_VDDH - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) - select ADC - select ZMK_BATTERY - help - Enable ZMK nRF VDDH voltage driver for battery monitoring. + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) + select ADC + select ZMK_BATTERY + help + Enable ZMK nRF VDDH voltage driver for battery monitoring. config ZMK_BATTERY_VOLTAGE_DIVIDER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) - select ADC - select ZMK_BATTERY - help - Enable ZMK battery voltage divider driver for battery monitoring. + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) + select ADC + select ZMK_BATTERY + help + Enable ZMK battery voltage divider driver for battery monitoring. diff --git a/app/drivers/sensor/ec11/Kconfig b/app/drivers/sensor/ec11/Kconfig index 6854e530..e86d092a 100644 --- a/app/drivers/sensor/ec11/Kconfig +++ b/app/drivers/sensor/ec11/Kconfig @@ -2,49 +2,49 @@ # SPDX-License-Identifier: MIT menuconfig EC11 - bool "EC11 Incremental Encoder Sensor" - depends on GPIO - help - Enable driver for EC11 incremental encoder sensors. + bool "EC11 Incremental Encoder Sensor" + depends on GPIO + help + Enable driver for EC11 incremental encoder sensors. if EC11 choice - prompt "Trigger mode" - default EC11_TRIGGER_NONE - help - Specify the type of triggering to be used by the driver. + prompt "Trigger mode" + default EC11_TRIGGER_NONE + help + Specify the type of triggering to be used by the driver. config EC11_TRIGGER_NONE - bool "No trigger" + bool "No trigger" config EC11_TRIGGER_GLOBAL_THREAD - bool "Use global thread" - depends on GPIO - select EC11_TRIGGER + bool "Use global thread" + depends on GPIO + select EC11_TRIGGER config EC11_TRIGGER_OWN_THREAD - bool "Use own thread" - depends on GPIO - select EC11_TRIGGER + bool "Use own thread" + depends on GPIO + select EC11_TRIGGER endchoice config EC11_TRIGGER - bool + bool config EC11_THREAD_PRIORITY - int "Thread priority" - depends on EC11_TRIGGER_OWN_THREAD - default 10 - help - Priority of thread used by the driver to handle interrupts. + int "Thread priority" + depends on EC11_TRIGGER_OWN_THREAD + default 10 + help + Priority of thread used by the driver to handle interrupts. config EC11_THREAD_STACK_SIZE - int "Thread stack size" - depends on EC11_TRIGGER_OWN_THREAD - default 1024 - help - Stack size of thread used by the driver to handle interrupts. + int "Thread stack size" + depends on EC11_TRIGGER_OWN_THREAD + default 1024 + help + Stack size of thread used by the driver to handle interrupts. endif # EC11 \ No newline at end of file diff --git a/app/dts/behaviors/backlight.dtsi b/app/dts/behaviors/backlight.dtsi index f9bd02b8..bebd6dfb 100644 --- a/app/dts/behaviors/backlight.dtsi +++ b/app/dts/behaviors/backlight.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ bl: behavior_backlight { - compatible = "zmk,behavior-backlight"; - label = "BCKLGHT"; - #binding-cells = <2>; - }; - }; + behaviors { + /omit-if-no-ref/ bl: behavior_backlight { + compatible = "zmk,behavior-backlight"; + label = "BCKLGHT"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/bluetooth.dtsi b/app/dts/behaviors/bluetooth.dtsi index 1e9cf21b..a49ff4d6 100644 --- a/app/dts/behaviors/bluetooth.dtsi +++ b/app/dts/behaviors/bluetooth.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ bt: behavior_bluetooth { - compatible = "zmk,behavior-bluetooth"; - label = "BLUETOOTH"; - #binding-cells = <2>; - }; - }; + behaviors { + /omit-if-no-ref/ bt: behavior_bluetooth { + compatible = "zmk,behavior-bluetooth"; + label = "BLUETOOTH"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index ac04e26b..219300dc 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ caps_word: behavior_caps_word { - compatible = "zmk,behavior-caps-word"; - label = "CAPS_WORD"; - #binding-cells = <0>; - continue-list = ; - }; - }; + behaviors { + /omit-if-no-ref/ caps_word: behavior_caps_word { + compatible = "zmk,behavior-caps-word"; + label = "CAPS_WORD"; + #binding-cells = <0>; + continue-list = ; + }; + }; }; diff --git a/app/dts/behaviors/ext_power.dtsi b/app/dts/behaviors/ext_power.dtsi index 18e824e2..f61170dd 100644 --- a/app/dts/behaviors/ext_power.dtsi +++ b/app/dts/behaviors/ext_power.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - ext_power: behavior_ext_power { - compatible = "zmk,behavior-ext-power"; - label = "EXTPOWER"; - #binding-cells = <1>; - }; - }; + behaviors { + ext_power: behavior_ext_power { + compatible = "zmk,behavior-ext-power"; + label = "EXTPOWER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/gresc.dtsi b/app/dts/behaviors/gresc.dtsi index 29593880..fa4c685b 100644 --- a/app/dts/behaviors/gresc.dtsi +++ b/app/dts/behaviors/gresc.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ gresc: grave_escape { - compatible = "zmk,behavior-mod-morph"; - label = "GRAVE_ESCAPE"; - #binding-cells = <0>; - bindings = <&kp ESC>, <&kp GRAVE>; + behaviors { + /omit-if-no-ref/ gresc: grave_escape { + compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - }; - }; + }; + }; }; diff --git a/app/dts/behaviors/key_press.dtsi b/app/dts/behaviors/key_press.dtsi index 59a4e12a..b0fc2db1 100644 --- a/app/dts/behaviors/key_press.dtsi +++ b/app/dts/behaviors/key_press.dtsi @@ -5,12 +5,12 @@ */ / { - behaviors { - /* DEPRECATED: `cp` will be removed in the future */ - /omit-if-no-ref/ cp: kp: behavior_key_press { - compatible = "zmk,behavior-key-press"; - label = "KEY_PRESS"; - #binding-cells = <1>; - }; - }; + behaviors { + /* DEPRECATED: `cp` will be removed in the future */ + /omit-if-no-ref/ cp: kp: behavior_key_press { + compatible = "zmk,behavior-key-press"; + label = "KEY_PRESS"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/key_repeat.dtsi b/app/dts/behaviors/key_repeat.dtsi index aa8ffa04..795a77f6 100644 --- a/app/dts/behaviors/key_repeat.dtsi +++ b/app/dts/behaviors/key_repeat.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ key_repeat: behavior_key_repeat { - compatible = "zmk,behavior-key-repeat"; - label = "KEY_REPEAT"; - #binding-cells = <0>; - usage-pages = ; - }; - }; + behaviors { + /omit-if-no-ref/ key_repeat: behavior_key_repeat { + compatible = "zmk,behavior-key-repeat"; + label = "KEY_REPEAT"; + #binding-cells = <0>; + usage-pages = ; + }; + }; }; diff --git a/app/dts/behaviors/key_toggle.dtsi b/app/dts/behaviors/key_toggle.dtsi index 98001b79..df581014 100644 --- a/app/dts/behaviors/key_toggle.dtsi +++ b/app/dts/behaviors/key_toggle.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ kt: behavior_key_toggle { - compatible = "zmk,behavior-key-toggle"; - label = "KEY_TOGGLE"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ kt: behavior_key_toggle { + compatible = "zmk,behavior-key-toggle"; + label = "KEY_TOGGLE"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/layer_tap.dtsi b/app/dts/behaviors/layer_tap.dtsi index 21fd9d56..1d92245c 100644 --- a/app/dts/behaviors/layer_tap.dtsi +++ b/app/dts/behaviors/layer_tap.dtsi @@ -5,14 +5,14 @@ */ / { - behaviors { - /omit-if-no-ref/ lt: behavior_layer_tap { - compatible = "zmk,behavior-hold-tap"; - label = "LAYER_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - bindings = <&mo>, <&kp>; - }; - }; + behaviors { + /omit-if-no-ref/ lt: behavior_layer_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LAYER_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + bindings = <&mo>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/macros.dtsi b/app/dts/behaviors/macros.dtsi index 76153291..757c046e 100644 --- a/app/dts/behaviors/macros.dtsi +++ b/app/dts/behaviors/macros.dtsi @@ -6,49 +6,49 @@ #define ZMK_MACRO_STRINGIFY(x) #x #define ZMK_MACRO(name,...) \ - name: name { \ - label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ - compatible = "zmk,behavior-macro"; \ - #binding-cells = <0>; \ - __VA_ARGS__ \ - }; + name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro"; \ + #binding-cells = <0>; \ + __VA_ARGS__ \ + }; / { - behaviors { - macro_tap: macro_control_mode_tap { - compatible = "zmk,macro-control-mode-tap"; - label = "MAC_TAP"; - #binding-cells = <0>; - }; + behaviors { + macro_tap: macro_control_mode_tap { + compatible = "zmk,macro-control-mode-tap"; + label = "MAC_TAP"; + #binding-cells = <0>; + }; - macro_press: macro_control_mode_press { - compatible = "zmk,macro-control-mode-press"; - label = "MAC_PRESS"; - #binding-cells = <0>; - }; + macro_press: macro_control_mode_press { + compatible = "zmk,macro-control-mode-press"; + label = "MAC_PRESS"; + #binding-cells = <0>; + }; - macro_release: macro_control_mode_release { - compatible = "zmk,macro-control-mode-release"; - label = "MAC_REL"; - #binding-cells = <0>; - }; + macro_release: macro_control_mode_release { + compatible = "zmk,macro-control-mode-release"; + label = "MAC_REL"; + #binding-cells = <0>; + }; - macro_tap_time: macro_control_tap_time { - compatible = "zmk,macro-control-tap-time"; - label = "MAC_TAP_TIME"; - #binding-cells = <1>; - }; + macro_tap_time: macro_control_tap_time { + compatible = "zmk,macro-control-tap-time"; + label = "MAC_TAP_TIME"; + #binding-cells = <1>; + }; - macro_wait_time: macro_control_wait_time { - compatible = "zmk,macro-control-wait-time"; - label = "MAC_WAIT_TIME"; - #binding-cells = <1>; - }; + macro_wait_time: macro_control_wait_time { + compatible = "zmk,macro-control-wait-time"; + label = "MAC_WAIT_TIME"; + #binding-cells = <1>; + }; - macro_pause_for_release: macro_pause_for_release { - compatible = "zmk,macro-pause-for-release"; - label = "MAC_WAIT_REL"; - #binding-cells = <0>; - }; - }; + macro_pause_for_release: macro_pause_for_release { + compatible = "zmk,macro-pause-for-release"; + label = "MAC_WAIT_REL"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/mod_tap.dtsi b/app/dts/behaviors/mod_tap.dtsi index 7a98713c..d441a4f1 100644 --- a/app/dts/behaviors/mod_tap.dtsi +++ b/app/dts/behaviors/mod_tap.dtsi @@ -5,14 +5,14 @@ */ / { - behaviors { - /omit-if-no-ref/ mt: behavior_mod_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + /omit-if-no-ref/ mt: behavior_mod_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/momentary_layer.dtsi b/app/dts/behaviors/momentary_layer.dtsi index 2dbd88d9..d1c91232 100644 --- a/app/dts/behaviors/momentary_layer.dtsi +++ b/app/dts/behaviors/momentary_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ mo: behavior_momentary_layer { - compatible = "zmk,behavior-momentary-layer"; - label = "MO"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ mo: behavior_momentary_layer { + compatible = "zmk,behavior-momentary-layer"; + label = "MO"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/none.dtsi b/app/dts/behaviors/none.dtsi index 790f2d61..fc4890c3 100644 --- a/app/dts/behaviors/none.dtsi +++ b/app/dts/behaviors/none.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ none: behavior_none { - compatible = "zmk,behavior-none"; - label = "NONE"; - #binding-cells = <0>; - }; - }; + behaviors { + /omit-if-no-ref/ none: behavior_none { + compatible = "zmk,behavior-none"; + label = "NONE"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index 74a7163b..2e775269 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -7,18 +7,18 @@ #include / { - behaviors { - sys_reset: behavior_reset { - compatible = "zmk,behavior-reset"; - label = "SYSRESET"; - #binding-cells = <0>; - }; + behaviors { + sys_reset: behavior_reset { + compatible = "zmk,behavior-reset"; + label = "SYSRESET"; + #binding-cells = <0>; + }; - bootloader: behavior_reset_dfu { - compatible = "zmk,behavior-reset"; - label = "BOOTLOAD"; - type = ; - #binding-cells = <0>; - }; - }; + bootloader: behavior_reset_dfu { + compatible = "zmk,behavior-reset"; + label = "BOOTLOAD"; + type = ; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/rgb_underglow.dtsi b/app/dts/behaviors/rgb_underglow.dtsi index 54fe422e..6ffec2e6 100644 --- a/app/dts/behaviors/rgb_underglow.dtsi +++ b/app/dts/behaviors/rgb_underglow.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - rgb_ug: behavior_rgb_underglow { - compatible = "zmk,behavior-rgb-underglow"; - label = "RGB_UG"; - #binding-cells = <2>; - }; - }; + behaviors { + rgb_ug: behavior_rgb_underglow { + compatible = "zmk,behavior-rgb-underglow"; + label = "RGB_UG"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/sensor_rotate_key_press.dtsi b/app/dts/behaviors/sensor_rotate_key_press.dtsi index ed1b4cd0..dc30b798 100644 --- a/app/dts/behaviors/sensor_rotate_key_press.dtsi +++ b/app/dts/behaviors/sensor_rotate_key_press.dtsi @@ -5,13 +5,13 @@ */ / { - behaviors { - /* DEPRECATED: `inc_dec_cp` will be removed in the future */ - /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { - compatible = "zmk,behavior-sensor-rotate-var"; - label = "ENC_KEY_PRESS"; - #sensor-binding-cells = <2>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + /* DEPRECATED: `inc_dec_cp` will be removed in the future */ + /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { + compatible = "zmk,behavior-sensor-rotate-var"; + label = "ENC_KEY_PRESS"; + #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/sticky_key.dtsi b/app/dts/behaviors/sticky_key.dtsi index 886d35b7..72a80a90 100644 --- a/app/dts/behaviors/sticky_key.dtsi +++ b/app/dts/behaviors/sticky_key.dtsi @@ -5,24 +5,24 @@ */ / { - behaviors { - /omit-if-no-ref/ sk: behavior_sticky_key { - compatible = "zmk,behavior-sticky-key"; - label = "STICKY_KEY"; - #binding-cells = <1>; - release-after-ms = <1000>; - bindings = <&kp>; - ignore-modifiers; - }; - /omit-if-no-ref/ sl: behavior_sticky_layer { - compatible = "zmk,behavior-sticky-key"; - label = "STICKY_LAYER"; - #binding-cells = <1>; - release-after-ms = <1000>; - bindings = <&mo>; - quick-release; - }; - }; + behaviors { + /omit-if-no-ref/ sk: behavior_sticky_key { + compatible = "zmk,behavior-sticky-key"; + label = "STICKY_KEY"; + #binding-cells = <1>; + release-after-ms = <1000>; + bindings = <&kp>; + ignore-modifiers; + }; + /omit-if-no-ref/ sl: behavior_sticky_layer { + compatible = "zmk,behavior-sticky-key"; + label = "STICKY_LAYER"; + #binding-cells = <1>; + release-after-ms = <1000>; + bindings = <&mo>; + quick-release; + }; + }; }; diff --git a/app/dts/behaviors/to_layer.dtsi b/app/dts/behaviors/to_layer.dtsi index fa8f98bd..0ea66fa9 100644 --- a/app/dts/behaviors/to_layer.dtsi +++ b/app/dts/behaviors/to_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ to: behavior_to_layer { - compatible = "zmk,behavior-to-layer"; - label = "TO_LAYER"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ to: behavior_to_layer { + compatible = "zmk,behavior-to-layer"; + label = "TO_LAYER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/toggle_layer.dtsi b/app/dts/behaviors/toggle_layer.dtsi index ea0b1c19..75730934 100644 --- a/app/dts/behaviors/toggle_layer.dtsi +++ b/app/dts/behaviors/toggle_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ tog: behavior_toggle_layer { - compatible = "zmk,behavior-toggle-layer"; - label = "TOGGLE_LAYER"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ tog: behavior_toggle_layer { + compatible = "zmk,behavior-toggle-layer"; + label = "TOGGLE_LAYER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/transparent.dtsi b/app/dts/behaviors/transparent.dtsi index 81ebb133..0dfaade2 100644 --- a/app/dts/behaviors/transparent.dtsi +++ b/app/dts/behaviors/transparent.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ trans: behavior_transparent { - compatible = "zmk,behavior-transparent"; - label = "TRANS"; - #binding-cells = <0>; - }; - }; + behaviors { + /omit-if-no-ref/ trans: behavior_transparent { + compatible = "zmk,behavior-transparent"; + label = "TRANS"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/common/arduino_uno_pro_micro_map.dtsi b/app/dts/common/arduino_uno_pro_micro_map.dtsi index 3f3d64f0..a6b8d792 100644 --- a/app/dts/common/arduino_uno_pro_micro_map.dtsi +++ b/app/dts/common/arduino_uno_pro_micro_map.dtsi @@ -7,41 +7,41 @@ /* This provies a mapping from Arduino Uno to Arduino Pro Micro pins for development */ / { - pro_micro_d: connector_d { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &arduino_header 6 0> /* D0 */ - , <1 0 &arduino_header 7 0> /* D1 */ - , <2 0 &arduino_header 8 0> /* D2 */ - , <3 0 &arduino_header 9 0> /* D3 */ - , <4 0 &arduino_header 10 0> /* D4/A6 */ - , <5 0 &arduino_header 11 0> /* D5 */ - , <6 0 &arduino_header 12 0> /* D6/A7 */ - , <7 0 &arduino_header 13 0> /* D7 */ - , <8 0 &arduino_header 14 0> /* D8/A8 */ - , <9 0 &arduino_header 15 0> /* D9/A9 */ - , <10 0 &arduino_header 16 0> /* D10/A10 */ - , <16 0 &arduino_header 17 0> /* D16 */ - , <14 0 &arduino_header 18 0> /* D14 */ - , <15 0 &arduino_header 19 0> /* D15 */ - ; - }; + pro_micro_d: connector_d { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &arduino_header 6 0> /* D0 */ + , <1 0 &arduino_header 7 0> /* D1 */ + , <2 0 &arduino_header 8 0> /* D2 */ + , <3 0 &arduino_header 9 0> /* D3 */ + , <4 0 &arduino_header 10 0> /* D4/A6 */ + , <5 0 &arduino_header 11 0> /* D5 */ + , <6 0 &arduino_header 12 0> /* D6/A7 */ + , <7 0 &arduino_header 13 0> /* D7 */ + , <8 0 &arduino_header 14 0> /* D8/A8 */ + , <9 0 &arduino_header 15 0> /* D9/A9 */ + , <10 0 &arduino_header 16 0> /* D10/A10 */ + , <16 0 &arduino_header 17 0> /* D16 */ + , <14 0 &arduino_header 18 0> /* D14 */ + , <15 0 &arduino_header 19 0> /* D15 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &arduino_header 0 0> /* A0 */ - , <1 0 &arduino_header 1 0> /* A1 */ - , <2 0 &arduino_header 2 0> /* A2 */ - , <3 0 &arduino_header 3 0> /* A3 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &arduino_header 0 0> /* A0 */ + , <1 0 &arduino_header 1 0> /* A1 */ + , <2 0 &arduino_header 2 0> /* A2 */ + , <3 0 &arduino_header 3 0> /* A3 */ + ; + }; }; pro_micro_i2c: &arduino_i2c {}; diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 3e307f85..0c4bb6e4 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -6,11 +6,11 @@ #include - __event_type_start = .; \ - KEEP(*(".event_type")); \ - __event_type_end = .; \ + __event_type_start = .; \ + KEEP(*(".event_type")); \ + __event_type_end = .; \ - __event_subscriptions_start = .; \ - KEEP(*(".event_subscription")); \ - __event_subscriptions_end = .; \ + __event_subscriptions_start = .; \ + KEEP(*(".event_subscription")); \ + __event_subscriptions_end = .; \ diff --git a/app/run-test.sh b/app/run-test.sh index 94438f34..6935f2c8 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -4,23 +4,23 @@ # SPDX-License-Identifier: MIT if [ -z "$1" ]; then - echo "Usage: ./run-test.sh " - exit 1 + echo "Usage: ./run-test.sh " + exit 1 fi path="$1" if [ $path = "all" ]; then - path="tests" + path="tests" fi testcases=$(find $path -name native_posix_64.keymap -exec dirname \{\} \;) num_cases=$(echo "$testcases" | wc -l) if [ $num_cases -gt 1 ] || [ "$testcases" != "$path" ]; then - echo "" > ./build/tests/pass-fail.log - echo "$testcases" | xargs -L 1 -P ${J:-4} ./run-test.sh - err=$? - sort -k2 ./build/tests/pass-fail.log - exit $err + echo "" > ./build/tests/pass-fail.log + echo "$testcases" | xargs -L 1 -P ${J:-4} ./run-test.sh + err=$? + sort -k2 ./build/tests/pass-fail.log + exit $err fi testcase="$path" @@ -28,19 +28,19 @@ echo "Running $testcase:" west build -d build/$testcase -b native_posix_64 -- -DZMK_CONFIG="$(pwd)/$testcase" > /dev/null 2>&1 if [ $? -gt 0 ]; then - echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log - exit 1 + echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log + exit 1 fi ./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log diff -auZ $testcase/keycode_events.snapshot build/$testcase/keycode_events.log if [ $? -gt 0 ]; then - if [ -f $testcase/pending ]; then - echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log - exit 0 - fi - echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log - exit 1 + if [ -f $testcase/pending ]; then + echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log + exit 0 + fi + echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log + exit 1 fi echo "PASS: $testcase" | tee -a ./build/tests/pass-fail.log diff --git a/app/src/split/Kconfig b/app/src/split/Kconfig index 42cb411c..dbe5f092 100644 --- a/app/src/split/Kconfig +++ b/app/src/split/Kconfig @@ -2,21 +2,21 @@ # SPDX-License-Identifier: MIT menuconfig ZMK_SPLIT - bool "Split keyboard support" + bool "Split keyboard support" if ZMK_SPLIT config ZMK_SPLIT_ROLE_CENTRAL - bool "Split central device" + bool "Split central device" choice ZMK_SPLIT_TRANSPORT - prompt "Split transport" + prompt "Split transport" config ZMK_SPLIT_BLE - bool "BLE" - depends on ZMK_BLE - select BT_USER_PHY_UPDATE - select BT_AUTO_PHY_UPDATE + bool "BLE" + depends on ZMK_BLE + select BT_USER_PHY_UPDATE + select BT_AUTO_PHY_UPDATE endchoice diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index f6976cff..53119d82 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -7,55 +7,55 @@ menu "BLE Transport" # Added for backwards compatibility. New shields/board should set `ZMK_SPLIT_ROLE_CENTRAL` only. config ZMK_SPLIT_BLE_ROLE_CENTRAL - bool - select ZMK_SPLIT_ROLE_CENTRAL + bool + select ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_ROLE_CENTRAL - select BT_CENTRAL - select BT_GATT_CLIENT - select BT_GATT_AUTO_DISCOVER_CCC + select BT_CENTRAL + select BT_GATT_CLIENT + select BT_GATT_AUTO_DISCOVER_CCC if ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE - int "Max number of key position state events to queue when received from peripherals" - default 5 + int "Max number of key position state events to queue when received from peripherals" + default 5 config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE - int "BLE split central write thread stack size" - default 512 + int "BLE split central write thread stack size" + default 512 config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE - int "Max number of behavior run events to queue to send to the peripheral(s)" - default 5 + int "Max number of behavior run events to queue to send to the peripheral(s)" + default 5 endif # ZMK_SPLIT_ROLE_CENTRAL if !ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE - int "BLE split peripheral notify thread stack size" - default 650 + int "BLE split peripheral notify thread stack size" + default 650 config ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY - int "BLE split peripheral notify thread priority" - default 5 + int "BLE split peripheral notify thread priority" + default 5 config ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE - int "Max number of key position state events to queue to send to the central" - default 10 + int "Max number of key position state events to queue to send to the central" + default 10 config ZMK_USB - default n + default n config BT_MAX_PAIRED - default 1 + default 1 config BT_MAX_CONN - default 1 + default 1 config BT_PERIPHERAL_PREF_MAX_INT - default 6 + default 6 #!ZMK_SPLIT_ROLE_CENTRAL endif @@ -71,10 +71,10 @@ if ZMK_BLE if ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL config BT_MAX_CONN - default 6 + default 6 config BT_MAX_PAIRED - default 6 + default 6 #ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL endif @@ -82,10 +82,10 @@ endif if !ZMK_SPLIT_BLE config BT_MAX_CONN - default 5 + default 5 config BT_MAX_PAIRED - default 5 + default 5 #!ZMK_SPLIT_BLE endif diff --git a/app/tests/backlight/basic/native_posix_64.keymap b/app/tests/backlight/basic/native_posix_64.keymap index 185dbf7c..dfb08fef 100644 --- a/app/tests/backlight/basic/native_posix_64.keymap +++ b/app/tests/backlight/basic/native_posix_64.keymap @@ -1,30 +1,30 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/backlight/behavior_keymap.dtsi b/app/tests/backlight/behavior_keymap.dtsi index 26869272..771072ac 100644 --- a/app/tests/backlight/behavior_keymap.dtsi +++ b/app/tests/backlight/behavior_keymap.dtsi @@ -4,31 +4,31 @@ #include / { - chosen { - zmk,backlight = &backlight; - }; + chosen { + zmk,backlight = &backlight; + }; - backlight: leds { - compatible = "gpio-leds"; - led_0 { - gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - led_1 { - gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 1"; - }; - }; + backlight: leds { + compatible = "gpio-leds"; + led_0 { + gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + led_1 { + gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 1"; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &bl BL_INC &bl BL_DEC - &bl BL_ON &bl BL_OFF - >; - }; - }; + default_layer { + bindings = < + &bl BL_INC &bl BL_DEC + &bl BL_ON &bl BL_OFF + >; + }; + }; }; diff --git a/app/tests/backlight/config-brt/native_posix_64.keymap b/app/tests/backlight/config-brt/native_posix_64.keymap index 6617c9f6..cbb6c93f 100644 --- a/app/tests/backlight/config-brt/native_posix_64.keymap +++ b/app/tests/backlight/config-brt/native_posix_64.keymap @@ -1,12 +1,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/backlight/config-on/native_posix_64.keymap b/app/tests/backlight/config-on/native_posix_64.keymap index a95ccd93..1a8de928 100644 --- a/app/tests/backlight/config-on/native_posix_64.keymap +++ b/app/tests/backlight/config-on/native_posix_64.keymap @@ -1,12 +1,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; diff --git a/app/tests/backlight/config-step/native_posix_64.keymap b/app/tests/backlight/config-step/native_posix_64.keymap index 96fbe96a..70614459 100644 --- a/app/tests/backlight/config-step/native_posix_64.keymap +++ b/app/tests/backlight/config-step/native_posix_64.keymap @@ -1,36 +1,36 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/backlight/cycle/native_posix_64.keymap b/app/tests/backlight/cycle/native_posix_64.keymap index a2f3c830..00615e35 100644 --- a/app/tests/backlight/cycle/native_posix_64.keymap +++ b/app/tests/backlight/cycle/native_posix_64.keymap @@ -4,75 +4,75 @@ #include / { - chosen { - zmk,backlight = &backlight; - }; + chosen { + zmk,backlight = &backlight; + }; - backlight: leds { - compatible = "gpio-leds"; - led_0 { - gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - led_1 { - gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 1"; - }; - }; + backlight: leds { + compatible = "gpio-leds"; + led_0 { + gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + led_1 { + gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 1"; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &bl BL_CYCLE &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &bl BL_CYCLE &none + &none &none + >; + }; + }; }; &kscan { - events = < - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/backlight/low-brightness/native_posix_64.keymap b/app/tests/backlight/low-brightness/native_posix_64.keymap index 3b01f700..a151e0f6 100644 --- a/app/tests/backlight/low-brightness/native_posix_64.keymap +++ b/app/tests/backlight/low-brightness/native_posix_64.keymap @@ -1,39 +1,39 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/caps-word/behavior_keymap.dtsi b/app/tests/caps-word/behavior_keymap.dtsi index 04653bec..855406fc 100644 --- a/app/tests/caps-word/behavior_keymap.dtsi +++ b/app/tests/caps-word/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &caps_word &kp A - &kp N6 &kp MINUS - >; - }; - }; + default_layer { + bindings = < + &caps_word &kp A + &kp N6 &kp MINUS + >; + }; + }; }; diff --git a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap index 3053d5df..bbbdac10 100644 --- a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap @@ -4,30 +4,30 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &caps_word &kp A - &kp LSHFT &kp MINUS - >; - }; - }; + default_layer { + bindings = < + &caps_word &kp A + &kp LSHFT &kp MINUS + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap index 68c3249f..08b173bd 100644 --- a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap @@ -4,18 +4,18 @@ #include "../behavior_keymap.dtsi" &caps_word { - continue-list = ; + continue-list = ; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap index 40a4d4a9..cde97c84 100644 --- a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap @@ -4,18 +4,18 @@ #include "../behavior_keymap.dtsi" &caps_word { - continue-list = ; + continue-list = ; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap index 4219e354..3fbb020b 100644 --- a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap +++ b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap index 05f13fed..121a827c 100644 --- a/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap index e0695564..b8ae4ee0 100644 --- a/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10000) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,30) - ZMK_MOCK_RELEASE(0,1,30) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,30) - ZMK_MOCK_PRESS(0,1,30) - ZMK_MOCK_RELEASE(0,1,1000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10000) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,30) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,30) + ZMK_MOCK_PRESS(0,1,30) + ZMK_MOCK_RELEASE(0,1,1000) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap index a02f6c64..e6754b71 100644 --- a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap @@ -3,7 +3,7 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* @@ -12,36 +12,36 @@ and combos is wrong. Hold-taps need to process key position events first so the decision to hold or tap can be made. */ / { - combos { - compatible = "zmk,combos"; + combos { + compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <1 2>; - bindings = <&kp Y>; - }; - }; + combo_two { + timeout-ms = <100>; + key-positions = <1 2>; + bindings = <&kp Y>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap index 325da627..95382432 100644 --- a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap @@ -3,40 +3,40 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* this test checks if hold-taps can be part of a combo */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap index 7a789808..d6d187e2 100644 --- a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap @@ -3,43 +3,43 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* This test verifies that hold-tap keys can observe * events which were released from combos. */ / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <100>; - key-positions = <0 2>; - bindings = <&kp Y>; - }; - combo_two { - timeout-ms = <100>; - key-positions = <1 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <100>; + key-positions = <0 2>; + bindings = <&kp Y>; + }; + combo_two { + timeout-ms = <100>; + key-positions = <1 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &mt RIGHT_CONTROL B - &none &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &mt RIGHT_CONTROL B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,0) - ZMK_MOCK_PRESS(0,1,300) - >; + events = < + ZMK_MOCK_PRESS(0,0,0) + ZMK_MOCK_PRESS(0,1,300) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap index d4053793..f1c7eee7 100644 --- a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap @@ -3,38 +3,38 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <40>; - key-positions = <0 1>; - bindings = <&kp X>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <40>; + key-positions = <0 1>; + bindings = <&kp X>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &mt RSHFT RET &kp C - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &mt RSHFT RET &kp C + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,1,50) - ZMK_MOCK_RELEASE(1,1,50) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,1,50) + ZMK_MOCK_RELEASE(1,1,50) + >; }; diff --git a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap index ba6cecc6..134b77df 100644 --- a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap @@ -5,14 +5,14 @@ #define ZMK_COMBO(name, combo_bindings, keypos, combo_term) \ / { \ - combos { \ - compatible = "zmk,combos"; \ - combo_ ## name { \ - key-positions = ; \ - bindings = ; \ - timeout-ms = ; \ - }; \ - }; \ + combos { \ + compatible = "zmk,combos"; \ + combo_ ## name { \ + key-positions = ; \ + bindings = ; \ + timeout-ms = ; \ + }; \ + }; \ }; ZMK_COMBO(qmark, &kp QMARK, 0 3, 30) @@ -20,27 +20,27 @@ ZMK_COMBO(dllr, &kp DLLR, 1 3, 50) ZMK_COMBO(tilde, &kp TILDE, 3 4, 50) / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &none &none - &kp A &mt LSHFT T - &none - >; - }; - }; + default_layer { + bindings = < + &none &none + &kp A &mt LSHFT T + &none + >; + }; + }; }; &kscan { - rows = <3>; - columns = <2>; - events = < - ZMK_MOCK_PRESS(1,1,500) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,500) - ZMK_MOCK_RELEASE(1,1,0) - >; + rows = <3>; + columns = <2>; + events = < + ZMK_MOCK_PRESS(1,1,500) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,500) + ZMK_MOCK_RELEASE(1,1,0) + >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-0/native_posix_64.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap index 33712822..8d94872b 100644 --- a/app/tests/combo/layer-filter-0/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-0/native_posix_64.keymap @@ -6,73 +6,73 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp X>; - layers = <0>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp X>; + layers = <0>; + }; - combo_two { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp Y>; - layers = <1>; - }; + combo_two { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp Y>; + layers = <1>; + }; - combo_three { - timeout-ms = ; - key-positions = <0 2>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = ; + key-positions = <0 2>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &tog 1 - >; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &tog 1 + >; + }; - filtered_layer { - bindings = < - &kp A &kp B - &kp C &tog 0 - >; - }; - }; + filtered_layer { + bindings = < + &kp A &kp B + &kp C &tog 0 + >; + }; + }; }; &kscan { - events = < - /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - /* Toggle Layer */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* Combo Two */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + /* Combo One */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Combo Three */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + /* Toggle Layer */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* Combo Two */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Combo Three */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-1/native_posix_64.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap index 8eb5e9eb..96eccea4 100644 --- a/app/tests/combo/layer-filter-1/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-1/native_posix_64.keymap @@ -6,35 +6,35 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp X>; - layers = <1>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp X>; + layers = <1>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &tog 1 - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &tog 1 + >; + }; + }; }; &kscan { - events = < - /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* Combo One */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/multiple-timeouts/native_posix_64.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap index 87d21be1..d2176390 100644 --- a/app/tests/combo/multiple-timeouts/native_posix_64.keymap +++ b/app/tests/combo/multiple-timeouts/native_posix_64.keymap @@ -3,38 +3,38 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - combo_two { - timeout-ms = <120>; - key-positions = <0 1 2>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + combo_two { + timeout-ms = <120>; + key-positions = <0 1 2>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap index 8b7b4196..e8284665 100644 --- a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap @@ -3,7 +3,7 @@ #include /* - combo 0 timeout inf + combo 0 timeout inf combo 01 timeout inf combo 0123 timeout inf press 012 in any combination, release any of those keys @@ -14,104 +14,104 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1 2>; - bindings = <&kp X>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1 2>; + bindings = <&kp X>; + }; - combo_two { - timeout-ms = ; - key-positions = <0 2>; - bindings = <&kp Y>; - }; + combo_two { + timeout-ms = ; + key-positions = <0 2>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = ; - key-positions = <1>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = ; + key-positions = <1>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* all permutations of combo one press, combo triggered by release */ - /* while debugging these, you may want to set the release_timer to a high number */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) + events = < + /* all permutations of combo one press, combo triggered by release */ + /* while debugging these, you may want to set the release_timer to a high number */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - /* all permutations of combo two press and release, combo triggered by release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + /* all permutations of combo two press and release, combo triggered by release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap index 45737882..a695a388 100644 --- a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap @@ -9,57 +9,57 @@ expected outcome: AB after 100ms */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <50>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = <100>; - key-positions = <0 1 2>; - bindings = <&kp X>; - }; - }; + combo_three { + timeout-ms = <100>; + key-positions = <0 1 2>; + bindings = <&kp X>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - /* all permutations of combo two press and release, combo triggered by timeout */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + /* all permutations of combo two press and release, combo triggered by timeout */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap index ba547dc2..6bf0e710 100644 --- a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap @@ -9,44 +9,44 @@ expected: combo 01 after 100ms, immediately followed by key 2. */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; - combo_four { - timeout-ms = <100>; - key-positions = <0 1 2 3>; - bindings = <&kp W>; - }; + combo_four { + timeout-ms = <100>; + key-positions = <0 1 2 3>; + bindings = <&kp W>; + }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,100) - >; + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap index 0da394b5..0a2f5ee1 100644 --- a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap @@ -9,45 +9,45 @@ expected: key pos 0 followed by combo 12 */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <1 2>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <1 2>; + bindings = <&kp Y>; + }; - combo_four { - timeout-ms = <100>; - key-positions = <0 1 2 3>; - bindings = <&kp W>; - }; + combo_four { + timeout-ms = <100>; + key-positions = <0 1 2 3>; + bindings = <&kp W>; + }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,100) - >; + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap index f9537344..900c4af3 100644 --- a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap +++ b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap @@ -3,82 +3,82 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp X>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp X>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <0 2>; - bindings = <&kp Y>; - }; + combo_two { + timeout-ms = <30>; + key-positions = <0 2>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = <30>; - key-positions = <3>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = <30>; + key-positions = <3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* all permutations of combo one press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* all permutations of combo one press and release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - /* all permutations of combo two press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + /* all permutations of combo two press and release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap index 2a71ad32..dac0bd5c 100644 --- a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap index c6202365..19bad1d0 100644 --- a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap @@ -3,33 +3,33 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap index b8117187..2eb6271e 100644 --- a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap @@ -3,35 +3,35 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(0,0,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(0,0,100) + >; }; diff --git a/app/tests/combo/press-release/native_posix_64.keymap b/app/tests/combo/press-release/native_posix_64.keymap index 8d81f35b..6bd432f9 100644 --- a/app/tests/combo/press-release/native_posix_64.keymap +++ b/app/tests/combo/press-release/native_posix_64.keymap @@ -3,49 +3,49 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - /* all different combinations of press and release order */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* all different combinations of press and release order */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press-timeout/native_posix_64.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap index 497cf1aa..6ca6487b 100644 --- a/app/tests/combo/press-timeout/native_posix_64.keymap +++ b/app/tests/combo/press-timeout/native_posix_64.keymap @@ -3,33 +3,33 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap index cf7e79f7..9a395a41 100644 --- a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap index 0c55eb47..86ca3931 100644 --- a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap @@ -3,44 +3,44 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap index 248d6e75..65089578 100644 --- a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap @@ -3,44 +3,44 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap index 5af94d45..832e9705 100644 --- a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap @@ -3,36 +3,36 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - /* no slow-release! */ - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + /* no slow-release! */ + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp D &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp D &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap index 88351bea..7fdb012e 100644 --- a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap @@ -3,36 +3,36 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - slow-release; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + slow-release; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp D &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp D &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-press-release/native_posix_64.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap index 4b658a73..5e3fac42 100644 --- a/app/tests/gresc/gresc-press-release/native_posix_64.keymap +++ b/app/tests/gresc/gresc-press-release/native_posix_64.keymap @@ -3,47 +3,47 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &gresc &none - &kp LEFT_SHIFT &kp LEFT_GUI - >; - }; - }; + default_layer { + bindings = < + &gresc &none + &kp LEFT_SHIFT &kp LEFT_GUI + >; + }; + }; }; &kscan { - events = < - /* esc */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + /* esc */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) + /* LGUI+` */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + /* LGUI+` */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap index 78b8ebcb..18f94da5 100644 --- a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap +++ b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap @@ -11,33 +11,33 @@ The first gresc that is released releases the key. */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &gresc &gresc - &kp LEFT_SHIFT &kp LEFT_GUI - >; - }; - }; + default_layer { + bindings = < + &gresc &gresc + &kp LEFT_SHIFT &kp LEFT_GUI + >; + }; + }; }; &kscan { - events = < - /* esc */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ + events = < + /* esc */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ - >; + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap index 832ea7ef..51995f8d 100644 --- a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - behaviors { - ht_bal: behavior_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "balanced"; - tapping_term_ms = <300>; - bindings = <&kp>, <&kp>; - retro-tap; - }; - }; + behaviors { + ht_bal: behavior_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "balanced"; + tapping_term_ms = <300>; + bindings = <&kp>, <&kp>; + retro-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &none - &kp D &none>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &none + &kp D &none>; + }; + }; }; &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* retro tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* retro tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi index 5657644d..c750f8e3 100644 --- a/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap index 942d5ae4..8c24dc34 100644 --- a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_bal { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap index 677a2534..1db5f20e 100644 --- a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_bal { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi index 0966ce0d..ef8efd43 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_bal: behavior_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + ht_bal: behavior_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL C - &kp D &none>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL C + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/behavior_keymap.dtsi index d62be888..9f338ebc 100644 --- a/app/tests/hold-tap/balanced/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap index 6d016501..4bac8b83 100644 --- a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap @@ -3,39 +3,39 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L - >; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_PRESS(1,1,100) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_PRESS(1,1,100) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap index dc96ee8b..8dbc7d82 100644 --- a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - behaviors { - hp: behavior_hold_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping_term_ms = <300>; - bindings = <&kp>, <&kp>; - retro-tap; - }; - }; + behaviors { + hp: behavior_hold_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping_term_ms = <300>; + bindings = <&kp>, <&kp>; + retro-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &hp LEFT_SHIFT F &none - &kp D &none>; - }; - }; + default_layer { + bindings = < + &hp LEFT_SHIFT F &none + &kp D &none>; + }; + }; }; &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* retro tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* retro tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi index bf681004..71f3aba5 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_hold: behavior_hold_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "hold_hold_tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + ht_hold: behavior_hold_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "hold_hold_tap"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap index b48332ff..f35b73ba 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_hold { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap index 77398582..0b4eb320 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_hold { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 13a58c3e..e28eb4c3 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi index fee3361e..392a5f83 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - hp: behavior_hold_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + hp: behavior_hold_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &hp LEFT_SHIFT F &hp LEFT_CONTROL G - &kp D &none>; - }; - }; + default_layer { + bindings = < + &hp LEFT_SHIFT F &hp LEFT_CONTROL G + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi index 41c84e1e..da6b8362 100644 --- a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi @@ -5,26 +5,26 @@ / { - behaviors { - ht_hold: behavior_hold_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "hold_hold_tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_hold: behavior_hold_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "hold_hold_tap"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap index b733e3a2..500d2670 100644 --- a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap @@ -9,45 +9,45 @@ */ / { - behaviors { - tp_short: short_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP_SHORT"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <100>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - tp_long: long_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP_LONG"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + tp_short: short_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP_SHORT"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <100>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + tp_long: long_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP_LONG"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp_long LEFT_SHIFT F &tp_short LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &tp_long LEFT_SHIFT F &tp_short LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,20) - ZMK_MOCK_PRESS(0,1,20) - ZMK_MOCK_RELEASE(0,1,200) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,20) + ZMK_MOCK_PRESS(0,1,20) + ZMK_MOCK_RELEASE(0,1,200) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi index e4be8d15..79a88eb2 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap index 504318f7..179b64ee 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &tp { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap index 7061eee7..e926b45c 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &tp { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi index 4771ab75..02362ef2 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL C - &kp D &none>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL C + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi index cdeb9596..df307740 100644 --- a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi index 6ca7ac72..029a8128 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_tui: behavior_hold_tap_tap_unless_interrupted { - compatible = "zmk,behavior-hold-tap"; - label = "hold_tap_tap_unless_interrupted"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + ht_tui: behavior_hold_tap_tap_unless_interrupted { + compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi index 18f68d63..b24de6dd 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi @@ -5,26 +5,26 @@ / { - behaviors { - ht_tui: behavior_hold_tap_tap_unless_interrupted { - compatible = "zmk,behavior-hold-tap"; - label = "hold_tap_tap_unless_interrupted"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_tui: behavior_hold_tap_tap_unless_interrupted { + compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/key-repeat/behavior_keymap.dtsi b/app/tests/key-repeat/behavior_keymap.dtsi index 24902fc6..c8e2d9c4 100644 --- a/app/tests/key-repeat/behavior_keymap.dtsi +++ b/app/tests/key-repeat/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &key_repeat &kp A - &kp LCTRL &kp C_VOL_UP - >; - }; - }; + default_layer { + bindings = < + &key_repeat &kp A + &kp LCTRL &kp C_VOL_UP + >; + }; + }; }; diff --git a/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap b/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap index b042e8e0..e4687573 100644 --- a/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap +++ b/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap index 98c8f6f8..9078f304 100644 --- a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap index 42f6514b..1d27770b 100644 --- a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,9000) - ZMK_MOCK_RELEASE(0,1,30) - ZMK_MOCK_PRESS(0,0,30) - ZMK_MOCK_RELEASE(0,0,3000) - >; + events = < + ZMK_MOCK_PRESS(0,1,9000) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_PRESS(0,0,30) + ZMK_MOCK_RELEASE(0,0,3000) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap index ab9622e4..109aed5a 100644 --- a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap +++ b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap index 9ff64468..0d2d0f6c 100644 --- a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap +++ b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keypress/behavior_keymap.dtsi b/app/tests/keypress/behavior_keymap.dtsi index f0c5d0c2..52f9421c 100644 --- a/app/tests/keypress/behavior_keymap.dtsi +++ b/app/tests/keypress/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp B &none + &none &none + >; + }; + }; }; diff --git a/app/tests/keypress/kp-press-release/native_posix_64.keymap b/app/tests/keypress/kp-press-release/native_posix_64.keymap index c8e744ee..a414f34b 100644 --- a/app/tests/keypress/kp-press-release/native_posix_64.keymap +++ b/app/tests/keypress/kp-press-release/native_posix_64.keymap @@ -1,8 +1,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/behavior_keymap.dtsi b/app/tests/keytoggle/behavior_keymap.dtsi index 32712a8d..45d48164 100644 --- a/app/tests/keytoggle/behavior_keymap.dtsi +++ b/app/tests/keytoggle/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kt B &none + &none &none + >; + }; + }; }; diff --git a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap index f4d03429..4f70b591 100644 --- a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap @@ -3,46 +3,46 @@ #include &kscan { - events = < + events = < /* Toggle LALT on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Tap TAB twice */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* Toggle LSHFT on */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* Tap TAB once */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* Toggle LALT off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) /* Toggle LSHFT off */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt LALT &kp TAB - &kt LSHFT &kp A - >; - }; - }; + default_layer { + bindings = < + &kt LALT &kp TAB + &kt LSHFT &kp A + >; + }; + }; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap index 0a4ad4ae..b07f297f 100644 --- a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap @@ -3,36 +3,36 @@ #include &kscan { - events = < + events = < /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Press A */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Release A */ - ZMK_MOCK_RELEASE(1,0,10) - >; + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt LS(A) &trans - &kp A &trans - >; - }; - }; + default_layer { + bindings = < + &kt LS(A) &trans + &kp A &trans + >; + }; + }; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap index e25d4b18..5c2d2028 100644 --- a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap index e25d4b18..5c2d2028 100644 --- a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/macros/basic/native_posix_64.keymap b/app/tests/macros/basic/native_posix_64.keymap index a2812792..a34ba99f 100644 --- a/app/tests/macros/basic/native_posix_64.keymap +++ b/app/tests/macros/basic/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/behavior_keymap.dtsi b/app/tests/macros/behavior_keymap.dtsi index 7399cd5b..90322e42 100644 --- a/app/tests/macros/behavior_keymap.dtsi +++ b/app/tests/macros/behavior_keymap.dtsi @@ -9,60 +9,60 @@ #include / { - macros { - ZMK_MACRO(abc_macro, - wait-ms = <10>; - tap-ms = <50>; - bindings = <&kp A &kp B &kp C>; - ) + macros { + ZMK_MACRO(abc_macro, + wait-ms = <10>; + tap-ms = <50>; + bindings = <&kp A &kp B &kp C>; + ) - ZMK_MACRO(hold_shift_macro, - bindings - = <¯o_press &kp LSHFT> - , <¯o_tap> - , <&kp D &kp O &kp G> - , <¯o_release &kp LSHFT> - ; - ) + ZMK_MACRO(hold_shift_macro, + bindings + = <¯o_press &kp LSHFT> + , <¯o_tap> + , <&kp D &kp O &kp G> + , <¯o_release &kp LSHFT> + ; + ) - ZMK_MACRO(custom_timing, - bindings - = <¯o_wait_time 50> - , <&kp A> - , <¯o_tap_time 20> - , <&kp B &kp C> - ; - ) + ZMK_MACRO(custom_timing, + bindings + = <¯o_wait_time 50> + , <&kp A> + , <¯o_tap_time 20> + , <&kp B &kp C> + ; + ) - ZMK_MACRO(dual_sequence_macro, - wait-ms = <10>; - tap-ms = <40>; - bindings - = <¯o_press &kp LALT> - , <¯o_tap> - , <&kp TAB> - , <¯o_pause_for_release> - , <¯o_release &kp LALT> - ; - ) - }; + ZMK_MACRO(dual_sequence_macro, + wait-ms = <10>; + tap-ms = <40>; + bindings + = <¯o_press &kp LALT> + , <¯o_tap> + , <&kp TAB> + , <¯o_pause_for_release> + , <¯o_release &kp LALT> + ; + ) + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &abc_macro &mo 1 - &hold_shift_macro &custom_timing>; - }; + default_layer { + bindings = < + &abc_macro &mo 1 + &hold_shift_macro &custom_timing>; + }; - extra_layer { - bindings = < - &dual_sequence_macro &trans - &kp TAB &none>; + extra_layer { + bindings = < + &dual_sequence_macro &trans + &kp TAB &none>; - }; + }; - }; + }; }; diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap index e6ef4f49..bdf89abf 100644 --- a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap @@ -9,19 +9,19 @@ #include / { - macros { - ZMK_MACRO( - mo_mod_macro, - wait-ms = <0>; - tap-ms = <20>; - bindings - = <¯o_press &mo 1 &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo 1 &kp LSHFT>; - ) - }; + macros { + ZMK_MACRO( + mo_mod_macro, + wait-ms = <0>; + tap-ms = <20>; + bindings + = <¯o_press &mo 1 &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo 1 &kp LSHFT>; + ) + }; - behaviors { + behaviors { mth: macro_tap_hold { compatible = "zmk,behavior-hold-tap"; label = "MACRO_TAP_HOLD"; @@ -30,28 +30,28 @@ tapping-term-ms = <200>; bindings = <&mo_mod_macro>, <&kp>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mth 0 TAB &kp A - &kp B &kp C>; - }; + default_layer { + bindings = < + &mth 0 TAB &kp A + &kp B &kp C>; + }; - extra_layer { - bindings = < - &kp D &kp E - &kp F &kp G>; + extra_layer { + bindings = < + &kp D &kp E + &kp F &kp G>; - }; + }; - }; + }; }; &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap index c5cde5b4..4cc60bf5 100644 --- a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap @@ -9,38 +9,38 @@ #include / { - macros { - ZMK_MACRO( - mo_mod_macro, - wait-ms = <0>; - tap-ms = <20>; - bindings - = <¯o_press &mo 1 &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo 1 &kp LSHFT>; - ) - }; + macros { + ZMK_MACRO( + mo_mod_macro, + wait-ms = <0>; + tap-ms = <20>; + bindings + = <¯o_press &mo 1 &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo 1 &kp LSHFT>; + ) + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mo_mod_macro &kp A - &kp B &kp C>; - }; + default_layer { + bindings = < + &mo_mod_macro &kp A + &kp B &kp C>; + }; - extra_layer { - bindings = < - &kp D &kp E - &kp F &kp G>; + extra_layer { + bindings = < + &kp D &kp E + &kp F &kp G>; - }; + }; - }; + }; }; &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/press-mid-macro/native_posix_64.keymap b/app/tests/macros/press-mid-macro/native_posix_64.keymap index b8ae76f1..8010a8e7 100644 --- a/app/tests/macros/press-mid-macro/native_posix_64.keymap +++ b/app/tests/macros/press-mid-macro/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/press-release/native_posix_64.keymap b/app/tests/macros/press-release/native_posix_64.keymap index 25467126..75333333 100644 --- a/app/tests/macros/press-release/native_posix_64.keymap +++ b/app/tests/macros/press-release/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/timing-override/native_posix_64.keymap b/app/tests/macros/timing-override/native_posix_64.keymap index 343926a7..e5d35e88 100644 --- a/app/tests/macros/timing-override/native_posix_64.keymap +++ b/app/tests/macros/timing-override/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/wait-macro-release/native_posix_64.keymap b/app/tests/macros/wait-macro-release/native_posix_64.keymap index 6dabaeca..394e4a88 100644 --- a/app/tests/macros/wait-macro-release/native_posix_64.keymap +++ b/app/tests/macros/wait-macro-release/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap index fb939de5..916aa569 100644 --- a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap index 9ad50202..ec0591e5 100644 --- a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap index 74de8588..66fb1ed0 100644 --- a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap @@ -13,25 +13,25 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap index d5406e19..de1368bd 100644 --- a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap index 7071e8cd..9b7f4fe1 100644 --- a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap @@ -3,13 +3,13 @@ #include &kscan { - events = < + events = < /* Shift + tap &mod_morph --> expect B (but get Shift + B) */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { @@ -24,22 +24,22 @@ }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_SHIFT &mod_morph - &kp C &none - >; - }; + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; second_layer { - bindings = < - &trans &trans - &kp D &trans - >; - }; - }; + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; }; diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap index 96c2f270..e0c1d1e5 100644 --- a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap @@ -3,15 +3,15 @@ #include &kscan { - events = < + events = < /* Shift + hold &mod_morph --> expect and get D (no shift) */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,200) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,200) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { @@ -26,22 +26,22 @@ }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_SHIFT &mod_morph - &kp C &none - >; - }; + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; second_layer { - bindings = < - &trans &trans - &kp D &trans - >; - }; - }; + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; }; diff --git a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap index a82d3ea7..a20c04d5 100644 --- a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap @@ -14,24 +14,24 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/behavior_keymap.dtsi b/app/tests/mod-morph/behavior_keymap.dtsi index 09720d8d..2f880540 100644 --- a/app/tests/mod-morph/behavior_keymap.dtsi +++ b/app/tests/mod-morph/behavior_keymap.dtsi @@ -9,15 +9,15 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap index dbb2df5c..621945a8 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap @@ -4,25 +4,25 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LS(LA(LG(LEFT_CONTROL))) &kp LEFT_CONTROL - &kp A &none - >; - }; - }; + default_layer { + bindings = < + &kp LS(LA(LG(LEFT_CONTROL))) &kp LEFT_CONTROL + &kp A &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap index b01c6257..d68f8921 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap index 89930328..c2d12eb2 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap @@ -4,22 +4,22 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap index acd55e83..7be62b94 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap index 7e1865a0..8d1d773e 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap @@ -4,25 +4,25 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap index e175d60e..87101d83 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap index 8c4534f4..6b40fef1 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &none &none + >; + }; + }; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap index e82182c4..4b2ca139 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap index a36b85d2..a2564762 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/momentary-layer/1-normal/native_posix_64.keymap b/app/tests/momentary-layer/1-normal/native_posix_64.keymap index ed0e8ad1..387a1322 100644 --- a/app/tests/momentary-layer/1-normal/native_posix_64.keymap +++ b/app/tests/momentary-layer/1-normal/native_posix_64.keymap @@ -4,29 +4,29 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &kp C &trans - &none &none>; - }; - }; + layer_1 { + bindings = < + &kp C &trans + &none &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap index 9311fdee..776fc761 100644 --- a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap @@ -4,29 +4,29 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &kp C &none - &none &none>; - }; - }; + layer_1 { + bindings = < + &kp C &none + &none &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/3-covered/native_posix_64.keymap b/app/tests/momentary-layer/3-covered/native_posix_64.keymap index 62ae301d..a7939d9e 100644 --- a/app/tests/momentary-layer/3-covered/native_posix_64.keymap +++ b/app/tests/momentary-layer/3-covered/native_posix_64.keymap @@ -7,27 +7,27 @@ this test verifies that the correct key is released when a layer is enabled "on and the original key is "covered". */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &trans &mo 1 - &trans &trans>; - }; + default_layer { + bindings = < + &trans &mo 1 + &trans &trans>; + }; - layer_1 { - bindings = < - &trans &kp A - &trans &trans>; - }; - }; + layer_1 { + bindings = < + &trans &kp A + &trans &trans>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/momentary-layer/4-nested/native_posix_64.keymap b/app/tests/momentary-layer/4-nested/native_posix_64.keymap index fd376d00..1f4f0aea 100644 --- a/app/tests/momentary-layer/4-nested/native_posix_64.keymap +++ b/app/tests/momentary-layer/4-nested/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &mo 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &mo 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &none - &kp B &none>; - }; - }; + layer_2 { + bindings = < + &none &none + &kp B &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap index c467aea3..4c8f7890 100644 --- a/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &mo 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &mo 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &none - &kp B &none>; - }; - }; + layer_2 { + bindings = < + &none &none + &kp B &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/behavior_keymap.dtsi b/app/tests/momentary-layer/behavior_keymap.dtsi index 40bc31ec..63127a39 100644 --- a/app/tests/momentary-layer/behavior_keymap.dtsi +++ b/app/tests/momentary-layer/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &trans &trans>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &trans &trans>; + }; - layer_1 { - bindings = < - &kp C_NEXT &trans - &trans &trans>; - }; - }; + layer_1 { + bindings = < + &kp C_NEXT &trans + &trans &trans>; + }; + }; }; diff --git a/app/tests/none/behavior_keymap.dtsi b/app/tests/none/behavior_keymap.dtsi index 40d863c1..7a4c099b 100644 --- a/app/tests/none/behavior_keymap.dtsi +++ b/app/tests/none/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &kp A &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &kp A &none>; + }; - lower_layer { - bindings = < - &none &trans - &none &kp A>; - }; - }; + lower_layer { + bindings = < + &none &trans + &none &kp A>; + }; + }; }; diff --git a/app/tests/none/layered/native_posix_64.keymap b/app/tests/none/layered/native_posix_64.keymap index 597ca2db..b1e84c30 100644 --- a/app/tests/none/layered/native_posix_64.keymap +++ b/app/tests/none/layered/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/none/normal/native_posix.keymap b/app/tests/none/normal/native_posix.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/none/normal/native_posix.keymap +++ b/app/tests/none/normal/native_posix.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/none/normal/native_posix_64.keymap b/app/tests/none/normal/native_posix_64.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/none/normal/native_posix_64.keymap +++ b/app/tests/none/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap index 230e9566..f9612928 100644 --- a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap index 5c1c2264..bc541824 100644 --- a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap @@ -3,38 +3,38 @@ #include &sk { - quick-release; + quick-release; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_CONTROL &kp A - &sk LEFT_SHIFT &sk LEFT_ALT>; - }; - }; + default_layer { + bindings = < + &sk LEFT_CONTROL &kp A + &sk LEFT_SHIFT &sk LEFT_ALT>; + }; + }; }; &kscan { - events = < - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap sk LEFT_ALT */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* tap A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap sk LEFT_ALT */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* tap A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap index 79567de9..9121b188 100644 --- a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap @@ -3,41 +3,41 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &sk LEFT_SHIFT &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &sk LEFT_SHIFT &kp Z>; + }; + }; }; &kscan { - events = < - /* press sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* release sl lower_layer */ - ZMK_MOCK_RELEASE(0,1,10) - /* tap A (with left control and left shift enabled) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + /* press sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* release sl lower_layer */ + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (with left control and left shift enabled) */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap index e89faa93..23ceeeb6 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap @@ -8,58 +8,58 @@ */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sl 1 &kp A - &none &none>; - }; + default_layer { + bindings = < + &sl 1 &kp A + &none &none>; + }; - layer_1 { - bindings = < - &sl 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &sl 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &kp NUM_1 - &none &none>; - }; - }; + layer_2 { + bindings = < + &none &kp NUM_1 + &none &none>; + }; + }; }; &kscan { - events = < - /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* press sl 1 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press sl 2 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) - /* repeat test to check if cleanup is done correctly */ - /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + /* repeat test to check if cleanup is done correctly */ + /* press sl 1 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press sl 2 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap index f52a6bec..131e7069 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap @@ -4,23 +4,23 @@ #include "../behavior_keymap.dtsi" &sk { - quick-release; + quick-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - /* second key is pressed shortly after the first. It should not be capitalized. */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + /* second key is pressed shortly after the first. It should not be capitalized. */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) - /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap index 63aca99b..4a0c50c8 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap @@ -4,16 +4,16 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap index 18d09ebc..39020751 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap @@ -8,45 +8,45 @@ */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press X */ - ZMK_MOCK_PRESS(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* press sl 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press X */ + ZMK_MOCK_PRESS(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat test to check if cleanup is done correctly */ - /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press X */ - ZMK_MOCK_PRESS(0,1,10) - /* press Y */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + /* press sl 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press X */ + ZMK_MOCK_PRESS(0,1,10) + /* press Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap index 47600269..c635dade 100644 --- a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap index 2fb661a7..e629d270 100644 --- a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap index 92fd1e0a..2404a582 100644 --- a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,800) - ZMK_MOCK_PRESS(1,0,400) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,800) + ZMK_MOCK_PRESS(1,0,400) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap index 1daa6c4f..7cf04b7d 100644 --- a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,1100) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,1100) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap index 1be65a5b..a22d0a5a 100644 --- a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap +++ b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap index 6d88a9ea..4da4ad98 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap @@ -3,54 +3,54 @@ #include &sk { - quick-release; + quick-release; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_SHIFT &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk LEFT_SHIFT &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap B */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap Y */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap B */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap index a90bb32e..d9c49014 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap @@ -3,45 +3,45 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat */ - /* tap sl */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat */ + /* tap sl */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap index f811f7e9..74678256 100644 --- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap @@ -3,25 +3,25 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_SHIFT &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &sk LEFT_SHIFT &none + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* the sticky key is pressed again, so the previous one must be cancelled */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* the sticky key is pressed again, so the previous one must be cancelled */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/behavior_keymap.dtsi b/app/tests/sticky-keys/behavior_keymap.dtsi index f1277009..9322cb14 100644 --- a/app/tests/sticky-keys/behavior_keymap.dtsi +++ b/app/tests/sticky-keys/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &mo 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &mo 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; diff --git a/app/tests/tap-dance/1a-tap1/native_posix_64.keymap b/app/tests/tap-dance/1a-tap1/native_posix_64.keymap index 1e5dff06..4e65cfa1 100644 --- a/app/tests/tap-dance/1a-tap1/native_posix_64.keymap +++ b/app/tests/tap-dance/1a-tap1/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap index 5674c4ea..47fa8c33 100644 --- a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap index 142b8236..6b01dfff 100644 --- a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap +++ b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap index bcfc21d2..c16f875b 100644 --- a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap +++ b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap index 6691437e..49948886 100644 --- a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap +++ b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap index 942ecfc0..7bedd650 100644 --- a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap +++ b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap b/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap index 8a62430c..903b9a88 100644 --- a/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(1,0,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap b/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap index 4a76bdb0..7d10b715 100644 --- a/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap b/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap index e1b6d979..571a877f 100644 --- a/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap +++ b/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap b/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap index 55a98d36..0220977a 100644 --- a/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap b/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap index b31e92dc..58595291 100644 --- a/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap b/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap index 6397fbb3..78770b13 100644 --- a/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap +++ b/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/4a-single/native_posix_64.keymap b/app/tests/tap-dance/4a-single/native_posix_64.keymap index 348a6827..d473a7d2 100644 --- a/app/tests/tap-dance/4a-single/native_posix_64.keymap +++ b/app/tests/tap-dance/4a-single/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap b/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap index 2188fd02..79bdf2f7 100644 --- a/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap b/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap index 320b7199..012d932d 100644 --- a/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap b/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap index 17e538bd..fea96a56 100644 --- a/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap +++ b/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap b/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap index 150f6d05..f98be05f 100644 --- a/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap +++ b/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap index 72b6744a..a8a82fd9 100644 --- a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,200) + >; }; \ No newline at end of file diff --git a/app/tests/to-layer/behavior_keymap.dtsi b/app/tests/to-layer/behavior_keymap.dtsi index 81e7e809..663e897d 100644 --- a/app/tests/to-layer/behavior_keymap.dtsi +++ b/app/tests/to-layer/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &to 0 &to 1 - &kp A &kp S>; - }; + default_layer { + bindings = < + &to 0 &to 1 + &kp A &kp S>; + }; - second_layer { - bindings = < - &to 0 &to 1 - &kp J &kp K>; - }; - }; + second_layer { + bindings = < + &to 0 &to 1 + &kp J &kp K>; + }; + }; }; diff --git a/app/tests/to-layer/normal/native_posix_64.keymap b/app/tests/to-layer/normal/native_posix_64.keymap index 056341f7..4cb23809 100644 --- a/app/tests/to-layer/normal/native_posix_64.keymap +++ b/app/tests/to-layer/normal/native_posix_64.keymap @@ -11,19 +11,19 @@ // To layer 0 -- does nothing &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/toggle-layer/behavior_keymap.dtsi b/app/tests/toggle-layer/behavior_keymap.dtsi index b9c0d4a4..1ecf8599 100644 --- a/app/tests/toggle-layer/behavior_keymap.dtsi +++ b/app/tests/toggle-layer/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &tog 1 - &kp D &kp G>; - }; + default_layer { + bindings = < + &kp B &tog 1 + &kp D &kp G>; + }; - lower_layer { - bindings = < - &kp C_NEXT &trans - &kp L &kp J>; - }; + lower_layer { + bindings = < + &kp C_NEXT &trans + &kp L &kp J>; + }; - raise_layer { - bindings = < - &kp W &kp U - &kp X &kp M>; - }; - }; + raise_layer { + bindings = < + &kp W &kp U + &kp X &kp M>; + }; + }; }; diff --git a/app/tests/toggle-layer/early-key-release/native_posix_64.keymap b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap index 6c293390..0a0c88ea 100644 --- a/app/tests/toggle-layer/early-key-release/native_posix_64.keymap +++ b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap @@ -4,6 +4,6 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/toggle-layer/normal/native_posix_64.keymap b/app/tests/toggle-layer/normal/native_posix_64.keymap index 9df9d649..97bdd179 100644 --- a/app/tests/toggle-layer/normal/native_posix_64.keymap +++ b/app/tests/toggle-layer/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/transparent/behavior_keymap.dtsi b/app/tests/transparent/behavior_keymap.dtsi index 2a7e783a..dd5ded90 100644 --- a/app/tests/transparent/behavior_keymap.dtsi +++ b/app/tests/transparent/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &trans &mo 1 - &kp A &none>; - }; + default_layer { + bindings = < + &trans &mo 1 + &kp A &none>; + }; - lower_layer { - bindings = < - &trans &trans - &trans &kp A>; - }; - }; + lower_layer { + bindings = < + &trans &trans + &trans &kp A>; + }; + }; }; diff --git a/app/tests/transparent/layered/native_posix_64.keymap b/app/tests/transparent/layered/native_posix_64.keymap index 597ca2db..b1e84c30 100644 --- a/app/tests/transparent/layered/native_posix_64.keymap +++ b/app/tests/transparent/layered/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/transparent/normal/native_posix_64.keymap b/app/tests/transparent/normal/native_posix_64.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/transparent/normal/native_posix_64.keymap +++ b/app/tests/transparent/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.keymap b/app/tests/wpm/1-single_keypress/native_posix_64.keymap index 2aa52c16..2b113409 100644 --- a/app/tests/wpm/1-single_keypress/native_posix_64.keymap +++ b/app/tests/wpm/1-single_keypress/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ - ZMK_MOCK_PRESS(0,0,6000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ + ZMK_MOCK_PRESS(0,0,6000) + >; }; \ No newline at end of file diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap index 3cfab946..869a5208 100644 --- a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap +++ b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap @@ -1,15 +1,15 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - //1st WPM worker call - 12wpm - 1 key press in 1 second - ZMK_MOCK_PRESS(0,0,1000) - ZMK_MOCK_RELEASE(0,0,10) - // 2nd WPM worker call - 12wpm - 2 key press in 2 second - // note there is no event for this as WPM hasn't changed - // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds - ZMK_MOCK_PRESS(0,0,2000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + //1st WPM worker call - 12wpm - 1 key press in 1 second + ZMK_MOCK_PRESS(0,0,1000) + ZMK_MOCK_RELEASE(0,0,10) + // 2nd WPM worker call - 12wpm - 2 key press in 2 second + // note there is no event for this as WPM hasn't changed + // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds + ZMK_MOCK_PRESS(0,0,2000) + >; }; \ No newline at end of file diff --git a/app/tests/wpm/behavior_keymap.dtsi b/app/tests/wpm/behavior_keymap.dtsi index f0c5d0c2..52f9421c 100644 --- a/app/tests/wpm/behavior_keymap.dtsi +++ b/app/tests/wpm/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp B &none + &none &none + >; + }; + }; }; diff --git a/docs/blog/2020-10-03-bootloader-fix.md b/docs/blog/2020-10-03-bootloader-fix.md index 8a9fd7f8..ec1d7b0b 100644 --- a/docs/blog/2020-10-03-bootloader-fix.md +++ b/docs/blog/2020-10-03-bootloader-fix.md @@ -175,19 +175,19 @@ do is shift back the settings area and code space `0xC000` bytes. We'll apply this to all of the `.dts` files for the boards that were affected by this issue. ```diff - code_partition: partition@26000 { - label = "code_partition"; -- reg = <0x00026000 0x000d2000>; -+ reg = <0x00026000 0x000c6000>; - }; + code_partition: partition@26000 { + label = "code_partition"; +- reg = <0x00026000 0x000d2000>; ++ reg = <0x00026000 0x000c6000>; + }; -- storage_partition: partition@f8000 { -+ storage_partition: partition@ec000 { - label = "storage"; -- reg = <0x000f8000 0x00008000>; -+ reg = <0x000ec000 0x00008000>; - }; +- storage_partition: partition@f8000 { ++ storage_partition: partition@ec000 { + label = "storage"; +- reg = <0x000f8000 0x00008000>; ++ reg = <0x000ec000 0x00008000>; + }; ``` And with those changes, we should no longer run into this issue! In the process diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index f267e4a4..f0096606 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -57,14 +57,14 @@ For example, the following hold-tap configuration enables `global-quick-tap` wit ``` gqt: global-quick-tap { - compatible = "zmk,behavior-hold-tap"; - label = "GLOBAL_QUICK_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - quick-tap-ms = <125>; - global-quick-tap; - bindings = <&kp>, <&kp>; + compatible = "zmk,behavior-hold-tap"; + label = "GLOBAL_QUICK_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <125>; + global-quick-tap; + bindings = <&kp>, <&kp>; }; ``` @@ -80,7 +80,7 @@ For example, if you press `&mt LEFT_SHIFT A` and then release it without pressin ``` &mt { - retro-tap; + retro-tap; }; ``` @@ -101,28 +101,28 @@ See the following example, which uses a hold-tap behavior definition, configured #include / { - behaviors { - pht: positional_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "POSITIONAL_HOLD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <400>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = <1>; // <---[[the W key]] - }; - }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - default_layer { - bindings = < - // position 0 position 1 position 2 - &pht LEFT_SHIFT Q &kp W &kp E - >; - }; - }; + behaviors { + pht: positional_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "POSITIONAL_HOLD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <400>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = <1>; // <---[[the W key]] + }; + }; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + default_layer { + bindings = < + // position 0 position 1 position 2 + &pht LEFT_SHIFT Q &kp W &kp E + >; + }; + }; }; ``` @@ -154,28 +154,28 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - lh_pht: left_hand_positional_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "LEFT_POSITIONAL_HOLD_TAP"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <100>; // <---[[produces tap if held longer than tapping-term-ms]] - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = <5 6 7 8 9 10>; // <---[[right-hand keys]] - }; - }; + behaviors { + lh_pht: left_hand_positional_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LEFT_POSITIONAL_HOLD_TAP"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <100>; // <---[[produces tap if held longer than tapping-term-ms]] + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = <5 6 7 8 9 10>; // <---[[right-hand keys]] + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - // position 0 pos 1 pos 2 pos 3 pos 4 pos 5 pos 6 pos 7 pos 8 pos 9 pos 10 - &lh_pht LSFT A &lh_pht LGUI S &lh_pht LALT D &lh_pht LCTL F &kp G &kp H &kp I &kp J &kp K &kp L &kp SEMI - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + // position 0 pos 1 pos 2 pos 3 pos 4 pos 5 pos 6 pos 7 pos 8 pos 9 pos 10 + &lh_pht LSFT A &lh_pht LGUI S &lh_pht LALT D &lh_pht LCTL F &kp G &kp H &kp I &kp J &kp K &kp L &kp SEMI + >; + }; + }; }; ``` @@ -186,26 +186,26 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - hm: homerow_mods { - compatible = "zmk,behavior-hold-tap"; - label = "HOMEROW_MODS"; - #binding-cells = <2>; - tapping-term-ms = <150>; - quick-tap-ms = <0>; - flavor = "tap-preferred"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + hm: homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "HOMEROW_MODS"; + #binding-cells = <2>; + tapping-term-ms = <150>; + quick-tap-ms = <0>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &hm LCTRL A &hm LGUI S &hm LALT D &hm LSHIFT F - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &hm LCTRL A &hm LGUI S &hm LALT D &hm LSHIFT F + >; + }; + }; }; ``` @@ -216,26 +216,26 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - bhm: balanced_homerow_mods { - compatible = "zmk,behavior-hold-tap"; - label = "HOMEROW_MODS"; - #binding-cells = <2>; - tapping-term-ms = <200>; // <---[[moderate duration]] - quick-tap-ms = <0>; - flavor = "balanced"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + bhm: balanced_homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "HOMEROW_MODS"; + #binding-cells = <2>; + tapping-term-ms = <200>; // <---[[moderate duration]] + quick-tap-ms = <0>; + flavor = "balanced"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &bhm LCTRL A &bhm LGUI S &bhm LALT D &bhm LSHIFT F - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &bhm LCTRL A &bhm LGUI S &bhm LALT D &bhm LSHIFT F + >; + }; + }; }; ``` @@ -264,14 +264,14 @@ A popular method of implementing Autoshift in ZMK involves a C-preprocessor macr }; }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys + >; + }; + }; }; ``` @@ -300,14 +300,14 @@ This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) }; keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap - MO_TOG(3) // &mo 3 on hold, &tog 3 on tap - >; - }; - }; + compatible = "zmk,keymap"; + default_layer { + bindings = < + &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap + MO_TOG(3) // &mo 3 on hold, &tog 3 on tap + >; + }; + }; }; ``` diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md index 0818aaae..cf793089 100644 --- a/docs/docs/behaviors/layers.md +++ b/docs/docs/behaviors/layers.md @@ -105,29 +105,29 @@ Example: #define NONE 0 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &tog NAVI &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS &kp NUMBER_7 &kp NUMBER_8 &kp NUMBER_9 &kp KP_PLUS &kp NUMBER_4 &kp NUMBER_5 &kp NUMBER_6 &kp KP_PLUS &kp NUMBER_1 &kp NUMBER_2 &kp NUMBER_3 &kp RETURN &kp NUMBER_0 &kp NUMBER_0 &kp DOT &kp RETURN - >; - }; + >; + }; - nav_layer { - bindings = < + nav_layer { + bindings = < &tog NAVI &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS &kp HOME &kp UP &kp PAGE_UP &kp KP_PLUS &kp LEFT &none &kp RIGHT &kp KP_PLUS &kp END &kp DOWN &kp PAGE_DOWN &kp RETURN &kp INSERT &kp INSERT &kp DEL &kp RETURN >; - }; - }; + }; + }; }; ``` diff --git a/docs/docs/behaviors/tap-dance.md b/docs/docs/behaviors/tap-dance.md index 65d5e765..c68b51dc 100644 --- a/docs/docs/behaviors/tap-dance.md +++ b/docs/docs/behaviors/tap-dance.md @@ -42,25 +42,25 @@ This example configures a tap-dance named `td0` that outputs the number of times #include / { - behaviors { - td0: tap_dance_0 { + behaviors { + td0: tap_dance_0 { compatible = "zmk,behavior-tap-dance"; label = "TAP_DANCE_0"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&kp N1>, <&kp N2>, <&kp N3>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &td0 - >; - }; - }; + default_layer { + bindings = < + &td0 + >; + }; + }; }; ``` @@ -83,25 +83,25 @@ This example configures a mod-tap inside a tap-dance named `td_mt` that outputs #include / { - behaviors { - td_mt: tap_dance_mod_tap { + behaviors { + td_mt: tap_dance_mod_tap { compatible = "zmk,behavior-tap-dance"; label = "TAP_DANCE_MOD_TAP"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&mt LSHIFT CAPSLOCK>, <&kp LCTRL>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &td_mt - >; - }; - }; + default_layer { + bindings = < + &td_mt + >; + }; + }; }; ``` diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index 51fd45b7..1ff1bfa0 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -116,14 +116,14 @@ Devicetree files look like this: ```devicetree / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + }; }; ``` @@ -167,9 +167,9 @@ If the node you want to edit doesn't have a label, you can also write a new tree ```devicetree / { - kscan { - debounce-press-ms = <0>; - }; + kscan { + debounce-press-ms = <0>; + }; }; ``` @@ -244,7 +244,7 @@ Example: some-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>, <&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + ; ``` #### path diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index 6d026f2b..0d70aa3b 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -367,15 +367,15 @@ For the purpose of this section, we will discuss the structure of `app/dts/behav #include / { - behaviors { - /omit-if-no-ref/ gresc: grave_escape { - compatible = "zmk,behavior-mod-morph"; - label = "GRAVE_ESCAPE"; - #binding-cells = <0>; - bindings = <&kp ESC>, <&kp GRAVE>; + behaviors { + /omit-if-no-ref/ gresc: grave_escape { + compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - }; - }; + }; + }; }; ``` diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 62d71f03..18616923 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -55,7 +55,7 @@ The `Kconfig.shield` file defines any additional Kconfig settings that may be re ``` config SHIELD_MY_BOARD - def_bool $(shields_list_contains,my_board) + def_bool $(shields_list_contains,my_board) ``` This will make sure that a new configuration value named `SHIELD_MY_BOARD` is set to true whenever `my_board` is used as the shield name, either as the `SHIELD` variable [in a local build](build-flash.md) or in your `build.yaml` file [when using Github Actions](../customization). Note that this configuration value will be used in `Kconfig.defconfig` to set other properties about your shield, so make sure that they match. @@ -64,10 +64,10 @@ This will make sure that a new configuration value named `SHIELD_MY_BOARD` is se ``` config SHIELD_MY_BOARD_LEFT - def_bool $(shields_list_contains,my_board_left) + def_bool $(shields_list_contains,my_board_left) config SHIELD_MY_BOARD_RIGHT - def_bool $(shields_list_contains,my_board_right) + def_bool $(shields_list_contains,my_board_right) ``` ### Kconfig.defconfig @@ -87,7 +87,7 @@ The keyboard name must be less than or equal to 16 characters in length, otherwi if SHIELD_MY_BOARD config ZMK_KEYBOARD_NAME - default "My Board" + default "My Board" endif ``` @@ -101,17 +101,17 @@ Finally, you'll want to turn on the split option for both sides. This can all be if SHIELD_MY_BOARD_LEFT config ZMK_KEYBOARD_NAME - default "My Board" + default "My Board" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_MY_BOARD_LEFT || SHIELD_MY_BOARD_RIGHT config ZMK_SPLIT - default y + default y endif ``` @@ -134,13 +134,13 @@ this might look something like: ``` / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -149,12 +149,12 @@ this might look something like: , <&pro_micro 16 GPIO_ACTIVE_HIGH> ; - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + ; + }; }; ``` @@ -174,43 +174,43 @@ For `col2row` directed boards like the iris, the shared .dtsi file may look like #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A from the schematic file - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B from the schematic file - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C from the schematic file - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D from the schematic file - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row E from the schematic file - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A from the schematic file + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B from the schematic file + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C from the schematic file + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D from the schematic file + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row E from the schematic file + ; - }; + }; }; ``` @@ -230,14 +230,14 @@ This is exemplified with the iris .overlay files. #include "iris.dtsi" // Notice that the main dtsi files are included in the overlay. &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic - , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic - , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic - , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic - , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic - , <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic + , <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic + ; }; ``` @@ -247,18 +247,18 @@ This is exemplified with the iris .overlay files. #include "iris.dtsi" &default_transform { // The matrix transform for this board is 6 columns over because the left half is 6 columns wide according to the matrix. - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic - , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic - , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic - , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic - , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic - , <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic + , <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic + ; }; ``` @@ -316,28 +316,28 @@ Here is an example for the [nice60](https://github.com/Nicell/nice60), which use #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <8>; - rows = <8>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <8>; // | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | MX13 | MX14 | // | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | MX21 | MX22 | MX23 | MX34 | MX25 | MX26 | MX27 | MX28 | // | MX29 | MX30 | MX31 | MX32 | MX33 | MX34 | MX35 | MX36 | MX37 | MX38 | MX39 | MX40 | MX41 | // | MX42 | MX43 | MX44 | MX45 | MX46 | MX47 | MX48 | MX49 | MX50 | MX51 | MX52 | MX53 | // | MX54 | MX55 | MX56 | MX57 | MX58 | MX59 | MX60 | MX61 | - map = < + map = < RC(3,0) RC(2,0) RC(1,0) RC(0,0) RC(1,1) RC(0,1) RC(0,2) RC(1,3) RC(0,3) RC(1,4) RC(0,4) RC(0,5) RC(1,6) RC(1,7) RC(4,0) RC(4,1) RC(3,1) RC(2,1) RC(2,2) RC(1,2) RC(2,3) RC(3,4) RC(2,4) RC(2,5) RC(1,5) RC(2,6) RC(2,7) RC(3,7) RC(5,0) RC(5,1) RC(5,2) RC(4,2) RC(3,2) RC(4,3) RC(3,3) RC(4,4) RC(4,5) RC(3,5) RC(4,6) RC(3,6) RC(4,7) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(5,3) RC(6,4) RC(5,4) RC(6,5) RC(5,5) RC(6,6) RC(5,6) RC(5,7) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,5) RC(7,6) RC(6,7) RC(7,7) - >; - }; + >; + }; ``` Some important things to note: @@ -433,13 +433,13 @@ In your device tree file you will need to add the following lines to define the ``` left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = ; - b-gpios = ; - resolution = <4>; - status = "disabled"; - }; + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = ; + b-gpios = ; + resolution = <4>; + status = "disabled"; + }; ``` Here you will have to replace PIN_A and PIN_B with the appropriate pins that your PCB utilizes for the encoder(s). For keyboards that use the Pro Micro or any of the Pro Micro replacements, Sparkfun's [Pro Micro Hookup Guide](https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro) has a pinout diagram that can be useful to determine the right pins. Reference either the blue numbers labeled "Arduino" (digital pins) or the green numbers labeled "Analog" (analog pins). For pins that are labeled as both digital and analog, refer to your specific board's .dtsi file to determine how you should refer to that pin. @@ -450,9 +450,9 @@ Once you have defined the encoder sensors, you will have to add them to the list ``` sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; ``` In this example, a left_encoder and right_encoder are both added. Additional encoders can be added with spaces separating each, and the order they are added here determines the order in which you define their behavior in your keymap. @@ -463,7 +463,7 @@ Add the following lines to your overlay file(s) to enable the encoder: ``` &left_encoder { - status = "okay"; + status = "okay"; }; ``` diff --git a/docs/docs/features/backlight.md b/docs/docs/features/backlight.md index 03d206f1..717361a2 100644 --- a/docs/docs/features/backlight.md +++ b/docs/docs/features/backlight.md @@ -62,9 +62,9 @@ Then you have to add the following lines to your `.dts` file: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; - /* ch0-inverted; */ + status = "okay"; + ch0-pin = <45>; + /* ch0-inverted; */ }; ``` @@ -84,7 +84,7 @@ Then you have to add the following lines inside the root devicetree node on the label = "Backlight LEDs"; pwm_led_0 { pwms = <&pwm0 45>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -129,9 +129,9 @@ Then add the following lines to your `.overlay` file: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; - /* ch0-inverted; */ + status = "okay"; + ch0-pin = <45>; + /* ch0-inverted; */ }; ``` @@ -151,7 +151,7 @@ Then you have to add the following lines inside the root devicetree node on the label = "Backlight LEDs"; pwm_led_0 { pwms = <&pwm0 45>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -182,7 +182,7 @@ Optionally, on Pro Micro compatible shields you can add a LED GPIO node to your label = "Backlight LEDs"; gpio_led_0 { gpios = <&pro_micro 20 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -201,10 +201,10 @@ In order to do that, first you need to enable PWM for each pin: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; /* LED 0 */ - ch1-pin = <46>; /* LED 1 */ - ch2-pin = <47>; /* LED 2 */ + status = "okay"; + ch0-pin = <45>; /* LED 0 */ + ch1-pin = <46>; /* LED 1 */ + ch2-pin = <47>; /* LED 2 */ ... }; ``` diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 09191896..44313cc1 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -12,14 +12,14 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod ``` / { - combos { - compatible = "zmk,combos"; - combo_esc { - timeout-ms = <50>; - key-positions = <0 1>; - bindings = <&kp ESC>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_esc { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp ESC>; + }; + }; }; ``` diff --git a/docs/docs/features/keymaps.md b/docs/docs/features/keymaps.md index 6d4e5f2c..93c2c825 100644 --- a/docs/docs/features/keymaps.md +++ b/docs/docs/features/keymaps.md @@ -113,10 +113,10 @@ Nested under the devicetree root, is the keymap node. The node _name_ itself is ``` keymap { - compatible = "zmk,keymap"; + compatible = "zmk,keymap"; // Layer nodes go here! - }; + }; ``` ### Layers diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index c1dc68d3..00d3aa0a 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -60,18 +60,18 @@ Here's an example on a definition that uses P0.06: #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { @@ -149,9 +149,9 @@ Once you have your `led_strip` properly defined you need to add it to the root d ``` / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; ``` diff --git a/docs/docs/keymap-example-file.md b/docs/docs/keymap-example-file.md index cb20cb6d..d8d201af 100644 --- a/docs/docs/keymap-example-file.md +++ b/docs/docs/keymap-example-file.md @@ -3,24 +3,24 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | CTRL+A | CTRL+C | | CTRL+V | CTRL+X | N | M | , | . | / | R CTRL | // | GUI | DEL | RETURN | SPACE | ESCAPE | | RETURN | SPACE | TAB | BSPC | R ALT | - bindings = < + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp LC(A) &kp LC(C) &kp LC(V) &kp LC(X) &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; ``` diff --git a/docs/docs/keymap-example.md b/docs/docs/keymap-example.md index 9d751f59..47d1c06b 100644 --- a/docs/docs/keymap-example.md +++ b/docs/docs/keymap-example.md @@ -1,21 +1,21 @@ ``` - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | CTRL+A | CTRL+C | | CTRL+V | CTRL+X | N | M | , | . | / | R CTRL | // | GUI | DEL | RETURN | SPACE | ESCAPE | | RETURN | SPACE | TAB | BSPC | R ALT | - bindings = < + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp LC(A) &kp LC(C) &kp LC(V) &kp LC(X) &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; ``` From 5b07c86d05a81a82d4fd72ad29d3daa846a2b458 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:00:12 -0500 Subject: [PATCH 073/134] chore: Update Prettier Added a workaround to select the latest version of Prettier with pre-commit, since the pre-commit mirror repo started tracking alpha releases and doesn't have anything beyond 2.7.1. --- .pre-commit-config.yaml | 3 +++ app/package-lock.json | 14 +++++++------- app/package.json | 2 +- docs/package-lock.json | 14 +++++++------- docs/package.json | 2 +- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1375a6ae..e0666ea8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,6 +15,9 @@ repos: rev: v2.7.1 hooks: - id: prettier + # Workaround for https://github.com/pre-commit/mirrors-prettier/issues/29 + additional_dependencies: + - prettier@2.8.7 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: diff --git a/app/package-lock.json b/app/package-lock.json index ed8765f3..060fcba0 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -9,13 +9,13 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { - "prettier": "^2.7.1" + "prettier": "^2.8.7" } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -30,9 +30,9 @@ }, "dependencies": { "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true } } diff --git a/app/package.json b/app/package.json index 9ad28788..e1a7957f 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,6 @@ }, "homepage": "https://zmk.dev/", "devDependencies": { - "prettier": "^2.7.1" + "prettier": "^2.8.7" } } diff --git a/docs/package-lock.json b/docs/package-lock.json index c7333cb3..2c8a7fba 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -39,7 +39,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "^2.7.1", + "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" @@ -12201,9 +12201,9 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -24678,9 +24678,9 @@ "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "pretty-error": { diff --git a/docs/package.json b/docs/package.json index 95d47b9f..70105b54 100644 --- a/docs/package.json +++ b/docs/package.json @@ -58,7 +58,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "^2.7.1", + "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" From 7a352908eebdc84aca905a83a22e27748154ad0d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 11:37:42 -0500 Subject: [PATCH 074/134] docs: Add pre-commit documentation --- docs/docs/development/pre-commit.md | 37 +++++++++++++++++++++++++++++ docs/sidebars.js | 1 + 2 files changed, 38 insertions(+) create mode 100644 docs/docs/development/pre-commit.md diff --git a/docs/docs/development/pre-commit.md b/docs/docs/development/pre-commit.md new file mode 100644 index 00000000..b4306fc9 --- /dev/null +++ b/docs/docs/development/pre-commit.md @@ -0,0 +1,37 @@ +--- +title: Pre-commit +--- + +ZMK uses [pre-commit](https://pre-commit.com/) to check for common errors and make sure the codebase is formatted consistently. + +Pre-commit is run on every pull request. You can also install it locally to get the same checks run on every commit you make _before_ you submit a pull request. + +## Installing pre-commit + +Open a terminal and run: + +```bash +pip3 install pre-commit +``` + +If this doesn't work, make sure [Python](https://www.python.org/) is installed and try again. + +## Enabling Commit Hooks + +Now that pre-commit is installed on your PC, you need to install it into the ZMK repo to enable it. Open a terminal to the ZMK repo directory and run: + +```bash +pre-commit install +``` + +This should print a message such as + +``` +pre-commit installed at .git\hooks\pre-commit +``` + +Pre-commit will now automatically check your changes whenever you run `git commit`. If it detects a problem, it will describe the problem and cancel the commit. For simple problems such as incorrect formatting, it will also automatically fix the files so you can just `git add` them and try again. + +## Automatically Enabling pre-commit + +Pre-commit can be configured to automatically install itself into any newly cloned repository, so you don't have to remember to run `pre-commit install`. See the [pre-commit documentation](https://pre-commit.com/#automatically-enabling-pre-commit-on-repositories) for instructions. diff --git a/docs/sidebars.js b/docs/sidebars.js index 21585747..43f17b41 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -71,6 +71,7 @@ module.exports = { ], Development: [ "development/clean-room", + "development/pre-commit", "development/documentation", "development/setup", "development/build-flash", From de152fe7419b8a02ca8a1723c3487dba69da3969 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Apr 2023 23:51:40 -0700 Subject: [PATCH 075/134] fix(bluetooth): Revert to Legacy LLCP * Reports of constant/frequent disconnects, with HCI err 0x28, "instant passed", seem linked to newer LLCP that became default in Zephyr 3.2, so revert to the Legacy LLCP for now until a proper fix for new LLCP can be found. --- app/Kconfig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 25a99b55..32b708e8 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -120,6 +120,11 @@ menuconfig ZMK_BLE if ZMK_BLE +choice BT_LL_SW_LLCP_IMPL + default BT_LL_SW_LLCP_LEGACY + +endchoice + config SYSTEM_WORKQUEUE_STACK_SIZE default 4096 if SOC_RP2040 default 2048 From e52e734480816d269ecedb5bac6a3703577e6c02 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 25 Apr 2023 05:51:04 +0000 Subject: [PATCH 076/134] chore: Fix formatting of Kconfig setting. --- app/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 32b708e8..d1b6682f 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -121,7 +121,7 @@ menuconfig ZMK_BLE if ZMK_BLE choice BT_LL_SW_LLCP_IMPL - default BT_LL_SW_LLCP_LEGACY + default BT_LL_SW_LLCP_LEGACY endchoice From db08e041c64d1a2b232bca9f728c02cde3907860 Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Tue, 25 Apr 2023 18:37:33 +0100 Subject: [PATCH 077/134] feat(boards): Polarity works CKP Series Adds support for the CKP family of boards BT60V2 ANSIHotswap, ISO Hotswap, ANSI Lowpro and soldered BT65 ANSI Hotswap, ISO Hotswap and soldered BT75 ANSI Hotswap and soldered The BT65 and BT75 are stylised as btXX_v1 in order to maintain compatibility with customers existing zmk-config setups in the same way the BT60 V1 was handled when merged into main. CKP boards have identical pinmapping between hotswap and soldered so there's only one set of defconfig, dts, keymap, yaml and yml files per size --- app/boards/arm/ckp/Kconfig | 8 + app/boards/arm/ckp/Kconfig.board | 16 ++ app/boards/arm/ckp/Kconfig.defconfig | 34 +++++ app/boards/arm/ckp/board.cmake | 4 + app/boards/arm/ckp/bt60_v2.dts | 71 +++++++++ app/boards/arm/ckp/bt60_v2.keymap | 177 ++++++++++++++++++++++ app/boards/arm/ckp/bt60_v2.yaml | 15 ++ app/boards/arm/ckp/bt60_v2.zmk.yml | 14 ++ app/boards/arm/ckp/bt60_v2_defconfig | 38 +++++ app/boards/arm/ckp/bt65_v1.dts | 71 +++++++++ app/boards/arm/ckp/bt65_v1.keymap | 177 ++++++++++++++++++++++ app/boards/arm/ckp/bt65_v1.yaml | 15 ++ app/boards/arm/ckp/bt65_v1.zmk.yml | 14 ++ app/boards/arm/ckp/bt65_v1_defconfig | 38 +++++ app/boards/arm/ckp/bt75_v1.dts | 61 ++++++++ app/boards/arm/ckp/bt75_v1.keymap | 148 ++++++++++++++++++ app/boards/arm/ckp/bt75_v1.yaml | 15 ++ app/boards/arm/ckp/bt75_v1.zmk.yml | 14 ++ app/boards/arm/ckp/bt75_v1_defconfig | 38 +++++ app/boards/arm/ckp/ckp-pinctrl.dtsi | 31 ++++ app/boards/arm/ckp/ckp.dtsi | 217 +++++++++++++++++++++++++++ 21 files changed, 1216 insertions(+) create mode 100644 app/boards/arm/ckp/Kconfig create mode 100644 app/boards/arm/ckp/Kconfig.board create mode 100644 app/boards/arm/ckp/Kconfig.defconfig create mode 100644 app/boards/arm/ckp/board.cmake create mode 100644 app/boards/arm/ckp/bt60_v2.dts create mode 100644 app/boards/arm/ckp/bt60_v2.keymap create mode 100644 app/boards/arm/ckp/bt60_v2.yaml create mode 100644 app/boards/arm/ckp/bt60_v2.zmk.yml create mode 100644 app/boards/arm/ckp/bt60_v2_defconfig create mode 100644 app/boards/arm/ckp/bt65_v1.dts create mode 100644 app/boards/arm/ckp/bt65_v1.keymap create mode 100644 app/boards/arm/ckp/bt65_v1.yaml create mode 100644 app/boards/arm/ckp/bt65_v1.zmk.yml create mode 100644 app/boards/arm/ckp/bt65_v1_defconfig create mode 100644 app/boards/arm/ckp/bt75_v1.dts create mode 100644 app/boards/arm/ckp/bt75_v1.keymap create mode 100644 app/boards/arm/ckp/bt75_v1.yaml create mode 100644 app/boards/arm/ckp/bt75_v1.zmk.yml create mode 100644 app/boards/arm/ckp/bt75_v1_defconfig create mode 100644 app/boards/arm/ckp/ckp-pinctrl.dtsi create mode 100644 app/boards/arm/ckp/ckp.dtsi diff --git a/app/boards/arm/ckp/Kconfig b/app/boards/arm/ckp/Kconfig new file mode 100644 index 00000000..7baf1486 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/arm/ckp/Kconfig.board b/app/boards/arm/ckp/Kconfig.board new file mode 100644 index 00000000..a98a3167 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig.board @@ -0,0 +1,16 @@ +# CKP boards configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BT60_V2 + bool "bt60_v2" + depends on SOC_NRF52840_QIAA + +config BOARD_BT65_V1 + bool "bt65_v1" + depends on SOC_NRF52840_QIAA + +config BOARD_BT75_V1 + bool "bt75_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/ckp/Kconfig.defconfig b/app/boards/arm/ckp/Kconfig.defconfig new file mode 100644 index 00000000..d5bf4ded --- /dev/null +++ b/app/boards/arm/ckp/Kconfig.defconfig @@ -0,0 +1,34 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD + default "bt60_v2" if BOARD_BT60_V2 + default "bt65_v1" if BOARD_BT65_V1 + default "bt75_v1" if BOARD_BT75_V1 +config ZMK_KEYBOARD_NAME + default "BT60 V2" if BOARD_BT60_V2 + default "BT65" if BOARD_BT65_V1 + default "BT75" if BOARD_BT75_V1 + +if BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +endif # BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/arm/ckp/board.cmake b/app/boards/arm/ckp/board.cmake new file mode 100644 index 00000000..b7feee2e --- /dev/null +++ b/app/boards/arm/ckp/board.cmake @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/ckp/bt60_v2.dts b/app/boards/arm/ckp/bt60_v2.dts new file mode 100644 index 00000000..19f92287 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.dts @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT60_V2"; + compatible = "polarityworks,bt60_v2"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) + >; + }; + + hhkb_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,11) RC(5,12) RC(5,13) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt60_v2.keymap b/app/boards/arm/ckp/bt60_v2.keymap new file mode 100644 index 00000000..eeb5c96e --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.keymap @@ -0,0 +1,177 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U +//#define HHKB + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | END | PGDN | BL_TOG | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | RESET | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | + // | SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | | + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP|RGB_TOG| BOOT | + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| B | N | M | , | END | PGDN | BL_TOG | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | RESET |BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &rgb_ug RGB_TOG &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHFT |NONE| Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | + // | CTL | WIN | ALT | SPACE | RALT| CTRL | LEFT | DOWN | RIGHT | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BKSP | DEL | + // | TAB | Q | W | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG | + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHFT |NONE|VOLDN|VOLUP|MUTE|BLINC|BLDEC| N | M | , | END | PGDN | SHFT|BL_TOG| 1 | + // | BT_PRV| BT_NXT| ALT | SPACE | RALT| CTRL | LEFT |RESET| BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &none &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &trans &bl BL_TOG &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | END | PGDN | BL_TOG | + // | BT_PRV | BT_NXT | ALT | SPACE | RESET | 1 | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &sys_reset &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt60_v2.yaml b/app/boards/arm/ckp/bt60_v2.yaml new file mode 100644 index 00000000..2a3f3b47 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.yaml @@ -0,0 +1,15 @@ +identifier: bt60_v2 +name: BT60 V2 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt60_v2.zmk.yml b/app/boards/arm/ckp/bt60_v2.zmk.yml new file mode 100644 index 00000000..faf64205 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt60_v2 +name: BT60 V2 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt60_v2_defconfig b/app/boards/arm/ckp/bt60_v2_defconfig new file mode 100644 index 00000000..f6dc7e09 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT60_V2=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/bt65_v1.dts b/app/boards/arm/ckp/bt65_v1.dts new file mode 100644 index 00000000..97d80da2 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.dts @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT65_V1"; + compatible = "polarityworks,bt65_v1"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + hhkb_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,11) RC(5,12) RC(5,13) RC(5,15) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt65_v1.keymap b/app/boards/arm/ckp/bt65_v1.keymap new file mode 100644 index 00000000..27411a71 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.keymap @@ -0,0 +1,177 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U +//#define HHKB + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65_v1.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | HOME | END | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &kp HOME &kp END + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| + // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' |RESET| BOOT | P_BRK| + // |SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| B | N | M | , | . | / | SHIFT | HOME | END | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &kp HOME &kp END + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------------- + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------- + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &none &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp LALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BL_TOG|RGB_TOG|HOME| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // |SHIFT| NONE|VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / |SHIFT| NONE| UP | INS | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL| LEFT| DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &none &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans &kp INS + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | HOME| + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | END | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | PGUP| + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | PGDN| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp END + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp PG_UP + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp PG_DN + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | UP | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | INS | + // | BT_PRV | BT_NXT | ALT | SPACE | ALT | 1 | CTRL |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &kp INS + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65_v1.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt65_v1.yaml b/app/boards/arm/ckp/bt65_v1.yaml new file mode 100644 index 00000000..61edacce --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.yaml @@ -0,0 +1,15 @@ +identifier: bt65_v1 +name: BT65_V1 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt65_v1.zmk.yml b/app/boards/arm/ckp/bt65_v1.zmk.yml new file mode 100644 index 00000000..f82253b0 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt65_v1 +name: BT65 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt65_v1_defconfig b/app/boards/arm/ckp/bt65_v1_defconfig new file mode 100644 index 00000000..e40ae2db --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT65_V1=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/bt75_v1.dts b/app/boards/arm/ckp/bt75_v1.dts new file mode 100644 index 00000000..42aaf351 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.dts @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT75_V1"; + compatible = "polarityworks,bt75_v1"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt75_v1.keymap b/app/boards/arm/ckp/bt75_v1.keymap new file mode 100644 index 00000000..5c95387a --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.keymap @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #else + #error "Layout not defined, please define a layout using by uncommenting the appropriate line in bt75_v1.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | P_BRK| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | PG_UP| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | UP | PG_DN| + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PAUSE_BREAK + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &trans + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| + // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | | P_BRK| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' |RESET| BOOT | PG_UP| + // |SHIFT | \ |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | UP | PG_DN| + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &kp PAUSE_BREAK + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans + &trans &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------- + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp PAUSE_BREAK &kp INS + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &none &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp LALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BL_TOG|RGB_TOG|HOME| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | END | + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | PGUP | + // |SHIFT| NONE|VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / |SHIFT| NONE| UP | PGDN | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL| LEFT| DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bl BL_TOG &rgb_ug RGB_TOG &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &trans + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &trans + &trans &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt75.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt75_v1.yaml b/app/boards/arm/ckp/bt75_v1.yaml new file mode 100644 index 00000000..e4faa09f --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.yaml @@ -0,0 +1,15 @@ +identifier: bt75_v1 +name: BT75_V1 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt75_v1.zmk.yml b/app/boards/arm/ckp/bt75_v1.zmk.yml new file mode 100644 index 00000000..76e30047 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt75_v1 +name: BT75_V1 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt75_v1_defconfig b/app/boards/arm/ckp/bt75_v1_defconfig new file mode 100644 index 00000000..510d6994 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT75_V1=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/ckp-pinctrl.dtsi b/app/boards/arm/ckp/ckp-pinctrl.dtsi new file mode 100644 index 00000000..87a8edc5 --- /dev/null +++ b/app/boards/arm/ckp/ckp-pinctrl.dtsi @@ -0,0 +1,31 @@ + +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + pwm0_default: pwm0_default { + group1 { + psels = ; + }; + }; + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/ckp/ckp.dtsi b/app/boards/arm/ckp/ckp.dtsi new file mode 100644 index 00000000..6c52d620 --- /dev/null +++ b/app/boards/arm/ckp/ckp.dtsi @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include + +#include +#include + +#include "ckp-pinctrl.dtsi" + +/ { + model = "CKP"; + compatible = "polarityworks,ckp"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,underglow = &led_strip; + zmk,backlight = &backlight; + zmk,battery = &vbatt; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1>; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio1 6 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + }; + + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "ENCODER_ONE"; + a-gpios = <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "ENCODER_TWO"; + a-gpios = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + encoder_3: encoder_3 { + compatible = "alps,ec11"; + label = "encoder_3"; + a-gpios = <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + backlight: pwmleds { + compatible = "pwm-leds"; + label = "Backlight LEDs"; + pwm_led_0 { + pwms = <&pwm0 0 10000 PWM_POLARITY_NORMAL>; + }; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "VBATT"; + io-channels = <&adc 2>; + output-ohms = <100000>; + full-ohms = <(100000 + 100000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <12>; /* number of LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; From 9bd171ede44c6178068d1b3970474783fddc799f Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Mon, 24 Apr 2023 12:16:09 -0500 Subject: [PATCH 078/134] fix(docs): Add key to interconnect tabs Added a key property to interconnect tabs list items to fix a React warning. --- docs/src/components/interconnect-tabs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/components/interconnect-tabs.tsx b/docs/src/components/interconnect-tabs.tsx index c7912793..3ef69ebf 100644 --- a/docs/src/components/interconnect-tabs.tsx +++ b/docs/src/components/interconnect-tabs.tsx @@ -15,7 +15,7 @@ function mapInterconnect(interconnect: Interconnect) { let imageUrl = require(`@site/docs/assets/interconnects/${interconnect.id}/pinout.png`); return ( - + From a6787b08c762c8bbb5966464e944a09b50595774 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Apr 2023 20:21:40 +0000 Subject: [PATCH 079/134] refactor(underglow): Tad more logging. --- app/src/rgb_underglow.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 048b58b4..7b649174 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -190,7 +190,10 @@ static void zmk_rgb_underglow_tick(struct k_work *work) { break; } - led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + int err = led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + if (err < 0) { + LOG_ERR("Failed to update the RGB strip (%d)", err); + } } K_WORK_DEFINE(underglow_work, zmk_rgb_underglow_tick); From ab65ffc11406cd693172d48d790ec5a43a9fc040 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 4 Nov 2022 15:50:41 -0700 Subject: [PATCH 080/134] refactor(boards): Fix Zen v2 DTS spacing inconsistencies --- app/boards/arm/corneish_zen/CMakeLists.txt | 4 +- app/boards/arm/corneish_zen/corneish_zen.dtsi | 5 +- .../arm/corneish_zen/corneish_zen.keymap | 71 ++++++++++--------- .../arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- .../corneish_zen/corneish_zen_v2_right.dts | 13 ++-- 5 files changed, 47 insertions(+), 48 deletions(-) diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt index 09820577..aedf38a7 100644 --- a/app/boards/arm/corneish_zen/CMakeLists.txt +++ b/app/boards/arm/corneish_zen/CMakeLists.txt @@ -4,7 +4,7 @@ if(CONFIG_ZMK_DISPLAY) target_sources_ifdef(CONFIG_CUSTOM_WIDGET_LAYER_STATUS app PRIVATE widgets/layer_status.c) target_sources_ifdef(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS app PRIVATE widgets/peripheral_status.c) - add_subdirectory_ifdef(CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM widgets/icons) + add_subdirectory_ifdef(CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM widgets/icons) endif() zephyr_library() @@ -57,4 +57,4 @@ zephyr_library_include_directories(${ZEPHYR_BASE}/lib/gui/lvgl/) zephyr_library_sources_ifdef(CONFIG_ZMK_DISPLAY custom_status_screen.c) zephyr_library_sources(${ZEPHYR_BASE}/misc/empty_file.c) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) -zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index 10be54cc..fe2bfa92 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -50,7 +50,7 @@ // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) @@ -60,7 +60,6 @@ }; - &adc { status = "okay"; }; @@ -123,4 +122,4 @@ reg = <0x000f4000 0x0000c000>; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap index 2b9eeb14..24c925e8 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.keymap +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -10,58 +10,59 @@ #include / { - chosen { - zmk,matrix_transform = &default_transform; - //zmk,matrix_transform = &five_column_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + // zmk,matrix_transform = &five_column_transform; + }; }; / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "QWERTY"; -// ----------------------------------------------------------------------------------------- + default_layer { + label = "QWERTY"; +// -------------------------------------------------------------------------------- // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | GUI | LWR | SPC | | ENT | RSE | ALT | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC - &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT - >; - }; - lower_layer { - label = "NUMBER"; + bindings = < +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC +&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; + + lower_layer { + label = "NUMBER"; // ----------------------------------------------------------------------------------------- // | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | SHFT | | | | | | | | | | | | | // | GUI | | SPC | | ENT | | ALT | - bindings = < - &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans - &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT - >; - }; + bindings = < +&kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans +&kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; - raise_layer { - label = "SYMBOL"; + raise_layer { + label = "SYMBOL"; // ----------------------------------------------------------------------------------------- // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | GUI | | SPC | | ENT | | ALT | - bindings = < - &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC - &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE - &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT - >; - }; + bindings = < +&kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC +&kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE +&kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; }; -}; \ No newline at end of file + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 9f3dd73a..d7b66ab7 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -72,7 +72,7 @@ }; }; -&spi0 { +&spi0 { status = "okay"; compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 3cb7556f..4d444cae 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -33,16 +33,15 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> ; - }; leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; + }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; @@ -56,6 +55,7 @@ &default_transform { col-offset = <6>; }; + &five_column_transform { col-offset = <6>; }; @@ -98,7 +98,6 @@ busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; pwr = [03 00 26 26]; - //softstart = [17 17 17 17]; cdi = <0xd2>; tcon = <0x22>; }; From 2c70048beeec6da864836f4981a6a8f954be95af Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 6 Nov 2022 14:19:27 -0800 Subject: [PATCH 081/134] refactor(boards): Remove duplicated Zen v2 Kconfigs and unused font size --- app/boards/arm/corneish_zen/Kconfig.defconfig | 1 - app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig | 4 ---- app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig | 4 ---- 3 files changed, 9 deletions(-) diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index a161230c..28177f53 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -44,7 +44,6 @@ endif # USB config ZMK_DISPLAY select LV_USE_CONT select LV_FONT_MONTSERRAT_26 - select LV_FONT_MONTSERRAT_20 select LV_FONT_MONTSERRAT_16 select LV_USE_LABEL select LV_USE_IMG diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 305ce72e..3b7b4d9e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -6,7 +6,6 @@ CONFIG_SOC_SERIES_NRF52X=y CONFIG_SOC_NRF52840_QIAA=y CONFIG_BOARD_CORNEISH_ZEN_V2_LEFT=y -CONFIG_ZMK_SPLIT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -20,7 +19,6 @@ CONFIG_PINCTRL=y CONFIG_GPIO=y # Enable SPI -CONFIG_SPI=y CONFIG_SPI_NRFX=y # Enable writing to flash @@ -40,8 +38,6 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 -CONFIG_SSD1306=n -CONFIG_IL0323=y CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 0fd0fd6c..b361b08d 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -6,7 +6,6 @@ CONFIG_SOC_SERIES_NRF52X=y CONFIG_SOC_NRF52840_QIAA=y CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT=y -CONFIG_ZMK_SPLIT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -20,7 +19,6 @@ CONFIG_PINCTRL=y CONFIG_GPIO=y # Enable SPI -CONFIG_SPI=y CONFIG_SPI_NRFX=y # Enable writing to flash @@ -40,8 +38,6 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 -CONFIG_SSD1306=n -CONFIG_IL0323=y CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 From 4a9c59317f33a1c29bce2f2d34eb3e653e43eb10 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 13 Nov 2022 21:47:13 -0800 Subject: [PATCH 082/134] refactor(boards): Add back default matrix transform to Zen v2 chosen node --- app/boards/arm/corneish_zen/corneish_zen.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index fe2bfa92..daf58b31 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -22,6 +22,7 @@ zmk,display = &epd; zmk,battery = &vbatt; zephyr,console = &cdc_acm_uart; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { From 39d7f86f7019b861fc6e84084a8ffd88ff63b064 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 16 Dec 2022 17:48:39 -0800 Subject: [PATCH 083/134] refactor(boards): Make Zen dtsi non-v2 specific --- app/boards/arm/corneish_zen/corneish_zen.dtsi | 5 ++--- app/boards/arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index daf58b31..289c5e73 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -11,8 +11,8 @@ #include / { - model = "corneish_zen_v2"; - compatible = "corneish_zen_v2"; + model = "Corne-ish Zen"; + compatible = "corneish_zen"; chosen { zephyr,code-partition = &code_partition; @@ -20,7 +20,6 @@ zephyr,flash = &flash0; zmk,kscan = &kscan0; zmk,display = &epd; - zmk,battery = &vbatt; zephyr,console = &cdc_acm_uart; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index d7b66ab7..14d82e87 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -20,7 +20,7 @@ diode-direction = "col2row"; row-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; From 0239f18b6180bc604b432f3b48a0d29961dc0111 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 16 Dec 2022 17:39:24 -0800 Subject: [PATCH 084/134] feat(boards): Add Corne-ish Zen v1 --- app/boards/arm/corneish_zen/CMakeLists.txt | 2 +- app/boards/arm/corneish_zen/Kconfig | 10 ++ app/boards/arm/corneish_zen/Kconfig.board | 14 +- app/boards/arm/corneish_zen/Kconfig.defconfig | 15 +- .../arm/corneish_zen/corneish_zen_v1.zmk.yml | 15 ++ .../arm/corneish_zen/corneish_zen_v1_left.dts | 123 ++++++++++++++++ .../corneish_zen_v1_left_defconfig | 76 ++++++++++ .../corneish_zen/corneish_zen_v1_right.dts | 131 ++++++++++++++++++ .../corneish_zen_v1_right_defconfig | 75 ++++++++++ 9 files changed, 455 insertions(+), 6 deletions(-) create mode 100644 app/boards/arm/corneish_zen/Kconfig create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_left.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_right.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt index aedf38a7..afaaf6bf 100644 --- a/app/boards/arm/corneish_zen/CMakeLists.txt +++ b/app/boards/arm/corneish_zen/CMakeLists.txt @@ -47,7 +47,7 @@ if(CONFIG_ZMK_DISPLAY) zephyr_library_sources(widgets/icons/layers.c) zephyr_library_sources(widgets/icons/layers2.c) endif() - if(CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT) + if(NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL) zephyr_library_sources(widgets/icons/zenlogo.c) endif() endif() diff --git a/app/boards/arm/corneish_zen/Kconfig b/app/boards/arm/corneish_zen/Kconfig new file mode 100644 index 00000000..33d92609 --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig @@ -0,0 +1,10 @@ +# +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_LEFT + bool + +config BOARD_CORNEISH_ZEN_RIGHT + bool diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board index ca82e330..ffb3ab1f 100644 --- a/app/boards/arm/corneish_zen/Kconfig.board +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -3,10 +3,22 @@ # SPDX-License-Identifier: MIT # +config BOARD_CORNEISH_ZEN_V1_LEFT + bool "corneish zen left v1" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_LEFT + +config BOARD_CORNEISH_ZEN_V1_RIGHT + bool "corneish zen right v1" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_RIGHT + config BOARD_CORNEISH_ZEN_V2_LEFT bool "corneish zen left v2" depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_LEFT config BOARD_CORNEISH_ZEN_V2_RIGHT bool "corneish zen right v2" - depends on SOC_NRF52840_QIAA \ No newline at end of file + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_RIGHT diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index 28177f53..feab3eca 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT # -if BOARD_CORNEISH_ZEN_V2_LEFT +if BOARD_CORNEISH_ZEN_LEFT config ZMK_KEYBOARD_NAME default "Corne-ish Zen" @@ -11,10 +11,10 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y -endif # BOARD_CORNEISH_ZEN_V2_LEFT +endif # BOARD_CORNEISH_ZEN_LEFT -if BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT +if BOARD_CORNEISH_ZEN_LEFT || BOARD_CORNEISH_ZEN_RIGHT config BOARD default "corneish_zen" @@ -77,4 +77,11 @@ menuconfig CUSTOM_WIDGET_LAYER_STATUS menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS bool "custom peripheral status widget" -endif # BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT +endif # BOARD_CORNEISH_ZEN_LEFT || BOARD_CORNEISH_ZEN_RIGHT + +if BOARD_CORNEISH_ZEN_V1_LEFT || BOARD_CORNEISH_ZEN_V1_RIGHT + +config BQ274XX + default y + +endif # BOARD_CORNEISH_ZEN_V1_LEFT || BOARD_CORNEISH_ZEN_V1_RIGHT diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml new file mode 100644 index 00000000..1f6be20d --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: corneish_zen_v1 +name: Corneish Zen v1 +url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen +type: board +arch: arm +features: + - keys + - display +outputs: + - usb + - ble +siblings: + - corneish_zen_v1_left + - corneish_zen_v1_right diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts new file mode 100644 index 00000000..399a564f --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts @@ -0,0 +1,123 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &fuelgauge; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + ; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; +}; + +&pinctrl { + spi2_default: spi2_default { + group1 { + psels = , + , + ; + }; + }; + + spi2_sleep: spi2_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; + +&i2c0 { + status = "okay"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + clock-frequency = <100000>; + + fuelgauge: bq274xx@55 { + compatible = "ti,bq274xx"; + label = "BATTERY"; + reg = <0x55>; + design-voltage = <3700>; //Battery Design Volatge in mV + design-capacity = <180>; //Battery Design Capacity in mAh + taper-current = <2>; //Battery Taper current in mAh + terminate-voltage = <2750>; //Battery Terminate Voltage in mV + int-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>; + }; +}; + +&spi2 { + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi2_default>; + pinctrl-1 = <&spi2_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig new file mode 100644 index 00000000..a71ac680 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig @@ -0,0 +1,76 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V1_LEFT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable pinctrl +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable I2C +CONFIG_I2C=y +CONFIG_I2C_NRFX=y + +# Enable SPI +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS=y +CONFIG_ZMK_WIDGET_OUTPUT_STATUS=n +CONFIG_CUSTOM_WIDGET_LAYER_STATUS=y +CONFIG_ZMK_WIDGET_LAYER_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=65536 +#CONFIG_LOG_STRDUP_BUF_COUNT=160 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts new file mode 100644 index 00000000..d5f6e588 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts @@ -0,0 +1,131 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &fuelgauge; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + ; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; +}; + +&default_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + +&pinctrl { + spi2_default: spi2_default { + group1 { + psels = , + , + ; + }; + }; + + spi2_sleep: spi2_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; + +&i2c0 { + status = "okay"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + clock-frequency = <100000>; + + fuelgauge: bq274xx@55 { + compatible = "ti,bq274xx"; + label = "BATTERY"; + reg = <0x55>; + design-voltage = <3700>; //Battery Design Volatge in mV + design-capacity = <180>; //Battery Design Capacity in mAh + taper-current = <2>; //Battery Taper current in mAh 2.1 + terminate-voltage = <2750>; //Battery Terminate Voltage in mV + int-gpios = <&gpio1 5 GPIO_ACTIVE_LOW>; + }; +}; + +&spi2 { + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi2_default>; + pinctrl-1 = <&spi2_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig new file mode 100644 index 00000000..f099392f --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig @@ -0,0 +1,75 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V1_RIGHT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable pinctrl +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable I2C +CONFIG_I2C=y +CONFIG_I2C_NRFX=y + +# Enable SPI +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS=y +CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS=8000 +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=20000 +#CONFIG_LOG_STRDUP_BUF_COUNT=60 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y From 94789a092c6d8ddf5ab5ad88eb011a4ece6b5cee Mon Sep 17 00:00:00 2001 From: Alexander Krikun Date: Wed, 3 May 2023 23:16:33 +0400 Subject: [PATCH 085/134] fix(boards): unify board I2C configuration, use TWI driver --- app/boards/arm/bluemicro840/bluemicro840_v1.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_11.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_13.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index f1952601..05849001 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -63,7 +63,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -71,6 +71,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 68331edc..14b9adb9 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -48,7 +48,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -56,6 +56,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index 9977617c..874b67e2 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -48,7 +48,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -56,6 +56,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index 300838ff..65674132 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -61,7 +61,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -69,6 +69,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 86bcb5e5..cfe77e37 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -61,7 +61,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -69,6 +69,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; From 48be2eedd09d4918d25d8bcb8bcb58e51eff6060 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Wed, 10 May 2023 12:21:24 +0800 Subject: [PATCH 086/134] fix(docs): Update QMK debounce references --- docs/docs/features/debouncing.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/docs/features/debouncing.md b/docs/docs/features/debouncing.md index 9629131d..40170739 100644 --- a/docs/docs/features/debouncing.md +++ b/docs/docs/features/debouncing.md @@ -99,8 +99,6 @@ one millisecond of latency but protects against short noise spikes. ZMK's default debouncing is similar to QMK's `sym_defer_pk` algorithm. -Setting `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=0` for eager debouncing would be similar -to QMK's (unimplemented as of this writing) `asym_eager_defer_pk`. +Setting `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=0` for eager debouncing would be similar to QMK's `asym_eager_defer_pk`. -See [QMK's Debounce API documentation](https://beta.docs.qmk.fm/using-qmk/software-features/feature_debounce_type) -for more information. +See [QMK's Debounce API documentation](https://docs.qmk.fm/#/feature_debounce_type) for more information. From d53cd1992936dd5604b84cd4c02cfdfad4d9944a Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:47:42 -0500 Subject: [PATCH 087/134] refactor: Add format on save for VS Code Added settings to format various file types on save in VS Code. Added some recommended VS Code extensions: - Prettier for formatting various file types - Python for formatting Python files - C/C++ for formatting C files - Devicetree for syntax highlighting - CMake for syntax highlighting --- .vscode/extensions.json | 9 +++++++++ .vscode/settings.json | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..0819f71e --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "ms-python.python", + "ms-vscode.cpptools", + "plorefice.devicetree", + "twxs.cmake" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index aea29cf0..8bbff533 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,21 @@ "*.overlay": "dts", "*.keymap": "dts" }, - "python.formatting.provider": "black" + "python.formatting.provider": "black", + "[c]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "ms-vscode.cpptools" + }, + "[javascript][javascriptreact][typescript][typescriptreact]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[python]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "ms-python.python" + }, + "[css][json][jsonc][html][markdown][yaml]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } From a1e0607a22deb72ce4ac64e442f0baa721e32b0b Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 12:20:40 -0500 Subject: [PATCH 088/134] fix: Don't specify default C formatter Microsoft's C/C++ extension performs poorly on some systems, so this gives the option to use any other extension that supports formatting with clang-format. --- .vscode/settings.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 8bbff533..924d83b1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,8 +5,7 @@ }, "python.formatting.provider": "black", "[c]": { - "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-vscode.cpptools" + "editor.formatOnSave": true }, "[javascript][javascriptreact][typescript][typescriptreact]": { "editor.formatOnSave": true, From b1ca9199de02dcb45d055a71807ff3894290fda7 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Wed, 17 May 2023 12:42:57 +0800 Subject: [PATCH 089/134] fix(ci): Refactor prepare variable step * Refactor workflow variables * Use quotes to avoid word splitting --- .github/workflows/build-user-config.yml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index b1e0602d..5891ddc1 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -39,8 +39,8 @@ jobs: - name: Fetch Build Matrix run: | - echo "build_matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .)" >> $GITHUB_ENV - yaml2json ${{ inputs.build_matrix_path }} | jq + echo "build_matrix=$(yaml2json '${{ inputs.build_matrix_path }}' | jq -c .)" >> $GITHUB_ENV + yaml2json "${{ inputs.build_matrix_path }}" | jq build: runs-on: ubuntu-latest @@ -54,18 +54,13 @@ jobs: steps: - name: Prepare variables shell: sh -x {0} + env: + shield: ${{ matrix.shield }} run: | - if [ -n "${{ matrix.shield }}" ] - then - echo "extra_cmake_args=-DSHIELD=\"${{ matrix.shield }}\"" >> $GITHUB_ENV - echo "artifact_name=${{ matrix.shield }}-${{ matrix.board }}-zmk" >> $GITHUB_ENV - echo "display_name=${{ matrix.shield }} - ${{ matrix.board }}" >> $GITHUB_ENV - else - echo "extra_cmake_args=" >> $GITHUB_ENV - echo "artifact_name=${{ matrix.board }}-zmk" >> $GITHUB_ENV - echo "display_name=${{ matrix.board }}" >> $GITHUB_ENV - fi echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV + echo "extra_cmake_args=${shield:+-DSHIELD=\"$shield\"}" >> $GITHUB_ENV + echo "display_name=${shield:+$shield - }${{ matrix.board }}" >> $GITHUB_ENV + echo "artifact_name=${shield:+$shield-}${{ matrix.board }}-zmk" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v3 @@ -89,7 +84,7 @@ jobs: ${{ runner.os }}- - name: West Init - run: west init -l ${{ inputs.config_path }} + run: west init -l "${{ inputs.config_path }}" - name: West Update run: west update @@ -99,7 +94,7 @@ jobs: - name: West Build (${{ env.display_name }}) shell: sh -x {0} - run: west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} + run: west build -s zmk/app -b "${{ matrix.board }}" -- -DZMK_CONFIG="${GITHUB_WORKSPACE}/${{ inputs.config_path }}" ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - name: ${{ env.display_name }} Kconfig file run: grep -v -e "^#" -e "^$" build/zephyr/.config | sort @@ -113,7 +108,7 @@ jobs: cp build/zephyr/zmk.uf2 "build/artifacts/${{ env.artifact_name }}.uf2" elif [ -f build/zephyr/zmk.${{ inputs.fallback_binary }} ] then - cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" + cp "build/zephyr/zmk.${{ inputs.fallback_binary }}" "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" fi - name: Archive (${{ env.display_name }}) From 89d71ed2c2c1af78c166a96dc65658e4f39743ab Mon Sep 17 00:00:00 2001 From: digger vermont Date: Thu, 18 May 2023 19:47:36 -0400 Subject: [PATCH 090/134] feat(boards): Add KBDfans Tofu65 2.0 board * Initial commit of Tofu65 2.0 board --------- Co-authored-by: Pete Johanson --- app/boards/arm/kbdfans_tofu65/Kconfig.board | 6 + .../arm/kbdfans_tofu65/Kconfig.defconfig | 15 +++ .../arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts | 125 ++++++++++++++++++ .../kbdfans_tofu65/kbdfans_tofu65_v2.keymap | 97 ++++++++++++++ .../arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml | 15 +++ .../kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml | 10 ++ .../kbdfans_tofu65_v2_defconfig | 20 +++ 7 files changed, 288 insertions(+) create mode 100644 app/boards/arm/kbdfans_tofu65/Kconfig.board create mode 100644 app/boards/arm/kbdfans_tofu65/Kconfig.defconfig create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.board b/app/boards/arm/kbdfans_tofu65/Kconfig.board new file mode 100644 index 00000000..954166b7 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_KBDFANS_TOFU65_V2 + bool "KBDfans Tofu65 2.0" + depends on SOC_RP2040 diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig new file mode 100644 index 00000000..993d5142 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig @@ -0,0 +1,15 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_KBDFANS_TOFU65_V2 + +config ZMK_KEYBOARD_NAME + default "kbdfans tofu65" + +config RP2_FLASH_W25Q080 + default y + +config ZMK_USB + default y + +endif # BOARD_KBDFANS_TOFU65_V2 diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts new file mode 100644 index 00000000..261ffbf4 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; + +#include +#include + +/ { + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zephyr,shell-uart = &cdc_acm_uart; + zephyr,code-partition = &code_partition; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + xtal_clk: xtal-clk { + compatible = "fixed-clock"; + clock-frequency = <12000000>; + #clock-cells = <0>; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + +// ------- Switch Matrix ---------- +// +// Column 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | +// ========================================================================================== +// Row 0 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | S13 | S14 | +// Row 1 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | S13 | S14 | +// Row 2 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | | S13 | +// Row 3 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | | S12 | S13 | +// Row 4 || S0 | S1 | S2 | | | | S3 | | S4 | S5 | S6 | | S7 | S8 | S9 | +// ----------------------------------------------------------------------------------- +// + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,14) +RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,8) RC(4,9) RC(4,10) RC(4,12) RC(4,13) RC(4,14) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 29 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 28 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 27 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio0 25 GPIO_ACTIVE_HIGH> + , <&gpio0 24 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 1 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 20 GPIO_ACTIVE_HIGH> + , <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 18 GPIO_ACTIVE_HIGH> + , <&gpio0 17 GPIO_ACTIVE_HIGH> + , <&gpio0 16 GPIO_ACTIVE_HIGH> + , <&gpio0 15 GPIO_ACTIVE_HIGH> + , <&gpio0 14 GPIO_ACTIVE_HIGH> + , <&gpio0 13 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(16)>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserved memory for the second stage bootloader */ + second_stage_bootloader: partition@0 { + label = "second_stage_bootloader"; + reg = <0x00000000 0x100>; + read-only; + }; + + /* + * Usable flash. Starts at 0x100, after the bootloader. The partition + * size is 16MB minus the 0x100 bytes taken by the bootloader. + */ + code_partition: partition@100 { + label = "code"; + reg = <0x100 (DT_SIZE_M(16) - 0x100)>; + read-only; + }; + }; +}; + + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + }; +}; + + +&gpio0 { + status = "okay"; +}; + diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap new file mode 100644 index 00000000..7eca7919 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap @@ -0,0 +1,97 @@ +// Copyright (c) 2023 The ZMK Contributors +// SPDX-License-Identifier: MIT + +#include +#include + +#define BASE 0 +#define FUNC 1 + +// +// ---------- Tofu65 2.0 key switch positions ---------- +// +// ------------------------------------------------------------------------------------------------- +// | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | +// ------------------------------------------------------------------------------------------------- +// | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 24 | 26 | 27 | 28 | 29 | +// ------------------------------------------------------------------------------------------------- +// | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | +// ------------------------------------------------------------------------------------------------- +// | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | +// ------------------------------------------------------------------------------------------------- +// | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | +// ------------------------------------------------------------------------------------------------- +// + + +/ { + combos { + compatible = "zmk,combos"; + + // BACKSPACE + LCTRL + LALT = &sys_reset + combo_bootloader { + timeout-ms = <100>; + key-positions = <13 58 60>; + bindings = <&sys_reset>; + }; + + // RETURN + LCTRL + LALT = &bootloader + combo_sys_reset { + timeout-ms = <100>; + key-positions = <42 58 60>; + bindings = <&bootloader>; + }; + }; + + + keymap { + compatible = "zmk,keymap"; + + base { + +// --------- Default QWERTY Layout --------- +// Layer 0 BASE +// ------------------------------------------------------------------------------------------------- +// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | HME | +// ------------------------------------------------------------------------------------------------- +// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | PGU | +// ------------------------------------------------------------------------------------------------- +// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGD | +// ------------------------------------------------------------------------------------------------- +// | LSHIFT | Z | X | C | V | B | N | M | , | . | / | RSHFT | ↑ | END | +// ------------------------------------------------------------------------------------------------- +// | LCTL | LGUI | LALT | SPACE | RALT | RGUI | RCTL | <- | ↓ | -> | +// ------------------------------------------------------------------------------------------------- + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp HOME +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp PG_UP +&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER &kp PG_DN +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp END +&kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT < FUNC K_APP &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + }; + + func { +// --------- Default QWERTY Layout --------- +// Layer 1 FUNC +// --------------------------------------------------------------------------------------------------- +// | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | HME | +// --------------------------------------------------------------------------------------------------- +// | --- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | scroll lock | pause | --- | PGU | +// --------------------------------------------------------------------------------------------------- +// | CAPS | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --- | PGD | +// --------------------------------------------------------------------------------------------------- +// | LSHIFT | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | ----- | VOL UP | MUTE | +// --------------------------------------------------------------------------------------------------- +// | ---- | ---- | ---- | ---- | -- | MO 1 | -- | PREV | VOL DN | NEXT | +// --------------------------------------------------------------------------------------------------- + bindings = < +&kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp SLCK &kp PAUSE_BREAK &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_UP &kp C_MUTE +&trans &trans &trans &trans &trans &trans &trans &kp C_PREV &kp C_VOL_DN &kp C_NEXT + >; + }; + }; +}; diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml new file mode 100644 index 00000000..e1089766 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml @@ -0,0 +1,15 @@ +identifier: kbdfans_tofu65_v2 +name: KBDfans Tofu65 2.0 +type: mcu +arch: arm +flash: 16384 +ram: 264 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - gpio + - usb_device + - hwinfo + - pwm diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml new file mode 100644 index 00000000..382e7dd3 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: kbdfans_tofu65_v2 +name: KBDfans Tofu65 2.0 +type: board +arch: arm +features: + - keys +outputs: + - usb +url: https://kbdfans.com/collections/tofu65-2-0/products/tofu65-2-0 diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig new file mode 100644 index 00000000..cf546683 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig @@ -0,0 +1,20 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_RP2XXX=y +CONFIG_SOC_RP2040=y +CONFIG_BOARD_KBDFANS_TOFU65_V2=y + +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 + +# Enable USB CDC ACM logging for debugging +# CONFIG_ZMK_USB_LOGGING=y + +# Enable reset by default +CONFIG_RESET=y + +# Code partition needed to target the correct flash range +CONFIG_USE_DT_CODE_PARTITION=y + +# Output UF2 by default, native bootloader supports it. +CONFIG_BUILD_OUTPUT_UF2=y From d799560985b40a7f9526cfdedd88546b60cf3182 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:10:58 -0500 Subject: [PATCH 091/134] chore: Update typescript, eslint, webpack --- docs/package-lock.json | 978 +++++++++++++++++++++-------------------- docs/package.json | 10 +- 2 files changed, 503 insertions(+), 485 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 2c8a7fba..2d1e7a57 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -31,18 +31,18 @@ "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^8.0.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", - "eslint-plugin-react": "^7.30.0", + "eslint-plugin-react": "^7.32.2", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", - "typescript": "^4.6.3", - "webpack": "^5.72.1" + "typescript": "^5.0.4", + "webpack": "^5.80.0" } }, "node_modules/@algolia/autocomplete-core": { @@ -2583,16 +2583,40 @@ "node": ">=16.14" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "devOptional": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2607,9 +2631,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -2633,6 +2657,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "0.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", @@ -2692,14 +2725,14 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "devOptional": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -3706,133 +3739,133 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.5", "@xtuc/long": "4.2.2" } }, @@ -4117,15 +4150,15 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -4144,14 +4177,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4161,6 +4194,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -5991,9 +6037,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6060,9 +6106,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, "node_modules/es-shim-unscopables": { "version": "1.0.0", @@ -6171,13 +6217,16 @@ } }, "node_modules/eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "devOptional": true, "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -6186,17 +6235,16 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -6211,7 +6259,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -6227,9 +6274,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -6675,25 +6722,26 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" @@ -6741,9 +6789,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "devOptional": true, "dependencies": { "esrecurse": "^4.3.0", @@ -6751,42 +6799,21 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "devOptional": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "devOptional": true, - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "devOptional": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/glob-parent": { @@ -6802,9 +6829,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -6829,14 +6856,14 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "devOptional": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6858,9 +6885,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "devOptional": true, "dependencies": { "estraverse": "^5.1.0" @@ -11077,28 +11104,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -11108,27 +11135,27 @@ } }, "node_modules/object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "dependencies": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -12796,18 +12823,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -13572,9 +13587,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dependencies": { "randombytes": "^2.1.0" } @@ -14024,18 +14039,18 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, "funding": { @@ -14311,9 +14326,9 @@ } }, "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -14328,15 +14343,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "engines": { "node": ">= 10.13.0" @@ -14620,15 +14635,15 @@ } }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/ua-parser-js": { @@ -15360,21 +15375,21 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.80.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", + "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -15383,9 +15398,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -15676,11 +15691,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -15721,9 +15731,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -17793,16 +17803,31 @@ "tslib": "^2.4.0" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true + }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "devOptional": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -17811,9 +17836,9 @@ }, "dependencies": { "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "requires": { "type-fest": "^0.20.2" @@ -17827,6 +17852,12 @@ } } }, + "@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "devOptional": true + }, "@fortawesome/fontawesome-common-types": { "version": "0.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", @@ -17870,14 +17901,14 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "devOptional": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, "@humanwhocodes/module-importer": { @@ -18668,133 +18699,133 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.5", "@xtuc/long": "4.2.2" } }, @@ -19015,15 +19046,15 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -19033,17 +19064,30 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -20352,9 +20396,9 @@ } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -20406,9 +20450,9 @@ } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, "es-shim-unscopables": { "version": "1.0.0", @@ -20495,13 +20539,16 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "devOptional": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -20510,17 +20557,16 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -20535,7 +20581,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -20551,9 +20596,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "requires": { "type-fest": "^0.20.2" @@ -20568,9 +20613,9 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "requires": {} }, @@ -20881,25 +20926,26 @@ } }, "eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "dependencies": { "doctrine": { @@ -20931,47 +20977,30 @@ } }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "devOptional": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "devOptional": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "devOptional": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "devOptional": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "devOptional": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "esprima": { @@ -20980,9 +21009,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "devOptional": true, "requires": { "estraverse": "^5.1.0" @@ -23944,46 +23973,46 @@ } }, "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "obuf": { @@ -25136,12 +25165,6 @@ "functions-have-names": "^1.2.2" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "devOptional": true - }, "regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -25709,9 +25732,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "requires": { "randombytes": "^2.1.0" } @@ -26067,18 +26090,18 @@ } }, "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" } }, @@ -26272,9 +26295,9 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -26290,15 +26313,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "dependencies": { "jest-worker": { @@ -26500,9 +26523,9 @@ } }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" }, "ua-parser-js": { "version": "0.7.32", @@ -26996,21 +27019,21 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.80.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", + "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -27019,18 +27042,13 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -27059,9 +27077,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", diff --git a/docs/package.json b/docs/package.json index 70105b54..dd4b3ff7 100644 --- a/docs/package.json +++ b/docs/package.json @@ -50,17 +50,17 @@ "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^8.0.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", - "eslint-plugin-react": "^7.30.0", + "eslint-plugin-react": "^7.32.2", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", - "typescript": "^4.6.3", - "webpack": "^5.72.1" + "typescript": "^5.0.4", + "webpack": "^5.80.0" } } From 4674215551b8c9bb0706e825742ba82b9d46ed3b Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:14:00 -0500 Subject: [PATCH 092/134] chore: Update json-schema-to-typescript --- docs/package-lock.json | 193 ++++++++++++++++++----------------------- docs/package.json | 2 +- 2 files changed, 85 insertions(+), 110 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 2d1e7a57..ba968736 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -35,7 +35,7 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.32.2", - "json-schema-to-typescript": "^10.1.5", + "json-schema-to-typescript": "^12.0.0", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", @@ -202,18 +202,6 @@ "node": ">=6.0.0" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -1984,6 +1972,24 @@ "node": ">=6.9.0" } }, + "node_modules/@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -3487,9 +3493,9 @@ } }, "node_modules/@types/glob": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", - "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "dependencies": { "@types/minimatch": "*", @@ -4609,9 +4615,9 @@ } }, "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, "node_modules/callsites": { @@ -7711,18 +7717,22 @@ } }, "node_modules/glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", "dev": true, "dependencies": { - "@types/glob": "*" + "@types/glob": "^7.1.3" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" }, "peerDependencies": { - "glob": "*" + "glob": "^7.1.6" } }, "node_modules/glob-to-regexp": { @@ -9126,45 +9136,32 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "dev": true, - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/json-schema-to-typescript": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.1.5.tgz", - "integrity": "sha512-X8bNNksfCQo6LhEuqNxmZr4eZpPjXZajmimciuk8eWXzZlif9Brq7WuMGD/SOhBKcRKP2SGVDNZbC28WQqx9Rg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-12.0.0.tgz", + "integrity": "sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", - "@types/lodash": "^4.14.168", - "@types/prettier": "^2.1.5", - "cli-color": "^2.0.0", + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", "get-stdin": "^8.0.0", "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", "mkdirp": "^1.0.4", "mz": "^2.7.0", - "prettier": "^2.2.0" + "prettier": "^2.6.2" }, "bin": { "json2ts": "dist/src/cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" } }, "node_modules/json-schema-traverse": { @@ -9178,12 +9175,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -16152,18 +16143,6 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, - "@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "requires": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -17362,6 +17341,18 @@ "to-fast-properties": "^2.0.0" } }, + "@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -18447,9 +18438,9 @@ } }, "@types/glob": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", - "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -19385,9 +19376,9 @@ } }, "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, "callsites": { @@ -21622,12 +21613,12 @@ } }, "glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", "dev": true, "requires": { - "@types/glob": "*" + "@types/glob": "^7.1.3" } }, "glob-to-regexp": { @@ -22632,36 +22623,26 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "dev": true, - "requires": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - } - }, "json-schema-to-typescript": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.1.5.tgz", - "integrity": "sha512-X8bNNksfCQo6LhEuqNxmZr4eZpPjXZajmimciuk8eWXzZlif9Brq7WuMGD/SOhBKcRKP2SGVDNZbC28WQqx9Rg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-12.0.0.tgz", + "integrity": "sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "@types/lodash": "^4.14.168", - "@types/prettier": "^2.1.5", - "cli-color": "^2.0.0", + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", "get-stdin": "^8.0.0", "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", "mkdirp": "^1.0.4", "mz": "^2.7.0", - "prettier": "^2.2.0" + "prettier": "^2.6.2" } }, "json-schema-traverse": { @@ -22675,12 +22656,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", diff --git a/docs/package.json b/docs/package.json index dd4b3ff7..918fd173 100644 --- a/docs/package.json +++ b/docs/package.json @@ -54,7 +54,7 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.32.2", - "json-schema-to-typescript": "^10.1.5", + "json-schema-to-typescript": "^12.0.0", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", From da2599aa75875a67ea923b93d58b6591e0747a06 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:26:28 -0500 Subject: [PATCH 093/134] chore: Update docusaurus, react types --- docs/package-lock.json | 1536 +++++++++++++++++++++------------------- docs/package.json | 14 +- 2 files changed, 803 insertions(+), 747 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index ba968736..ac8c947e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,8 +8,8 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^2.1.0", - "@docusaurus/preset-classic": "^2.1.0", + "@docusaurus/core": "^2.4.0", + "@docusaurus/preset-classic": "^2.4.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -24,12 +24,12 @@ "web-tree-sitter": "^0.19.4" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.1.0", - "@docusaurus/types": "^2.1.0", - "@tsconfig/docusaurus": "^1.0.5", + "@docusaurus/module-type-aliases": "^2.4.0", + "@docusaurus/types": "^2.4.0", + "@tsconfig/docusaurus": "^1.0.7", "@types/js-yaml": "^4.0.5", - "@types/react": "^17.0.3", - "@types/react-helmet": "^6.1.5", + "@types/react": "^17.0.58", + "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", @@ -46,19 +46,19 @@ } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", - "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", - "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -66,79 +66,79 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", - "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "node_modules/@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "node_modules/@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", "dependencies": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/events": { @@ -147,47 +147,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" }, "node_modules/@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", "dependencies": { - "@algolia/logger-common": "4.14.2" + "@algolia/logger-common": "4.17.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "node_modules/@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "node_modules/@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", "dependencies": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" } }, "node_modules/@ampproject/remapping": { @@ -1904,11 +1904,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -2000,18 +2000,18 @@ } }, "node_modules/@docsearch/css": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", - "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" }, "node_modules/@docsearch/react": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", - "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", "dependencies": { - "@algolia/autocomplete-core": "1.7.2", - "@algolia/autocomplete-preset-algolia": "1.7.2", - "@docsearch/css": "3.3.0", + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", "algoliasearch": "^4.0.0" }, "peerDependencies": { @@ -2032,9 +2032,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", + "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", "dependencies": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -2046,13 +2046,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/cssnano-preset": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -2073,7 +2073,7 @@ "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.3", + "eta": "^2.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", @@ -2120,9 +2120,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", + "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", "dependencies": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -2134,9 +2134,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", + "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.4.0" @@ -2146,14 +2146,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", + "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", "dependencies": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -2177,12 +2177,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", + "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", + "@docusaurus/types": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2196,17 +2196,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", + "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -2226,17 +2226,17 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", + "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -2256,15 +2256,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", + "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" @@ -2278,13 +2278,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", + "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" @@ -2298,13 +2298,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", + "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" }, "engines": { @@ -2316,13 +2316,31 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", + "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", + "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", + "dependencies": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" }, "engines": { @@ -2334,16 +2352,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", + "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" @@ -2357,22 +2375,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", + "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/plugin-debug": "2.4.0", + "@docusaurus/plugin-google-analytics": "2.4.0", + "@docusaurus/plugin-google-gtag": "2.4.0", + "@docusaurus/plugin-google-tag-manager": "2.4.0", + "@docusaurus/plugin-sitemap": "2.4.0", + "@docusaurus/theme-classic": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-search-algolia": "2.4.0", + "@docusaurus/types": "2.4.0" }, "engines": { "node": ">=16.14" @@ -2395,26 +2414,26 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", + "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -2434,16 +2453,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", + "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", "dependencies": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2451,6 +2471,7 @@ "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" }, "engines": { @@ -2462,22 +2483,22 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", + "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", "dependencies": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", - "eta": "^1.12.3", + "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0", @@ -2492,9 +2513,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", + "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", "dependencies": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" @@ -2504,9 +2525,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", + "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -2523,12 +2544,13 @@ } }, "node_modules/@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", "dependencies": { - "@docusaurus/logger": "2.1.0", + "@docusaurus/logger": "2.4.0", "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", @@ -2556,9 +2578,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", + "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", "dependencies": { "tslib": "^2.4.0" }, @@ -2575,12 +2597,12 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", + "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", "dependencies": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -3382,9 +3404,9 @@ } }, "node_modules/@tsconfig/docusaurus": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", - "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", "dev": true }, "node_modules/@types/acorn": { @@ -3628,9 +3650,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.51", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", - "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3638,9 +3660,9 @@ } }, "node_modules/@types/react-helmet": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz", - "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.6.tgz", + "integrity": "sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==", "dev": true, "dependencies": { "@types/react": "*" @@ -4032,30 +4054,30 @@ } }, "node_modules/algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", "dependencies": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", - "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", + "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4227,9 +4249,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "funding": [ { "type": "opencollective", @@ -4241,8 +4263,8 @@ } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4516,9 +4538,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "funding": [ { "type": "opencollective", @@ -4530,10 +4552,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" @@ -4668,9 +4690,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001425", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", - "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==", + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "funding": [ { "type": "opencollective", @@ -4679,6 +4701,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -5121,9 +5147,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==", "engines": { "node": ">=12" }, @@ -5530,12 +5556,12 @@ } }, "node_modules/cssnano-preset-advanced": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", - "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "dependencies": { - "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.12", + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -5549,24 +5575,24 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dependencies": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -5574,11 +5600,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -6954,9 +6980,9 @@ } }, "node_modules/eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==", "engines": { "node": ">=6.0.0" }, @@ -7398,9 +7424,9 @@ "devOptional": true }, "node_modules/flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "dependencies": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -8300,9 +8326,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -8312,9 +8338,9 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { @@ -8495,9 +8521,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "engines": { "node": ">=12" } @@ -10957,9 +10983,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -11394,9 +11420,9 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { "entities": "^4.4.0" }, @@ -11661,11 +11687,11 @@ } }, "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -11678,11 +11704,11 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dependencies": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -11787,12 +11813,12 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -11802,11 +11828,11 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -11849,11 +11875,11 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, @@ -12015,11 +12041,11 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -12088,11 +12114,11 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { @@ -12129,9 +12155,9 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "dependencies": { "sort-css-media-queries": "2.1.0" }, @@ -12690,11 +12716,11 @@ } }, "node_modules/react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", "dependencies": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, @@ -12785,9 +12811,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -14160,11 +14186,11 @@ } }, "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { @@ -14532,7 +14558,8 @@ "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" }, "node_modules/trim-trailing-lines": { "version": "1.1.4", @@ -14638,9 +14665,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", "funding": [ { "type": "opencollective", @@ -15169,6 +15196,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15994,95 +16029,95 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", - "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", "requires": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", - "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", "requires": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "@algolia/autocomplete-shared": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", - "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" }, "@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", "requires": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" }, "@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", "requires": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", "requires": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/events": { @@ -16091,47 +16126,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" }, "@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", "requires": { - "@algolia/logger-common": "4.14.2" + "@algolia/logger-common": "4.17.0" } }, "@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", "requires": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" }, "@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", "requires": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", "requires": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" } }, "@ampproject/remapping": { @@ -17288,11 +17323,11 @@ } }, "@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/runtime-corejs3": { @@ -17360,25 +17395,25 @@ "optional": true }, "@docsearch/css": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", - "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" }, "@docsearch/react": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", - "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", "requires": { - "@algolia/autocomplete-core": "1.7.2", - "@algolia/autocomplete-preset-algolia": "1.7.2", - "@docsearch/css": "3.3.0", + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", + "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", "requires": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -17390,13 +17425,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/cssnano-preset": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -17417,7 +17452,7 @@ "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.3", + "eta": "^2.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", @@ -17454,9 +17489,9 @@ } }, "@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", + "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", "requires": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -17465,23 +17500,23 @@ } }, "@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", + "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", "requires": { "chalk": "^4.1.2", "tslib": "^2.4.0" } }, "@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", + "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", "requires": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -17498,12 +17533,12 @@ } }, "@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", + "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", "requires": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", + "@docusaurus/types": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -17513,17 +17548,17 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", + "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -17536,17 +17571,17 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", + "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -17559,88 +17594,100 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", + "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" } }, "@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", + "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", + "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", + "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-tag-manager": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", + "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", + "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", + "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/plugin-debug": "2.4.0", + "@docusaurus/plugin-google-analytics": "2.4.0", + "@docusaurus/plugin-google-gtag": "2.4.0", + "@docusaurus/plugin-google-tag-manager": "2.4.0", + "@docusaurus/plugin-sitemap": "2.4.0", + "@docusaurus/theme-classic": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-search-algolia": "2.4.0", + "@docusaurus/types": "2.4.0" } }, "@docusaurus/react-loadable": { @@ -17653,26 +17700,26 @@ } }, "@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", + "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -17685,16 +17732,17 @@ } }, "@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", + "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", "requires": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -17702,26 +17750,27 @@ "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" } }, "@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", + "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", "requires": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", - "eta": "^1.12.3", + "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0", @@ -17729,18 +17778,18 @@ } }, "@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", + "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", "requires": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" } }, "@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", + "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", "requires": { "@types/history": "^4.7.11", "@types/react": "*", @@ -17753,12 +17802,13 @@ } }, "@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", "requires": { - "@docusaurus/logger": "2.1.0", + "@docusaurus/logger": "2.4.0", "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", @@ -17775,20 +17825,20 @@ } }, "@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", + "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", "requires": { "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", + "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", "requires": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -18327,9 +18377,9 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@tsconfig/docusaurus": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", - "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", "dev": true }, "@types/acorn": { @@ -18573,9 +18623,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.51", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", - "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -18583,9 +18633,9 @@ } }, "@types/react-helmet": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz", - "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.6.tgz", + "integrity": "sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==", "dev": true, "requires": { "@types/react": "*" @@ -18935,30 +18985,30 @@ "requires": {} }, "algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", "requires": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "algoliasearch-helper": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", - "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", + "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", "requires": { "@algolia/events": "^4.0.1" } @@ -19090,12 +19140,12 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -19312,14 +19362,14 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "buffer-from": { @@ -19417,9 +19467,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001425", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", - "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==" + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==" }, "ccount": { "version": "1.1.0", @@ -19744,9 +19794,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==" }, "copy-to-clipboard": { "version": "3.3.2", @@ -20002,12 +20052,12 @@ } }, "cssnano-preset-advanced": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", - "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "requires": { - "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.12", + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -20015,24 +20065,24 @@ } }, "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "requires": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -20040,11 +20090,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -21043,9 +21093,9 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==" }, "etag": { "version": "1.8.1", @@ -21405,9 +21455,9 @@ "devOptional": true }, "flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "requires": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -22059,14 +22109,14 @@ } }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "http-cache-semantics": { @@ -22187,9 +22237,9 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==" }, "inflight": { "version": "1.0.6", @@ -23858,9 +23908,9 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "normalize-path": { "version": "3.0.0", @@ -24161,9 +24211,9 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "requires": { "entities": "^4.4.0" } @@ -24350,22 +24400,22 @@ } }, "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "requires": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -24421,20 +24471,20 @@ } }, "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -24459,11 +24509,11 @@ } }, "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } @@ -24555,11 +24605,11 @@ } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -24598,11 +24648,11 @@ } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, @@ -24624,9 +24674,9 @@ } }, "postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "requires": { "sort-css-media-queries": "2.1.0" } @@ -25047,11 +25097,11 @@ } }, "react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", "requires": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" } @@ -25117,9 +25167,9 @@ } }, "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.0", @@ -26162,11 +26212,11 @@ } }, "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, @@ -26503,9 +26553,9 @@ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" }, "ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==" }, "unbox-primitive": { "version": "1.0.2", @@ -26845,6 +26895,12 @@ "use-isomorphic-layout-effect": "^1.1.1" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/docs/package.json b/docs/package.json index 918fd173..33742311 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.1.0", - "@docusaurus/preset-classic": "^2.1.0", + "@docusaurus/core": "^2.4.0", + "@docusaurus/preset-classic": "^2.4.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -43,12 +43,12 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.1.0", - "@docusaurus/types": "^2.1.0", - "@tsconfig/docusaurus": "^1.0.5", + "@docusaurus/module-type-aliases": "^2.4.0", + "@docusaurus/types": "^2.4.0", + "@tsconfig/docusaurus": "^1.0.7", "@types/js-yaml": "^4.0.5", - "@types/react": "^17.0.3", - "@types/react-helmet": "^6.1.5", + "@types/react": "^17.0.58", + "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", From c6bf95a901164e57d87d76cc65962434bba7b25d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:41:08 -0500 Subject: [PATCH 094/134] chore: Update fontawesome --- docs/package-lock.json | 64 +++++++++++++++++++++--------------------- docs/package.json | 6 ++-- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index ac8c947e..6f2ab304 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -10,9 +10,9 @@ "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.3", - "@fortawesome/react-fontawesome": "^0.1.18", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", "js-yaml": "^4.1.0", @@ -2695,48 +2695,48 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "dependencies": { "prop-types": "^15.8.1" }, "peerDependencies": { "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.x" + "react": ">=16.3" } }, "node_modules/@hapi/hoek": { @@ -17900,30 +17900,30 @@ "devOptional": true }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "requires": { "prop-types": "^15.8.1" } diff --git a/docs/package.json b/docs/package.json index 33742311..44274bec 100644 --- a/docs/package.json +++ b/docs/package.json @@ -17,9 +17,9 @@ "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.3", - "@fortawesome/react-fontawesome": "^0.1.18", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", "js-yaml": "^4.1.0", From dae020787e5b29290e5cbd564fb5cdc4d29a0324 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 16:55:01 -0500 Subject: [PATCH 095/134] docs: Update tree-sitter Updated web-tree-sitter and the devicetree grammar. web-tree-sitter now supports a custom function to locate its .wasm file, so performing a string replace is no longer necessary to get it to work with Docusaurus' Webpack configuration. We now check when tree-sitter is locating its .wasm file and provide the Webpack-adjusted URL. --- docs/package-lock.json | 14 ++++---- docs/package.json | 2 +- .../docusaurus-tree-sitter-plugin/index.js | 30 ------------------ docs/src/keymap-upgrade.js | 15 ++++++++- docs/static/tree-sitter-devicetree.wasm | Bin 34601 -> 40229 bytes 5 files changed, 22 insertions(+), 39 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 6f2ab304..3183a51c 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -21,7 +21,7 @@ "react-copy-to-clipboard": "^5.0.3", "react-dom": "^17.0.2", "react-toastify": "^7.0.4", - "web-tree-sitter": "^0.19.4" + "web-tree-sitter": "^0.20.8" }, "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.0", @@ -15391,9 +15391,9 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" }, "node_modules/webidl-conversions": { "version": "3.0.1", @@ -27040,9 +27040,9 @@ "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" }, "web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" }, "webidl-conversions": { "version": "3.0.1", diff --git a/docs/package.json b/docs/package.json index 44274bec..15d5aa38 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,7 +28,7 @@ "react-copy-to-clipboard": "^5.0.3", "react-dom": "^17.0.2", "react-toastify": "^7.0.4", - "web-tree-sitter": "^0.19.4" + "web-tree-sitter": "^0.20.8" }, "browserslist": { "production": [ diff --git a/docs/src/docusaurus-tree-sitter-plugin/index.js b/docs/src/docusaurus-tree-sitter-plugin/index.js index e782aea8..a6952ce7 100644 --- a/docs/src/docusaurus-tree-sitter-plugin/index.js +++ b/docs/src/docusaurus-tree-sitter-plugin/index.js @@ -16,36 +16,6 @@ module.exports = function () { test: /web-tree-sitter/, loader: "null-loader", }); - } else { - // The way web-tree-sitter loads tree-sitter.wasm isn't something that - // Docusaurus/Webpack identify as an asset. There is currently no way to - // set location of the file other than patching web-tree-sitter. - // (see https://github.com/tree-sitter/tree-sitter/issues/559) - rules.push({ - test: /tree-sitter\.js$/, - loader: "string-replace-loader", - options: { - multiple: [ - // Replace the path to tree-sitter.wasm with a "new URL()" to clue - // Webpack in that it is an asset. - { - search: '"tree-sitter.wasm"', - replace: '(new URL("tree-sitter.wasm", import.meta.url)).href', - strict: true, - }, - // Webpack replaces "new URL()" with the full URL to the asset, but - // web-tree-sitter will still add a prefix to it unless there is a - // Module.locateFile() function. - { - search: "var Module=void 0!==Module?Module:{};", - replace: `var Module = { - locateFile: (path, prefix) => path.startsWith('http') ? path : prefix + path, - };`, - strict: true, - }, - ], - }, - }); } return { diff --git a/docs/src/keymap-upgrade.js b/docs/src/keymap-upgrade.js index 19a5d8e3..788ab31a 100644 --- a/docs/src/keymap-upgrade.js +++ b/docs/src/keymap-upgrade.js @@ -2,10 +2,23 @@ import Parser from "web-tree-sitter"; import { Codes, Behaviors } from "./data/keymap-upgrade"; +const TREE_SITTER_WASM_URL = new URL( + "/node_modules/web-tree-sitter/tree-sitter.wasm", + import.meta.url +); + let Devicetree; export async function initParser() { - await Parser.init(); + await Parser.init({ + locateFile: (path, prefix) => { + // When locating tree-sitter.wasm, use a path that Webpack can map to the correct URL. + if (path == "tree-sitter.wasm") { + return TREE_SITTER_WASM_URL.href; + } + return prefix + path; + }, + }); Devicetree = await Parser.Language.load("/tree-sitter-devicetree.wasm"); } diff --git a/docs/static/tree-sitter-devicetree.wasm b/docs/static/tree-sitter-devicetree.wasm index fbcb0f18a70a75cc57c24aa7ae0a4b00aad5a95b..cce5ac9656c93720f1840dd7d89cb23b19d6e66b 100644 GIT binary patch literal 40229 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 J66B|X{s#)Tb{_x$ literal 34601 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 VuYJt0y Date: Mon, 24 Apr 2023 20:22:42 -0500 Subject: [PATCH 096/134] fix(docs): Fix typescript error See https://github.com/facebook/docusaurus/issues/8226#issuecomment-1420620198 --- docs/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 589217e2..a9844e97 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -3,7 +3,7 @@ "include": ["src/"], "compilerOptions": { "types": ["node", "@docusaurus/theme-classic"], - "moduleResolution": "Node", + "moduleResolution": "Node16", "esModuleInterop": true, "resolveJsonModule": true, "strict": true, From b021d19255122883c4ccd1887ffa0bba5df076b0 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:12:59 -0700 Subject: [PATCH 097/134] fix(display): Imply LVGL mono theme when display is enabled All displays currently used with ZMK are monochrome so it makes sense to enable the mono theme by default, which can be disabled by the user since we use the "imply" statement. Without this theme setting, the small font size selection for widgets at the bottom of the stock status screen does not work. --- app/src/display/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 32be2a27..cb086b4c 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -9,6 +9,7 @@ menuconfig ZMK_DISPLAY select LV_THEMES select LV_THEME_MONO select LV_CONF_MINIMAL + imply LV_USE_THEME_MONO if ZMK_DISPLAY From 7e29166c6ce4987de58de2e8a5545dca68312dfd Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:40:11 -0700 Subject: [PATCH 098/134] refactor(display): Clean up unused theme Kconfig --- app/src/display/Kconfig | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index cb086b4c..5f67bf11 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -6,8 +6,6 @@ menuconfig ZMK_DISPLAY default n select DISPLAY select LVGL - select LV_THEMES - select LV_THEME_MONO select LV_CONF_MINIMAL imply LV_USE_THEME_MONO From 864394b40a7599a1560782226168cd6e40244c5a Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:20:24 -0700 Subject: [PATCH 099/134] feat(display): Add setting to invert display colors Add CONFIG_ZMK_DISPLAY_INVERT Kconfig to invert colors (black-on-white to white-on-black) on monochrome screens. Currently applies only if CONFIG_LV_USE_THEME_MONO is selected, which is the default unless user overrides it. --- app/src/display/Kconfig | 7 +++++++ app/src/display/main.c | 3 ++- docs/docs/config/displays.md | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 5f67bf11..63ba968b 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -15,6 +15,13 @@ config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" default y if SSD1306 +if LV_USE_THEME_MONO + +config ZMK_DISPLAY_INVERT + bool "Invert display colors" + +endif + choice LV_TXT_ENC default LV_TXT_ENC_UTF8 diff --git a/app/src/display/main.c b/app/src/display/main.c index e34f8a53..e15e2de0 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -91,7 +91,8 @@ int zmk_display_is_initialized() { return initialized; } static void initialize_theme() { #if IS_ENABLED(CONFIG_LV_USE_THEME_MONO) lv_disp_t *disp = lv_disp_get_default(); - lv_theme_t *theme = lv_theme_mono_init(disp, false, CONFIG_LV_FONT_DEFAULT); + lv_theme_t *theme = + lv_theme_mono_init(disp, IS_ENABLED(CONFIG_ZMK_DISPLAY_INVERT), CONFIG_LV_FONT_DEFAULT); theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; disp->theme = theme; diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index d126e38a..a68bf26a 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -17,12 +17,15 @@ Definition files: | Config | Type | Description | Default | | -------------------------------------------------- | ---- | -------------------------------------------------------------- | ------- | | `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | +| `CONFIG_ZMK_DISPLAY_INVERT` | bool | Invert display colors from black-on-white to white-on-black | n | | `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | | `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | | `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | | `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | | `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | +Note that `CONFIG_ZMK_DISPLAY_INVERT` setting might not work as expected with custom status screens that utilize images. + If `CONFIG_ZMK_DISPLAY` is enabled, exactly zero or one of the following options must be set to `y`. The first option is used if none are set. | Config | Description | From 5aac2743b10c69be000038cd03e51f5a284fa6cc Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 May 2023 22:56:58 -0700 Subject: [PATCH 100/134] fix(bluetooth): Improved checking for conn status. * Check the actual connection status before considering a discovered connection as connected. --- app/src/ble.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/ble.c b/app/src/ble.c index a7037d0c..c7bdc401 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -118,6 +118,7 @@ void set_profile_address(uint8_t index, const bt_addr_le_t *addr) { bool zmk_ble_active_profile_is_connected() { struct bt_conn *conn; + struct bt_conn_info info; bt_addr_le_t *addr = zmk_ble_active_profile_addr(); if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) { return false; @@ -125,9 +126,11 @@ bool zmk_ble_active_profile_is_connected() { return false; } + bt_conn_get_info(conn, &info); + bt_conn_unref(conn); - return true; + return info.state == BT_CONN_STATE_CONNECTED; } #define CHECKED_ADV_STOP() \ From 1adfcf92bf96cd6453e6bb3ae8cc3b2d1fa8caa4 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Mon, 29 May 2023 00:28:45 -0400 Subject: [PATCH 101/134] refactor(split): fix inconsistency in Kconfig names --- app/include/zmk/ble.h | 2 +- app/src/keymap.c | 2 +- app/src/split/bluetooth/Kconfig | 4 ++-- app/src/split/bluetooth/central.c | 12 ++++++------ docs/docs/config/system.md | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/include/zmk/ble.h b/app/include/zmk/ble.h index 4380a33a..1c84777d 100644 --- a/app/include/zmk/ble.h +++ b/app/include/zmk/ble.h @@ -15,7 +15,7 @@ #if ZMK_BLE_IS_CENTRAL #define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#define ZMK_BLE_SPLIT_PERIPHERAL_COUNT 1 +#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT 1 #else #define ZMK_BLE_PROFILE_COUNT CONFIG_BT_MAX_PAIRED #endif diff --git a/app/src/keymap.c b/app/src/keymap.c index 909fd20d..da25fc09 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -218,7 +218,7 @@ int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position #endif case BEHAVIOR_LOCALITY_GLOBAL: #if ZMK_BLE_IS_CENTRAL - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { zmk_split_bt_invoke_behavior(i, &binding, event, pressed); } #endif diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index 53119d82..005d75fd 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -21,11 +21,11 @@ config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE int "Max number of key position state events to queue when received from peripherals" default 5 -config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE +config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE int "BLE split central write thread stack size" default 512 -config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE +config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE int "Max number of behavior run events to queue to send to the peripheral(s)" default 5 diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index ac073c59..a7c0d8a9 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -47,7 +47,7 @@ struct peripheral_slot { uint8_t changed_positions[POSITION_STATE_DATA_LEN]; }; -static struct peripheral_slot peripherals[ZMK_BLE_SPLIT_PERIPHERAL_COUNT]; +static struct peripheral_slot peripherals[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; static const struct bt_uuid_128 split_service_uuid = BT_UUID_INIT_128(ZMK_SPLIT_BT_SERVICE_UUID); @@ -65,7 +65,7 @@ void peripheral_event_work_callback(struct k_work *work) { K_WORK_DEFINE(peripheral_event_work, peripheral_event_work_callback); int peripheral_slot_index_for_conn(struct bt_conn *conn) { - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { if (peripherals[i].conn == conn) { return i; } @@ -84,7 +84,7 @@ struct peripheral_slot *peripheral_slot_for_conn(struct bt_conn *conn) { } int release_peripheral_slot(int index) { - if (index < 0 || index >= ZMK_BLE_SPLIT_PERIPHERAL_COUNT) { + if (index < 0 || index >= ZMK_SPLIT_BLE_PERIPHERAL_COUNT) { return -EINVAL; } @@ -131,7 +131,7 @@ int release_peripheral_slot(int index) { } int reserve_peripheral_slot() { - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { if (peripherals[i].state == PERIPHERAL_SLOT_STATE_OPEN) { // Be sure the slot is fully reinitialized. release_peripheral_slot(i); @@ -504,7 +504,7 @@ static struct bt_conn_cb conn_callbacks = { }; K_THREAD_STACK_DEFINE(split_central_split_run_q_stack, - CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE); + CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE); struct k_work_q split_central_split_run_q; @@ -515,7 +515,7 @@ struct zmk_split_run_behavior_payload_wrapper { K_MSGQ_DEFINE(zmk_split_central_split_run_msgq, sizeof(struct zmk_split_run_behavior_payload_wrapper), - CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE, 4); + CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE, 4); void split_central_split_run_callback(struct k_work *work) { struct zmk_split_run_behavior_payload_wrapper payload_wrapper; diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index a5347b96..5a5ae5a5 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -97,8 +97,8 @@ Following split keyboard settings are defined in [zmk/app/src/split/Kconfig](htt | `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | | `CONFIG_ZMK_SPLIT_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | | `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | -| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | -| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the BLE split peripheral notify thread | 650 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the BLE split peripheral notify thread | 5 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | From b276a3bfb074a869ca101bdaba924c936eeb04ec Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Tue, 6 Dec 2022 00:13:01 -0600 Subject: [PATCH 102/134] refactor(kscan): batch GPIO reads by port Changed the GPIO matrix and direct GPIO key scan drivers to do a single read per port instead of one read per pin. This is much more efficient for some types of GPIO drivers, such as I2C GPIO expanders. To accomplish this with minimal overhead, we now sort input pins by port at driver init. if we iterate through the pins in the sorted order, all pins on the same port are consecutive, so we only need to read each port once the first time we see it. --- app/drivers/kscan/CMakeLists.txt | 1 + app/drivers/kscan/kscan_gpio.c | 33 ++++++++ app/drivers/kscan/kscan_gpio.h | 61 ++++++++++++++ app/drivers/kscan/kscan_gpio_direct.c | 72 +++++++++-------- app/drivers/kscan/kscan_gpio_matrix.c | 110 +++++++++++++------------- 5 files changed, 188 insertions(+), 89 deletions(-) create mode 100644 app/drivers/kscan/kscan_gpio.c create mode 100644 app/drivers/kscan/kscan_gpio.h diff --git a/app/drivers/kscan/CMakeLists.txt b/app/drivers/kscan/CMakeLists.txt index ced31e6f..8fc7ed58 100644 --- a/app/drivers/kscan/CMakeLists.txt +++ b/app/drivers/kscan/CMakeLists.txt @@ -5,6 +5,7 @@ zephyr_library_named(zmk__drivers__kscan) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER debounce.c) +zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_MATRIX kscan_gpio_matrix.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DIRECT kscan_gpio_direct.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DEMUX kscan_gpio_demux.c) diff --git a/app/drivers/kscan/kscan_gpio.c b/app/drivers/kscan/kscan_gpio.c new file mode 100644 index 00000000..4963f678 --- /dev/null +++ b/app/drivers/kscan/kscan_gpio.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kscan_gpio.h" + +#include + +static int compare_ports(const void *a, const void *b) { + const struct kscan_gpio *gpio_a = a; + const struct kscan_gpio *gpio_b = b; + + return gpio_a->spec.port - gpio_b->spec.port; +} + +void kscan_gpio_list_sort_by_port(struct kscan_gpio_list *list) { + qsort(list->gpios, list->len, sizeof(list->gpios[0]), compare_ports); +} + +int kscan_gpio_pin_get(const struct kscan_gpio *gpio, struct kscan_gpio_port_state *state) { + if (gpio->spec.port != state->port) { + state->port = gpio->spec.port; + + const int err = gpio_port_get(state->port, &state->value); + if (err) { + return err; + } + } + + return (state->value & BIT(gpio->spec.pin)) != 0; +} diff --git a/app/drivers/kscan/kscan_gpio.h b/app/drivers/kscan/kscan_gpio.h new file mode 100644 index 00000000..39343136 --- /dev/null +++ b/app/drivers/kscan/kscan_gpio.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +struct kscan_gpio { + struct gpio_dt_spec spec; + /** The index of the GPIO in the devicetree *-gpios array. */ + size_t index; +}; + +/** GPIO_DT_SPEC_GET_BY_IDX(), but for a struct kscan_gpio. */ +#define KSCAN_GPIO_GET_BY_IDX(node_id, prop, idx) \ + ((struct kscan_gpio){.spec = GPIO_DT_SPEC_GET_BY_IDX(node_id, prop, idx), .index = idx}) + +struct kscan_gpio_list { + struct kscan_gpio *gpios; + size_t len; +}; + +/** Define a kscan_gpio_list from a compile-time GPIO array. */ +#define KSCAN_GPIO_LIST(gpio_array) \ + ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) + +struct kscan_gpio_port_state { + const struct device *port; + gpio_port_value_t value; +}; + +/** + * Sorts a GPIO list by port so it can be used with kscan_gpio_pin_get(). + */ +void kscan_gpio_list_sort_by_port(struct kscan_gpio_list *list); + +/** + * Get logical level of an input pin. + * + * This is equivalent to gpio_pin_get() except that, when iterating through the + * pins in a list which is sorted by kscan_gpio_list_sort_by_port(), it only + * performs one read per port instead of one read per pin. + * + * @param gpio The input pin to read. + * @param state An object to track state between reads. Must be zero-initialized before the first + * use. + * + * @retval 1 If pin logical value is 1 / active. + * @retval 0 If pin logical value is 0 / inactive. + * @retval -EIO I/O error when accessing an external GPIO chip. + * @retval -EWOULDBLOCK if operation would block. + */ +int kscan_gpio_pin_get(const struct kscan_gpio *gpio, struct kscan_gpio_port_state *state); diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 586e0d95..d43d716b 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -5,6 +5,7 @@ */ #include "debounce.h" +#include "kscan_gpio.h" #include #include @@ -41,7 +42,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define INST_INPUTS_LEN(n) DT_INST_PROP_LEN(n, input_gpios) #define KSCAN_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) struct kscan_direct_irq_callback { const struct device *dev; @@ -50,6 +51,7 @@ struct kscan_direct_irq_callback { struct kscan_direct_data { const struct device *dev; + struct kscan_gpio_list inputs; kscan_callback_t callback; struct k_work_delayable work; #if USE_INTERRUPTS @@ -62,17 +64,7 @@ struct kscan_direct_data { struct debounce_state *pin_state; }; -struct kscan_gpio_list { - const struct gpio_dt_spec *gpios; - size_t len; -}; - -/** Define a kscan_gpio_list from a compile-time GPIO array. */ -#define KSCAN_GPIO_LIST(gpio_array) \ - ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) - struct kscan_direct_config { - struct kscan_gpio_list inputs; struct debounce_config debounce_config; int32_t debounce_scan_period_ms; int32_t poll_period_ms; @@ -81,10 +73,10 @@ struct kscan_direct_config { #if USE_INTERRUPTS static int kscan_direct_interrupt_configure(const struct device *dev, const gpio_flags_t flags) { - const struct kscan_direct_config *config = dev->config; + const struct kscan_direct_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = gpio_pin_interrupt_configure_dt(gpio, flags); if (err) { @@ -134,16 +126,16 @@ static gpio_flags_t kscan_gpio_get_extra_flags(const struct gpio_dt_spec *gpio, static int kscan_inputs_set_flags(const struct kscan_gpio_list *inputs, const struct gpio_dt_spec *active_gpio) { - gpio_flags_t extra_flags; for (int i = 0; i < inputs->len; i++) { - extra_flags = GPIO_INPUT | kscan_gpio_get_extra_flags(&inputs->gpios[i], - &inputs->gpios[i] == active_gpio); + const bool active = &inputs->gpios[i].spec == active_gpio; + const gpio_flags_t extra_flags = + GPIO_INPUT | kscan_gpio_get_extra_flags(&inputs->gpios[i].spec, active); LOG_DBG("Extra flags equal to: %d", extra_flags); - int err = gpio_pin_configure_dt(&inputs->gpios[i], extra_flags); + int err = gpio_pin_configure_dt(&inputs->gpios[i].spec, extra_flags); if (err) { - LOG_ERR("Unable to configure flags on pin %d on %s", inputs->gpios[i].pin, - inputs->gpios[i].port->name); + LOG_ERR("Unable to configure flags on pin %d on %s", inputs->gpios[i].spec.pin, + inputs->gpios[i].spec.port->name); return err; } } @@ -179,28 +171,35 @@ static int kscan_direct_read(const struct device *dev) { const struct kscan_direct_config *config = dev->config; // Read the inputs. - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + struct kscan_gpio_port_state state = {0}; - const bool active = gpio_pin_get_dt(gpio); + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; - debounce_update(&data->pin_state[i], active, config->debounce_scan_period_ms, + const int active = kscan_gpio_pin_get(gpio, &state); + if (active < 0) { + LOG_ERR("Failed to read port %s: %i", gpio->spec.port->name, active); + return active; + } + + debounce_update(&data->pin_state[gpio->index], active, config->debounce_scan_period_ms, &config->debounce_config); } // Process the new state. bool continue_scan = false; - for (int i = 0; i < config->inputs.len; i++) { - struct debounce_state *state = &data->pin_state[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; + struct debounce_state *state = &data->pin_state[gpio->index]; if (debounce_get_changed(state)) { const bool pressed = debounce_is_pressed(state); - LOG_DBG("Sending event at 0,%i state %s", i, pressed ? "on" : "off"); - data->callback(dev, 0, i, pressed); + LOG_DBG("Sending event at 0,%i state %s", gpio->index, pressed ? "on" : "off"); + data->callback(dev, 0, gpio->index, pressed); if (config->toggle_mode && pressed) { - kscan_inputs_set_flags(&config->inputs, &config->inputs.gpios[i]); + kscan_inputs_set_flags(&data->inputs, &gpio->spec); } } @@ -289,10 +288,11 @@ static int kscan_direct_init_input_inst(const struct device *dev, const struct g } static int kscan_direct_init_inputs(const struct device *dev) { + const struct kscan_direct_data *data = dev->data; const struct kscan_direct_config *config = dev->config; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = kscan_direct_init_input_inst(dev, gpio, i, config->toggle_mode); if (err) { return err; @@ -307,6 +307,9 @@ static int kscan_direct_init(const struct device *dev) { data->dev = dev; + // Sort inputs by port so we can read each port just once per scan. + kscan_gpio_list_sort_by_port(&data->inputs); + kscan_direct_init_inputs(dev); k_work_init_delayable(&data->work, kscan_direct_work_handler); @@ -326,7 +329,7 @@ static const struct kscan_driver_api kscan_direct_api = { BUILD_ASSERT(INST_DEBOUNCE_RELEASE_MS(n) <= DEBOUNCE_COUNTER_MAX, \ "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ - static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ + static struct kscan_gpio kscan_direct_inputs_##n[] = { \ LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ @@ -335,10 +338,11 @@ static const struct kscan_driver_api kscan_direct_api = { (static struct kscan_direct_irq_callback kscan_direct_irqs_##n[INST_INPUTS_LEN(n)];)) \ \ static struct kscan_direct_data kscan_direct_data_##n = { \ - .pin_state = kscan_direct_state_##n, COND_INTERRUPTS((.irqs = kscan_direct_irqs_##n, ))}; \ + .inputs = KSCAN_GPIO_LIST(kscan_direct_inputs_##n), \ + .pin_state = kscan_direct_state_##n, \ + COND_INTERRUPTS((.irqs = kscan_direct_irqs_##n, ))}; \ \ static struct kscan_direct_config kscan_direct_config_##n = { \ - .inputs = KSCAN_GPIO_LIST(kscan_direct_inputs_##n), \ .debounce_config = \ { \ .debounce_press_ms = INST_DEBOUNCE_PRESS_MS(n), \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index d2121273..b8e72044 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -5,6 +5,7 @@ */ #include "debounce.h" +#include "kscan_gpio.h" #include #include @@ -50,9 +51,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, pollcode, intcode) #define KSCAN_GPIO_ROW_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) #define KSCAN_GPIO_COL_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) enum kscan_diode_direction { KSCAN_ROW2COL, @@ -66,6 +67,7 @@ struct kscan_matrix_irq_callback { struct kscan_matrix_data { const struct device *dev; + struct kscan_gpio_list inputs; kscan_callback_t callback; struct k_work_delayable work; #if USE_INTERRUPTS @@ -76,26 +78,16 @@ struct kscan_matrix_data { int64_t scan_time; /** * Current state of the matrix as a flattened 2D array of length - * (config->rows.len * config->cols.len) + * (config->rows * config->cols) */ struct debounce_state *matrix_state; }; -struct kscan_gpio_list { - const struct gpio_dt_spec *gpios; - size_t len; -}; - -/** Define a kscan_gpio_list from a compile-time GPIO array. */ -#define KSCAN_GPIO_LIST(gpio_array) \ - ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) - struct kscan_matrix_config { - struct kscan_gpio_list rows; - struct kscan_gpio_list cols; - struct kscan_gpio_list inputs; struct kscan_gpio_list outputs; struct debounce_config debounce_config; + size_t rows; + size_t cols; int32_t debounce_scan_period_ms; int32_t poll_period_ms; enum kscan_diode_direction diode_direction; @@ -105,10 +97,10 @@ struct kscan_matrix_config { * Get the index into a matrix state array from a row and column. */ static int state_index_rc(const struct kscan_matrix_config *config, const int row, const int col) { - __ASSERT(row < config->rows.len, "Invalid row %i", row); - __ASSERT(col < config->cols.len, "Invalid column %i", col); + __ASSERT(row < config->rows, "Invalid row %i", row); + __ASSERT(col < config->cols, "Invalid column %i", col); - return (col * config->rows.len) + row; + return (col * config->rows) + row; } /** @@ -125,7 +117,7 @@ static int kscan_matrix_set_all_outputs(const struct device *dev, const int valu const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->outputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->outputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->outputs.gpios[i].spec; int err = gpio_pin_set_dt(gpio, value); if (err) { @@ -139,10 +131,10 @@ static int kscan_matrix_set_all_outputs(const struct device *dev, const int valu #if USE_INTERRUPTS static int kscan_matrix_interrupt_configure(const struct device *dev, const gpio_flags_t flags) { - const struct kscan_matrix_config *config = dev->config; + const struct kscan_matrix_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = gpio_pin_interrupt_configure_dt(gpio, flags); if (err) { @@ -226,32 +218,37 @@ static int kscan_matrix_read(const struct device *dev) { const struct kscan_matrix_config *config = dev->config; // Scan the matrix. - for (int o = 0; o < config->outputs.len; o++) { - const struct gpio_dt_spec *out_gpio = &config->outputs.gpios[o]; + for (int i = 0; i < config->outputs.len; i++) { + const struct kscan_gpio *out_gpio = &config->outputs.gpios[i]; - int err = gpio_pin_set_dt(out_gpio, 1); + int err = gpio_pin_set_dt(&out_gpio->spec, 1); if (err) { - LOG_ERR("Failed to set output %i active: %i", o, err); + LOG_ERR("Failed to set output %i active: %i", out_gpio->index, err); return err; } #if CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS > 0 k_busy_wait(CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS); #endif + struct kscan_gpio_port_state state = {0}; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *in_gpio = &config->inputs.gpios[i]; + for (int j = 0; j < data->inputs.len; j++) { + const struct kscan_gpio *in_gpio = &data->inputs.gpios[j]; - const int index = state_index_io(config, i, o); - const bool active = gpio_pin_get_dt(in_gpio); + const int index = state_index_io(config, in_gpio->index, out_gpio->index); + const int active = kscan_gpio_pin_get(in_gpio, &state); + if (active < 0) { + LOG_ERR("Failed to read port %s: %i", in_gpio->spec.port->name, active); + return active; + } debounce_update(&data->matrix_state[index], active, config->debounce_scan_period_ms, &config->debounce_config); } - err = gpio_pin_set_dt(out_gpio, 0); + err = gpio_pin_set_dt(&out_gpio->spec, 0); if (err) { - LOG_ERR("Failed to set output %i inactive: %i", o, err); + LOG_ERR("Failed to set output %i inactive: %i", out_gpio->index, err); return err; } @@ -263,8 +260,8 @@ static int kscan_matrix_read(const struct device *dev) { // Process the new state. bool continue_scan = false; - for (int r = 0; r < config->rows.len; r++) { - for (int c = 0; c < config->cols.len; c++) { + for (int r = 0; r < config->rows; r++) { + for (int c = 0; c < config->cols; c++) { const int index = state_index_rc(config, r, c); struct debounce_state *state = &data->matrix_state[index]; @@ -329,28 +326,28 @@ static int kscan_matrix_disable(const struct device *dev) { #endif } -static int kscan_matrix_init_input_inst(const struct device *dev, const struct gpio_dt_spec *gpio, - const int index) { - if (!device_is_ready(gpio->port)) { - LOG_ERR("GPIO is not ready: %s", gpio->port->name); +static int kscan_matrix_init_input_inst(const struct device *dev, const struct kscan_gpio *gpio) { + if (!device_is_ready(gpio->spec.port)) { + LOG_ERR("GPIO is not ready: %s", gpio->spec.port->name); return -ENODEV; } - int err = gpio_pin_configure_dt(gpio, GPIO_INPUT); + int err = gpio_pin_configure_dt(&gpio->spec, GPIO_INPUT); if (err) { - LOG_ERR("Unable to configure pin %u on %s for input", gpio->pin, gpio->port->name); + LOG_ERR("Unable to configure pin %u on %s for input", gpio->spec.pin, + gpio->spec.port->name); return err; } - LOG_DBG("Configured pin %u on %s for input", gpio->pin, gpio->port->name); + LOG_DBG("Configured pin %u on %s for input", gpio->spec.pin, gpio->spec.port->name); #if USE_INTERRUPTS struct kscan_matrix_data *data = dev->data; - struct kscan_matrix_irq_callback *irq = &data->irqs[index]; + struct kscan_matrix_irq_callback *irq = &data->irqs[gpio->index]; irq->dev = dev; - gpio_init_callback(&irq->callback, kscan_matrix_irq_callback_handler, BIT(gpio->pin)); - err = gpio_add_callback(gpio->port, &irq->callback); + gpio_init_callback(&irq->callback, kscan_matrix_irq_callback_handler, BIT(gpio->spec.pin)); + err = gpio_add_callback(gpio->spec.port, &irq->callback); if (err) { LOG_ERR("Error adding the callback to the input device: %i", err); return err; @@ -361,11 +358,11 @@ static int kscan_matrix_init_input_inst(const struct device *dev, const struct g } static int kscan_matrix_init_inputs(const struct device *dev) { - const struct kscan_matrix_config *config = dev->config; + const struct kscan_matrix_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; - int err = kscan_matrix_init_input_inst(dev, gpio, i); + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; + int err = kscan_matrix_init_input_inst(dev, gpio); if (err) { return err; } @@ -396,7 +393,7 @@ static int kscan_matrix_init_outputs(const struct device *dev) { const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->outputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->outputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->outputs.gpios[i].spec; int err = kscan_matrix_init_output_inst(dev, gpio); if (err) { return err; @@ -411,6 +408,9 @@ static int kscan_matrix_init(const struct device *dev) { data->dev = dev; + // Sort inputs by port so we can read each port just once per scan. + kscan_gpio_list_sort_by_port(&data->inputs); + kscan_matrix_init_inputs(dev); kscan_matrix_init_outputs(dev); kscan_matrix_set_all_outputs(dev, 0); @@ -432,10 +432,10 @@ static const struct kscan_driver_api kscan_matrix_api = { BUILD_ASSERT(INST_DEBOUNCE_RELEASE_MS(n) <= DEBOUNCE_COUNTER_MAX, \ "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ - static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ + static struct kscan_gpio kscan_matrix_rows_##n[] = { \ LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (, ), n)}; \ \ - static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ + static struct kscan_gpio kscan_matrix_cols_##n[] = { \ LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ @@ -444,14 +444,14 @@ static const struct kscan_driver_api kscan_matrix_api = { (static struct kscan_matrix_irq_callback kscan_matrix_irqs_##n[INST_INPUTS_LEN(n)];)) \ \ static struct kscan_matrix_data kscan_matrix_data_##n = { \ + .inputs = \ + KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_cols_##n), (kscan_matrix_rows_##n))), \ .matrix_state = kscan_matrix_state_##n, \ COND_INTERRUPTS((.irqs = kscan_matrix_irqs_##n, ))}; \ \ static struct kscan_matrix_config kscan_matrix_config_##n = { \ - .rows = KSCAN_GPIO_LIST(kscan_matrix_rows_##n), \ - .cols = KSCAN_GPIO_LIST(kscan_matrix_cols_##n), \ - .inputs = \ - KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_cols_##n), (kscan_matrix_rows_##n))), \ + .rows = ARRAY_SIZE(kscan_matrix_rows_##n), \ + .cols = ARRAY_SIZE(kscan_matrix_cols_##n), \ .outputs = \ KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_rows_##n), (kscan_matrix_cols_##n))), \ .debounce_config = \ From a2af74f5ab4d2d7142791ae55cab11d59b29bc4d Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 21:25:12 -0700 Subject: [PATCH 103/134] feat(docs): Add note on modifier functions to macros --- docs/docs/behaviors/macros.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 1648892e..1628e0cb 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -33,7 +33,7 @@ A macro definition looks like: :::note The text before the colon (`:`) in the declaration of the macro node is the "node label", and is the text -used to reference the macro in your keymap +used to reference the macro in your keymap. ::: The macro can then be bound in your keymap by referencing it by the label `&zed_em_kay`, e.g.: @@ -44,6 +44,11 @@ The macro can then be bound in your keymap by referencing it by the label `&zed_ }; ``` +:::note +For use cases involving sending a single keycode with modifiers, for instance ctrl+tab, the [key press behavior](key-press.md) +with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. +::: + ### Bindings Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can From 0508718d6ce8b40adbe932b0bd9bb30ee5e0bbf5 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 21:52:16 -0700 Subject: [PATCH 104/134] feat(docs): Add behavior types section for hold-tap --- docs/docs/behaviors/hold-tap.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index f0096606..2a8489a1 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -133,6 +133,23 @@ See the following example, which uses a hold-tap behavior definition, configured By default, `hold-trigger-key-positions` are evaluated upon the first _key press_ after the hold-tap. For homerow mods, this is not always ideal, because it prevents combining multiple modifiers unless they are included in `hold-trigger-key-positions`. To overwrite this behavior, one can set `hold-trigger-on-release`. If set to true, the evaluation of `hold-trigger-key-positions` gets delayed until _key release_. This allows combining multiple modifiers when the next key is _held_, while still deciding the hold-tap in favor of a tap when the next key is _tapped_. +#### Using different behavior types with hold-taps + +You can create instances of hold-taps invoking most [behavior types](../features/keymaps.md#behaviors) for hold or tap actions, by referencing their node labels in the `bindings` value. +The two parameters that are passed to the hold-tap in your keymap will be forwarded to the referred behaviors, first one to the hold behavior and second one to the tap. + +If you use behaviors that accept no parameters such as [mod-morphs](mod-morph.md) or [macros](macros.md), you can pass a dummy parameter value such as `0` to the hold-tap when you use it in your keymap. +For instance, a hold-tap with node label `caps` and `bindings = <&kp>, <&caps_word>;` can be used in the keymap as below to send the caps lock keycode on hold and invoke the [caps word behavior](caps-word.md) on tap: + +``` +&caps CAPS 0 +``` + +:::info +You cannot use behaviors that expect more than one parameter such as [`&bt`](bluetooth.md) and [`&rgb_ug`](underglow.md) with hold-taps, due to the limitations of the [devicetree keymap format](../config/index.md#devicetree-files). +One workaround is to create a [macro](macros.md) that invokes those behaviors and use the macro as the hold or tap action. +::: + ### Example Use-Cases Date: Mon, 29 May 2023 22:03:24 -0700 Subject: [PATCH 105/134] feat(docs): Add troubleshooting for Windows issue --- docs/docs/features/bluetooth.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index f1a3e241..ff182398 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -57,3 +57,18 @@ If you attempt to pair a ZMK keyboard from macOS in a way that causes a bonding 1. Remove the keyboard from macOS using the Bluetooth control panel. 1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the macOS device is active, by pressing the correct keys for your particular keymap. 1. Try connecting again from macOS. + +### Windows Connected But Not Working + +Occasionally pairing the keyboard to a Windows device might result in a state where the keyboard is connected but does not send any key strokes. +If this occurs: + +1. Remove the keyboard from Windows using the Bluetooth settings. +1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the Windows device is active, by pressing the correct keys for your particular keymap. +1. Turn off Bluetooth from Windows settings, then turn it back on. +1. Pair the keyboard to the Windows device. + +If this doesn't help, try following the procedure above but replace step 3 with one of the following: + +- Restart the Windows device +- Open "Device Manager," turn on "Show hidden devices" from the "View" menu, then find and delete the keyboard under the "Bluetooth" item From 30ba4b08aed896d77fb7ade96ef0334d8f30af5d Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 22:06:09 -0700 Subject: [PATCH 106/134] feat(docs): Add pointer to Bluetooth page in troubleshooting --- docs/docs/troubleshooting.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 96f729b9..e8a05b6b 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -5,6 +5,8 @@ sidebar_title: Troubleshooting The following page provides suggestions for common errors that may occur during firmware compilation or other issues with keyboard usage. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite). +Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page. + ### File Transfer Error Variations of the warnings shown below occur when flashing the `.uf2` onto the microcontroller. This is because the microcontroller resets itself before the OS receives confirmation that the file transfer is complete. Errors like this are normal and can generally be ignored. Verification of a functional board can be done by attempting to pair your newly flashed keyboard to your computer via Bluetooth or plugging in a USB cable if `ZMK_USB` is enabled in your Kconfig.defconfig. From a9ad11f91e82e214d91cf9bf1586431060759f06 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 18:42:50 -0700 Subject: [PATCH 107/134] refactor(docs): Move BT troubleshooting items to BT page --- docs/docs/features/bluetooth.md | 14 ++++++++++++++ docs/docs/troubleshooting.md | 16 +--------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index ff182398..386ad70e 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -38,6 +38,20 @@ Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](.. ## Troubleshooting +### Connectivity Issues + +Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a metal enclosure on the keyboard or host, or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: + +``` +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y +``` + +For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) + +### Using bluetooth output with USB power + +If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. + ## Known Issues There are a few known issues related to BLE and ZMK: diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index e8a05b6b..d47671bc 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -5,7 +5,7 @@ sidebar_title: Troubleshooting The following page provides suggestions for common errors that may occur during firmware compilation or other issues with keyboard usage. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite). -Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page. +Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page for issues related to bluetooth. ### File Transfer Error @@ -102,17 +102,3 @@ Perform the following steps to reset both halves of your split keyboard: 1. Flash the actual image for each half of the split keyboard (e.g `my_board_left.uf2` to the left half, `my_board_right.uf2` to the right half). After completing these steps, pair the halves of the split keyboard together by resetting them at the same time. Most commonly, this is done by grounding the reset pins for each of your keyboard's microcontrollers or pressing the reset buttons at the same time. - -### Connectivity Issues - -Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a metal enclosure on the keyboard or host, or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: - -``` -CONFIG_BT_CTLR_TX_PWR_PLUS_8=y -``` - -For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) - -### Other notes and warnings - -- If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. From 0682bc3aa6d9b9deac48b5aa6c781241075819b3 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 18:45:15 -0700 Subject: [PATCH 108/134] feat(docs): Note split connectivity improvement with TX power --- docs/docs/features/bluetooth.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index 386ad70e..9637c4d0 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -48,6 +48,10 @@ CONFIG_BT_CTLR_TX_PWR_PLUS_8=y For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) +:::info +This setting can also improve the connection strength between the keyboard halves for split keyboards. +::: + ### Using bluetooth output with USB power If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. From ace11e327fbfb4c4c894bb66328156d4d0b7eda0 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 20:46:13 -0700 Subject: [PATCH 109/134] fix(docs): Fix broken link in BT troubleshooting --- docs/docs/features/bluetooth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index 9637c4d0..b75b8953 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -54,7 +54,7 @@ This setting can also improve the connection strength between the keyboard halve ### Using bluetooth output with USB power -If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. +If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. ## Known Issues From 19d883cdfe679977023116dcf689ce67a6ce548d Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 3 Jun 2023 02:53:20 +0000 Subject: [PATCH 110/134] fix(bluetooth): Passkey pairing improvements. * Capture the last 6 entered digits, and then require pressing Enter/Return to submit the entered digits. This matches the messaging shown on hosts regarding how to complete pairing. * Fix the wording on the Kconfig menu item to accurately describe the feature. --- app/Kconfig | 3 ++- app/src/ble.c | 47 +++++++++++++++++++++-------------- docs/docs/config/bluetooth.md | 7 +++--- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index d1b6682f..1537bd61 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -160,8 +160,9 @@ config BT_DEVICE_APPEARANCE default 961 config ZMK_BLE_PASSKEY_ENTRY - bool "Experimental: Requiring typing passkey from host to pair BLE connection" + bool "Require passkey entry on the keyboard to complete pairing" default n + select RING_BUFFER config BT_PERIPHERAL_PREF_MIN_INT default 6 diff --git a/app/src/ble.c b/app/src/ble.c index c7bdc401..383a727d 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -42,8 +43,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define PASSKEY_DIGITS 6 static struct bt_conn *auth_passkey_entry_conn; -static uint8_t passkey_entries[PASSKEY_DIGITS] = {}; -static uint8_t passkey_digit = 0; +RING_BUF_DECLARE(passkey_entries, PASSKEY_DIGITS); #endif /* IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) */ @@ -469,7 +469,7 @@ static void auth_passkey_entry(struct bt_conn *conn) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); LOG_DBG("Passkey entry requested for %s", addr); - passkey_digit = 0; + ring_buf_reset(&passkey_entries); auth_passkey_entry_conn = bt_conn_ref(conn); } @@ -486,7 +486,7 @@ static void auth_cancel(struct bt_conn *conn) { auth_passkey_entry_conn = NULL; } - passkey_digit = 0; + ring_buf_reset(&passkey_entries); #endif LOG_DBG("Pairing cancelled: %s", addr); @@ -605,7 +605,7 @@ static int zmk_ble_init(const struct device *_arg) { #if IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) static bool zmk_ble_numeric_usage_to_value(const zmk_key_t key, const zmk_key_t one, - const zmk_key_t zero, uint32_t *value) { + const zmk_key_t zero, uint8_t *value) { if (key < one || key > zero) { return false; } @@ -634,7 +634,23 @@ static int zmk_ble_handle_key_user(struct zmk_keycode_state_changed *event) { return ZMK_EV_EVENT_HANDLED; } - uint32_t val; + if (key == HID_USAGE_KEY_KEYBOARD_RETURN || key == HID_USAGE_KEY_KEYBOARD_RETURN_ENTER) { + uint8_t digits[PASSKEY_DIGITS]; + uint32_t count = ring_buf_get(&passkey_entries, digits, PASSKEY_DIGITS); + + uint32_t passkey = 0; + for (int i = 0; i < count; i++) { + passkey = (passkey * 10) + digits[i]; + } + + LOG_DBG("Final passkey: %d", passkey); + bt_conn_auth_passkey_entry(auth_passkey_entry_conn, passkey); + bt_conn_unref(auth_passkey_entry_conn); + auth_passkey_entry_conn = NULL; + return ZMK_EV_EVENT_HANDLED; + } + + uint8_t val; if (!(zmk_ble_numeric_usage_to_value(key, HID_USAGE_KEY_KEYBOARD_1_AND_EXCLAMATION, HID_USAGE_KEY_KEYBOARD_0_AND_RIGHT_PARENTHESIS, &val) || zmk_ble_numeric_usage_to_value(key, HID_USAGE_KEY_KEYPAD_1_AND_END, @@ -643,20 +659,13 @@ static int zmk_ble_handle_key_user(struct zmk_keycode_state_changed *event) { return ZMK_EV_EVENT_BUBBLE; } - passkey_entries[passkey_digit++] = val; - LOG_DBG("value entered: %d, digits collected so far: %d", val, passkey_digit); - - if (passkey_digit == PASSKEY_DIGITS) { - uint32_t passkey = 0; - for (int i = 0; i < PASSKEY_DIGITS; i++) { - passkey = (passkey * 10) + passkey_entries[i]; - } - - LOG_DBG("Final passkey: %d", passkey); - bt_conn_auth_passkey_entry(auth_passkey_entry_conn, passkey); - bt_conn_unref(auth_passkey_entry_conn); - auth_passkey_entry_conn = NULL; + if (ring_buf_space_get(&passkey_entries) <= 0) { + uint8_t discard_val; + ring_buf_get(&passkey_entries, &discard_val, 1); } + ring_buf_put(&passkey_entries, &val, 1); + LOG_DBG("value entered: %d, digits collected so far: %d", val, + ring_buf_size_get(&passkey_entries)); return ZMK_EV_EVENT_HANDLED; } diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md index 420dd5c3..d2ddefdd 100644 --- a/docs/docs/config/bluetooth.md +++ b/docs/docs/config/bluetooth.md @@ -9,6 +9,7 @@ See [Configuration Overview](index.md) for instructions on how to change these s ## Kconfig -| Option | Type | Description | Default | -| ------------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------- | ------- | -| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | +| Option | Type | Description | Default | +| ------------------------------------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Enable passkey entry during pairing for enhanced security. (Note: After enabling this, you will need to re-pair all previously paired hosts) | n | +| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | From f08802eaa735b87fa089b81512a941a1bcc8ca4b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 5 Jun 2023 05:04:13 +0000 Subject: [PATCH 111/134] fix(boards): Proper i2c pinctrl for BlueMicro840 * Use the proper pin assignmets after the move to pinctrl for the Zephyr 3.2 migration. --- .../arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi index 15c48509..868d3c27 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -17,22 +17,22 @@ uart0_sleep: uart0_sleep { group1 { psels = , - ; + ; low-power-enable; }; }; i2c0_default: i2c0_default { group1 { - psels = , - ; + psels = , + ; }; }; i2c0_sleep: i2c0_sleep { group1 { - psels = , - ; + psels = , + ; low-power-enable; }; }; From 5d9ae8fffa869f36e3e0911bed92d41ed8640826 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 17 Jun 2022 17:44:31 -0400 Subject: [PATCH 112/134] feat(split): allow central to connect to multiple peripherals --- app/include/zmk/ble.h | 6 +- app/src/ble.c | 54 ++++++++---- app/src/split/bluetooth/Kconfig | 4 + app/src/split/bluetooth/central.c | 138 ++++++++++++++++++------------ 4 files changed, 130 insertions(+), 72 deletions(-) diff --git a/app/include/zmk/ble.h b/app/include/zmk/ble.h index 1c84777d..435fde49 100644 --- a/app/include/zmk/ble.h +++ b/app/include/zmk/ble.h @@ -14,8 +14,8 @@ IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)) #if ZMK_BLE_IS_CENTRAL -#define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT 1 +#define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS) +#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS #else #define ZMK_BLE_PROFILE_COUNT CONFIG_BT_MAX_PAIRED #endif @@ -34,5 +34,5 @@ char *zmk_ble_active_profile_name(); int zmk_ble_unpair_all(); #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -void zmk_ble_set_peripheral_addr(bt_addr_le_t *addr); +int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr); #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ diff --git a/app/src/ble.c b/app/src/ble.c index 383a727d..ff82f3cf 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -47,12 +47,6 @@ RING_BUF_DECLARE(passkey_entries, PASSKEY_DIGITS); #endif /* IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) */ -#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -#define PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#else -#define PROFILE_COUNT CONFIG_BT_MAX_PAIRED -#endif - enum advertising_type { ZMK_ADV_NONE, ZMK_ADV_DIR, @@ -84,7 +78,7 @@ static const struct bt_data zmk_ble_ad[] = { #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -static bt_addr_le_t peripheral_addr; +static bt_addr_le_t peripheral_addrs[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ @@ -283,9 +277,34 @@ char *zmk_ble_active_profile_name() { return profiles[active_profile].name; } #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -void zmk_ble_set_peripheral_addr(bt_addr_le_t *addr) { - memcpy(&peripheral_addr, addr, sizeof(bt_addr_le_t)); - settings_save_one("ble/peripheral_address", addr, sizeof(bt_addr_le_t)); +int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { + // If the address is recognized and already stored in settings, return + // index and no additional action is necessary. + if (!bt_addr_le_cmp(&peripheral_addrs[i], addr)) { + return i; + } + + // If the peripheral address slot is open, store new peripheral in the + // slot and return index. This compares against BT_ADDR_LE_ANY as that + // is the zero value. + if (!bt_addr_le_cmp(&peripheral_addrs[i], BT_ADDR_LE_ANY)) { + char addr_str[BT_ADDR_LE_STR_LEN]; + bt_addr_le_to_str(addr, addr_str, sizeof(addr_str)); + LOG_DBG("Storing peripheral %s in slot %d", addr_str, i); + bt_addr_le_copy(&peripheral_addrs[i], addr); + + char setting_name[32]; + sprintf(setting_name, "ble/peripheral_addresses/%d", i); + settings_save_one(setting_name, addr, sizeof(bt_addr_le_t)); + + return i; + } + } + + // The peripheral does not match a known peripheral and there is no + // available slot. + return -ENOMEM; } #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ @@ -340,15 +359,20 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c } } #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - else if (settings_name_steq(name, "peripheral_address", &next) && !next) { + else if (settings_name_steq(name, "peripheral_addresses", &next) && next) { if (len != sizeof(bt_addr_le_t)) { return -EINVAL; } - int err = read_cb(cb_arg, &peripheral_addr, sizeof(bt_addr_le_t)); - if (err <= 0) { - LOG_ERR("Failed to handle peripheral address from settings (err %d)", err); - return err; + int i = atoi(next); + if (i < 0 || i >= ZMK_SPLIT_BLE_PERIPHERAL_COUNT) { + LOG_ERR("Failed to store peripheral address in memory"); + } else { + int err = read_cb(cb_arg, &peripheral_addrs[i], sizeof(bt_addr_le_t)); + if (err <= 0) { + LOG_ERR("Failed to handle peripheral address from settings (err %d)", err); + return err; + } } } #endif diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index 005d75fd..e2c8d5c3 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -17,6 +17,10 @@ config ZMK_SPLIT_ROLE_CENTRAL if ZMK_SPLIT_ROLE_CENTRAL +config ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS + int "Number of peripherals that will connect to the central." + default 1 + config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE int "Max number of key position state events to queue when received from peripherals" default 5 diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index a7c0d8a9..53e61be6 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -26,7 +26,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -static int start_scan(void); +static int start_scanning(void); #define POSITION_STATE_DATA_LEN 16 @@ -49,6 +49,8 @@ struct peripheral_slot { static struct peripheral_slot peripherals[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; +static bool is_scanning = false; + static const struct bt_uuid_128 split_service_uuid = BT_UUID_INIT_128(ZMK_SPLIT_BT_SERVICE_UUID); K_MSGQ_DEFINE(peripheral_event_msgq, sizeof(struct zmk_position_state_changed), @@ -130,8 +132,9 @@ int release_peripheral_slot(int index) { return 0; } -int reserve_peripheral_slot() { - for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { +int reserve_peripheral_slot(const bt_addr_le_t *addr) { + int i = zmk_ble_put_peripheral_addr(addr); + if (i >= 0) { if (peripherals[i].state == PERIPHERAL_SLOT_STATE_OPEN) { // Be sure the slot is fully reinitialized. release_peripheral_slot(i); @@ -344,9 +347,54 @@ static void split_central_process_connection(struct bt_conn *conn) { LOG_DBG("New connection params: Interval: %d, Latency: %d, PHY: %d", info.le.interval, info.le.latency, info.le.phy->rx_phy); + + // Restart scanning if necessary. + start_scanning(); } -static bool split_central_eir_found(struct bt_data *data, void *user_data) { +static int stop_scanning() { + LOG_DBG("Stopping peripheral scanning"); + is_scanning = false; + + int err = bt_le_scan_stop(); + if (err < 0) { + LOG_ERR("Stop LE scan failed (err %d)", err); + return err; + } + + return 0; +} + +static bool split_central_eir_found(const bt_addr_le_t *addr) { + LOG_DBG("Found the split service"); + + // Stop scanning so we can connect to the peripheral device. + int err = stop_scanning(); + if (err < 0) { + return false; + } + + int slot_idx = reserve_peripheral_slot(addr); + if (slot_idx < 0) { + LOG_ERR("Failed to reserve peripheral slot (err %d)", slot_idx); + return false; + } + + struct peripheral_slot *slot = &peripherals[slot_idx]; + + LOG_DBG("Initiating new connnection"); + struct bt_le_conn_param *param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); + if (err < 0) { + LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, BT_HCI_OP_LE_CREATE_CONN); + release_peripheral_slot(slot_idx); + start_scanning(); + } + + return false; +} + +static bool split_central_eir_parse(struct bt_data *data, void *user_data) { bt_addr_le_t *addr = user_data; int i; @@ -361,9 +409,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { } for (i = 0; i < data->data_len; i += 16) { - struct bt_le_conn_param *param; struct bt_uuid_128 uuid; - int err; if (!bt_uuid_create(&uuid.uuid, &data->data[i], 16)) { LOG_ERR("Unable to load UUID"); @@ -381,46 +427,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { continue; } - LOG_DBG("Found the split service"); - - zmk_ble_set_peripheral_addr(addr); - - err = bt_le_scan_stop(); - if (err) { - LOG_ERR("Stop LE scan failed (err %d)", err); - continue; - } - - uint8_t slot_idx = reserve_peripheral_slot(); - if (slot_idx < 0) { - LOG_ERR("Faild to reserve peripheral slot (err %d)", slot_idx); - continue; - } - - struct peripheral_slot *slot = &peripherals[slot_idx]; - - slot->conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr); - if (slot->conn) { - LOG_DBG("Found existing connection"); - split_central_process_connection(slot->conn); - err = bt_conn_le_phy_update(slot->conn, BT_CONN_LE_PHY_PARAM_2M); - if (err) { - LOG_ERR("Update phy conn failed (err %d)", err); - } - } else { - param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); - - LOG_DBG("Initiating new connnection"); - - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); - if (err) { - LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, - BT_HCI_OP_LE_CREATE_CONN); - start_scan(); - } - } - - return false; + return split_central_eir_found(addr); } } @@ -436,15 +443,34 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui /* We're only interested in connectable events */ if (type == BT_GAP_ADV_TYPE_ADV_IND || type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { - bt_data_parse(ad, split_central_eir_found, (void *)addr); + bt_data_parse(ad, split_central_eir_parse, (void *)addr); } } -static int start_scan(void) { - int err; +static int start_scanning(void) { + // No action is necessary if central is already scanning. + if (is_scanning) { + LOG_DBG("Scanning already running"); + return 0; + } - err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, split_central_device_found); - if (err) { + // If all the devices are connected, there is no need to scan. + bool has_unconnected = false; + for (int i = 0; i < CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS; i++) { + if (peripherals[i].conn == NULL) { + has_unconnected = true; + break; + } + } + if (!has_unconnected) { + LOG_DBG("All devices are connected, scanning is unnecessary"); + return 0; + } + + // Start scanning otherwise. + is_scanning = true; + int err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, split_central_device_found); + if (err < 0) { LOG_ERR("Scanning failed to start (err %d)", err); return err; } @@ -471,7 +497,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { release_peripheral_slot_for_conn(conn); - start_scan(); + start_scanning(); return; } @@ -495,7 +521,7 @@ static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { return; } - start_scan(); + start_scanning(); } static struct bt_conn_cb conn_callbacks = { @@ -527,6 +553,10 @@ void split_central_split_run_callback(struct k_work *work) { LOG_ERR("Source not connected"); continue; } + if (!peripherals[payload_wrapper.source].run_behavior_handle) { + LOG_ERR("Run behavior handle not found"); + continue; + } int err = bt_gatt_write_without_response( peripherals[payload_wrapper.source].conn, @@ -590,7 +620,7 @@ int zmk_split_bt_central_init(const struct device *_arg) { CONFIG_ZMK_BLE_THREAD_PRIORITY, NULL); bt_conn_cb_register(&conn_callbacks); - return start_scan(); + return start_scanning(); } SYS_INIT(zmk_split_bt_central_init, APPLICATION, CONFIG_ZMK_BLE_INIT_PRIORITY); From a5c57fa224ba410100dde4e64222505bfb2b89ea Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Tue, 6 Jun 2023 13:22:39 +0800 Subject: [PATCH 113/134] feat(docs): Add an example for combining just modifiers (#1826) Co-authored-by: Cem Aksoylar --- docs/docs/codes/modifiers.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/codes/modifiers.mdx b/docs/docs/codes/modifiers.mdx index 483e34af..db88ee92 100644 --- a/docs/docs/codes/modifiers.mdx +++ b/docs/docs/codes/modifiers.mdx @@ -38,6 +38,8 @@ These functions take the form: `XX(code)` - `&kp LS(A)` = `LEFT_SHIFT`+`A` (a capitalized **A**). - They can be combined: - `&kp LC(RA(B))` = `LEFT_CONTROL`+`RIGHT_ALT`+`B` +- They can be applied to a modifier keycode to create combined modifier keys: + - `&kp LS(LALT)` = `LEFT_SHIFT` + `LEFT_ALT` - Some basic codes already include a modifier function in their definition: - `DOLLAR` = `LS(NUMBER_4)` - There are left- and right-handed versions of each modifier (also see table above): From 98524a95671fe9d819a65d1515f9bc37895efc3d Mon Sep 17 00:00:00 2001 From: kadoyau <11990327+kadoyau@users.noreply.github.com> Date: Sun, 11 Jun 2023 04:32:50 +0900 Subject: [PATCH 114/134] fix(docs): Fix INT6 keycode description --- docs/src/data/hid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index 00d48f3f..45767172 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -3477,7 +3477,7 @@ export default [ }, { names: ["INTERNATIONAL_6", "INT6", "INT_KPJPCOMMA"], - description: ", [カソマ] (International 6)", + description: ", [カンマ] (International 6)", context: "Keyboard", clarify: false, usages: [ From 9d39a87f67668b4c083e09b04adf006d6fd1385d Mon Sep 17 00:00:00 2001 From: pixls Date: Sat, 10 Jun 2023 20:49:30 -0400 Subject: [PATCH 115/134] fix(docs): Change user-setup.md order to agree with order in setup script Fixes #1281 Co-authored-by: Cem Aksoylar --- docs/docs/user-setup.md | 47 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index a2e491b8..8faa72df 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -88,36 +88,41 @@ powershell -Command "iex ((New-Object System.Net.WebClient).DownloadString('http +### Keyboard Selection + +When prompted, enter the number for the corresponding keyboard you would like to target: + +``` +Keyboard Selection: + 1) 2% Milk 19) Ferris 0.2 37) Nibble + 2) A. Dux 20) Fourier Rev. 1 38) nice!60 + 3) BAT43 21) Helix 39) Osprette + 4) BDN9 Rev2 22) Hummingbird 40) Pancake + 5) BFO-9000 23) Iris 41) Planck Rev6 + 6) Boardsource 3x4 Macropad 24) etc... +Pick an keyboard: +``` + +:::note For a keyboard not in the included list: +If you are building firmware for a new keyboard that is not included in the built-in +list of keyboards, you can choose any keyboard from the list that is similar to yours (e.g. in terms of unibody/split and [onboard controller](hardware.mdx#onboard)/[composite](hardware.mdx#composite)) to generate the repository, +and edit / add necessary files. You can follow the [new shield guide](development/new-shield.md) if you are adding support for a composite keyboard. +::: + ### MCU Board Selection +If the keyboard selected uses an onboard controller you will skip this step. When prompted, enter the number for the corresponding MCU board you would like to target: ``` MCU Board Selection: -1) nice!nano -2) QMK Proton-C -3) Quit +1) BlueMicro840 v1 5) nRF52840 M.2 Module 9) QMK Proton-C +2) Mikoto 5.20 6) nRFMicro 1.1 (flipped) 10) Seeeduino XIAO +3) nice!nano v1 7) nRFMicro 1.1/1.2 11) Seeeduino XIAO BLE +4) nice!nano v2 8) nRFMicro 1.3/1.4 12) Quit Pick an MCU board: ``` -### Keyboard Shield Selection - -:::note -If you are building firmware for a new keyboard shield that is not included in the built-in -list of shields, you can choose any shield from the list that is similar to yours to generate the repository, -and edit / add necessary files according to the [guide for adding new keyboard shield](development/new-shield.md). -::: - -When prompted, enter the number for the corresponding keyboard shield you would like to target: - -``` -Keyboard Shield Selection: -1) Kyria -2) Lily58 -3) Quit -Pick an keyboard: -``` - ### Keymap Customization At the next prompt, you have an opportunity to decide if you want the stock keymap file copied in From 0be0d0763081de0c163dd26c29752d1085381dbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 04:35:54 +0000 Subject: [PATCH 116/134] chore(deps): bump minimatch and serve-handler in /docs Bumps [minimatch](https://github.com/isaacs/minimatch) and [serve-handler](https://github.com/zeit/serve-handler). These dependencies needed to be updated together. Updates `minimatch` from 3.0.4 to 3.1.2 - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) Updates `serve-handler` from 6.1.3 to 6.1.5 - [Release notes](https://github.com/zeit/serve-handler/releases) - [Commits](https://github.com/zeit/serve-handler/compare/6.1.3...6.1.5) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect - dependency-name: serve-handler dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 3183a51c..f0cd1fc8 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -13612,31 +13612,20 @@ } }, "node_modules/serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" } }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", @@ -25765,28 +25754,20 @@ } }, "serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "requires": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" }, "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, "path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", From 9d714c0b69fee2098a010d29e534051aeca26386 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 06:47:34 +0000 Subject: [PATCH 117/134] chore(deps-dev): bump webpack from 5.80.0 to 5.86.0 in /docs Bumps [webpack](https://github.com/webpack/webpack) from 5.80.0 to 5.86.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.80.0...v5.86.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 46 +++++++++++++++++++++--------------------- docs/package.json | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index f0cd1fc8..5badb07e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -42,7 +42,7 @@ "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^5.0.4", - "webpack": "^5.80.0" + "webpack": "^5.86.0" } }, "node_modules/@algolia/autocomplete-core": { @@ -3950,9 +3950,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "peerDependencies": { "acorn": "^8" } @@ -6069,9 +6069,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -15390,9 +15390,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -15400,10 +15400,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -18899,9 +18899,9 @@ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "requires": {} }, "acorn-jsx": { @@ -20426,9 +20426,9 @@ } }, "enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -27031,9 +27031,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -27041,10 +27041,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/docs/package.json b/docs/package.json index 15d5aa38..d82e54ec 100644 --- a/docs/package.json +++ b/docs/package.json @@ -61,6 +61,6 @@ "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^5.0.4", - "webpack": "^5.80.0" + "webpack": "^5.86.0" } } From 9ff1eaeb5a5f892d17ca87c38697466fd48fc301 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 11:44:49 -0500 Subject: [PATCH 118/134] fix: Enable BT_TINYCRYPT_ECC when using HCI BT_TINYCRYPT_ECC is required for BT_SMP_SC_PAIR_ONLY to work on setups that use BT HCI like the nRF5340. --- app/Kconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 1537bd61..18ee473d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -120,6 +120,10 @@ menuconfig ZMK_BLE if ZMK_BLE +# BT_TINYCRYPT_ECC is required for BT_SMP_SC_PAIR_ONLY when using HCI +config BT_TINYCRYPT_ECC + default y if BT_HCI && !BT_CTLR + choice BT_LL_SW_LLCP_IMPL default BT_LL_SW_LLCP_LEGACY From dcf5e75fa674184d9615793882db1c3f4c4194b9 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 13:08:33 -0500 Subject: [PATCH 119/134] fix(boards): Bump nRF5340 DK I2C buffer size Increased the I2C buffer size again, since it needs to be at least 641 to support 128x64 displays. --- app/boards/nrf5340dk_nrf5340_cpuapp.overlay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay index 66d2332f..9427d9ca 100644 --- a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay @@ -6,5 +6,5 @@ &arduino_i2c { // Default buffer size is too small for use with displays. - zephyr,concat-buf-size = <512>; + zephyr,concat-buf-size = <1024>; }; From 2244bd3d81931753dfd170e804a90a487a205aa1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 1 Sep 2021 03:49:18 +0000 Subject: [PATCH 120/134] refactor(sensors): Sensor event channel data, resolution tweaks. * Refactor sensor events to include channel data, necessary for prop split encoders, and avoiding duplicate calls, to fetch channel data twice, etc. * More consistent behavior driver API. * Allow setting triggers per resolution at the behavior level optionally. --- app/Kconfig | 20 +++ app/dts/bindings/zmk,keymap-sensors.yaml | 12 +- app/include/drivers/behavior.h | 26 ++-- app/include/zmk/events/sensor_event.h | 17 ++- app/include/zmk/sensors.h | 14 ++ app/include/zmk/virtual_key_position.h | 5 + app/src/behaviors/behavior_sensor_rotate.c | 8 +- .../behaviors/behavior_sensor_rotate_common.c | 59 +++++--- .../behaviors/behavior_sensor_rotate_common.h | 16 ++- .../behaviors/behavior_sensor_rotate_var.c | 6 +- app/src/keymap.c | 25 ++-- app/src/sensors.c | 133 +++++++++++++----- 12 files changed, 258 insertions(+), 83 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 18ee473d..1766bf07 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -194,6 +194,18 @@ rsource "src/split/Kconfig" #Basic Keyboard Setup endmenu +menu "Encoders" + +config ZMK_ENCODERS_DEFAULT_TRIGGERS_PER_ROTATION + int "Default behavior triggers per rotation" + help + Unless overridden for a specific behavior in the keymap/devicetree, this value + determines how many times to trigger the bound behavior per full rotation. + For tactile encoders with detents, this usually should match the number of + detents per rotation of the encoder. + default 30 + +endmenu menu "Display/LED Options" rsource "src/display/Kconfig" @@ -523,6 +535,14 @@ config ZMK_WPM config SENSOR default y +if ZMK_KEYMAP_SENSORS + +config ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION + int "Default triggers per rotation" + default 20 + +endif # ZMK_KEYMAP_SENSORS + choice CBPRINTF_IMPLEMENTATION default CBPRINTF_NANO diff --git a/app/dts/bindings/zmk,keymap-sensors.yaml b/app/dts/bindings/zmk,keymap-sensors.yaml index a879684f..5282f25b 100644 --- a/app/dts/bindings/zmk,keymap-sensors.yaml +++ b/app/dts/bindings/zmk,keymap-sensors.yaml @@ -9,4 +9,14 @@ compatible: "zmk,keymap-sensors" properties: sensors: type: phandles - required: true + required: false + triggers-per-rotation: + type: int + required: false + +child-binding: + description: Per-sensor configuration settings + properties: + triggers-per-rotation: + type: int + required: false diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 380fc76f..0aa5d85e 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -12,6 +12,7 @@ #include #include #include +#include #include /** @@ -24,9 +25,10 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event); -typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); +typedef int (*behavior_sensor_keymap_binding_callback_t)( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size]); enum behavior_locality { BEHAVIOR_LOCALITY_CENTRAL, @@ -158,14 +160,15 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); +__syscall int behavior_sensor_keymap_binding_triggered( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); -static inline int -z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event) { +static inline int z_impl_behavior_sensor_keymap_binding_triggered( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -178,7 +181,8 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, event); + return api->sensor_binding_triggered(binding, event, sensor_config, channel_data_size, + channel_data); } /** diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index 9398bcbb..5a5aa3ac 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,12 +6,21 @@ #pragma once -#include + +#include #include -#include +#include +#include + +// TODO: Move to Kconfig when we need more than one channel +#define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 + struct zmk_sensor_event { - uint8_t sensor_number; - const struct device *sensor; + uint8_t sensor_position; + + size_t channel_data_size; + struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS]; + int64_t timestamp; }; diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 9e54695f..41061127 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -6,6 +6,9 @@ #pragma once +#include + +#define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) @@ -15,3 +18,14 @@ #else #define ZMK_KEYMAP_SENSORS_LEN 0 #endif + +const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position); + +struct zmk_sensor_config { + uint16_t triggers_per_rotation; +}; + +struct zmk_sensor_channel_data { + enum sensor_channel channel; + struct sensor_value value; +}; diff --git a/app/include/zmk/virtual_key_position.h b/app/include/zmk/virtual_key_position.h index 48deee5c..b8f20683 100644 --- a/app/include/zmk/virtual_key_position.h +++ b/app/include/zmk/virtual_key_position.h @@ -14,6 +14,11 @@ */ #define ZMK_VIRTUAL_KEY_POSITION_SENSOR(index) (ZMK_KEYMAP_LEN + (index)) +/** + * Gets the sensor number from the virtual key position. + */ +#define ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(vkp) ((vkp)-ZMK_KEYMAP_LEN) + /** * Gets the virtual key position to use for the combo with the given index. */ diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index e12278bb..86846d5b 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -33,8 +33,10 @@ static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; .tap_ms = DT_INST_PROP_OR(n, tap_ms, 5), \ .override_params = false, \ }; \ - DEVICE_DT_INST_DEFINE( \ - n, behavior_sensor_rotate_init, NULL, NULL, &behavior_sensor_rotate_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_driver_api); + static struct behavior_sensor_rotate_data behavior_sensor_rotate_data_##n = {}; \ + DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_init, NULL, &behavior_sensor_rotate_data_##n, \ + &behavior_sensor_rotate_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_sensor_rotate_driver_api); DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_INST) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index bd31170e..99e4e019 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -5,48 +5,75 @@ #include #include +#include #include "behavior_sensor_rotate_common.h" LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event) { + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_sensor_rotate_config *cfg = dev->config; + struct behavior_sensor_rotate_data *data = dev->data; - struct sensor_value value; + const struct sensor_value value = channel_data[0].value; + int triggers; + int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); - const int err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); + // Some funky special casing for "old encoder behavior" where ticks where reported in val2 only, + // instead of rotational degrees in val1. + // REMOVE ME: Remove after a grace period of old ec11 sensor behavior + if (value.val1 == 0) { + triggers = value.val2; + } else { + struct sensor_value remainder = data->remainder[sensor_position]; - if (err < 0) { - LOG_WRN("Failed to get sensor rotation value: %d", err); - return err; + remainder.val1 += value.val1; + remainder.val2 += value.val2; + + if (remainder.val2 >= 1000000 || remainder.val2 <= 1000000) { + remainder.val1 += remainder.val2 / 1000000; + remainder.val2 %= 1000000; + } + + int trigger_degrees = 360 / sensor_config->triggers_per_rotation; + triggers = remainder.val1 / trigger_degrees; + remainder.val1 %= trigger_degrees; + + data->remainder[sensor_position] = remainder; } + LOG_DBG( + "val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X", + value.val1, value.val2, data->remainder[sensor_position].val1, + data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + struct zmk_behavior_binding triggered_binding; - switch (value.val1) { - case 1: + if (triggers > 0) { triggered_binding = cfg->cw_binding; if (cfg->override_params) { triggered_binding.param1 = binding->param1; } - break; - case -1: + } else if (triggers < 0) { + triggers = -triggers; triggered_binding = cfg->ccw_binding; if (cfg->override_params) { triggered_binding.param1 = binding->param2; } - break; - default: - return -ENOTSUP; + } else { + return 0; } LOG_DBG("Sensor binding: %s", binding->behavior_dev); - zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); - zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + for (int i = 0; i < triggers; i++) { + zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); + zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + } return ZMK_BEHAVIOR_OPAQUE; } diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index 2d58218d..eab443a3 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -1,5 +1,11 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ #include +#include struct behavior_sensor_rotate_config { struct zmk_behavior_binding cw_binding; @@ -8,6 +14,12 @@ struct behavior_sensor_rotate_config { bool override_params; }; +struct behavior_sensor_rotate_data { + struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN]; +}; + int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); \ No newline at end of file + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index a82267a5..95bb9961 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -24,8 +24,10 @@ static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; .tap_ms = DT_INST_PROP(n, tap_ms), \ .override_params = true, \ }; \ + static struct behavior_sensor_rotate_data behavior_sensor_rotate_var_data_##n = {}; \ DEVICE_DT_INST_DEFINE( \ - n, behavior_sensor_rotate_var_init, NULL, NULL, &behavior_sensor_rotate_var_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_var_driver_api); + n, behavior_sensor_rotate_var_init, NULL, &behavior_sensor_rotate_var_data_##n, \ + &behavior_sensor_rotate_var_config_##n, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_sensor_rotate_var_driver_api); DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_VAR_INST) diff --git a/app/src/keymap.c b/app/src/keymap.c index da25fc09..16543d37 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,27 +252,34 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sensor, - int64_t timestamp) { +int zmk_keymap_sensor_triggered( + uint8_t sensor_position, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size], int64_t timestamp) { for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { if (zmk_keymap_layer_active(layer)) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_number]; + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; const struct device *behavior; int ret; - LOG_DBG("layer: %d sensor_number: %d, binding name: %s", layer, sensor_number, + LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, binding->behavior_dev); behavior = device_get_binding(binding->behavior_dev); if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_number, layer); + LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); continue; } struct zmk_behavior_binding_event event = { - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number), .timestamp = timestamp}; - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, event); + .layer = layer, + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .timestamp = timestamp, + }; + + ret = behavior_sensor_keymap_binding_triggered( + binding, event, zmk_sensors_get_config_at_position(sensor_position), + channel_data_size, channel_data); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); @@ -301,8 +308,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_triggered(sensor_ev->sensor_number, sensor_ev->sensor, - sensor_ev->timestamp); + return zmk_keymap_sensor_triggered(sensor_ev->sensor_position, sensor_ev->channel_data_size, + sensor_ev->channel_data, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/sensors.c b/app/src/sensors.c index 1b92147f..5f41c4f2 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -18,65 +18,128 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS -struct sensors_data_item { - uint8_t sensor_number; +struct sensors_item_cfg { + uint8_t sensor_position; + const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; }; -#define _SENSOR_ITEM(node) \ +#define _SENSOR_ITEM(idx, node) \ { \ - .dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION } \ + .dev = DEVICE_DT_GET_OR_NULL(node), \ + .trigger = {.type = SENSOR_TRIG_DATA_READY, .chan = SENSOR_CHAN_ROTATION}, \ + .config = &configs[idx] \ + } +#define SENSOR_ITEM(idx, _i) _SENSOR_ITEM(idx, ZMK_KEYMAP_SENSORS_BY_IDX(idx)) + +#define PLUS_ONE(n) +1 +#define ZMK_KEYMAP_SENSORS_CHILD_COUNT (0 DT_FOREACH_CHILD(ZMK_KEYMAP_SENSORS_NODE, PLUS_ONE)) +#define SENSOR_CHILD_ITEM(node) \ + { \ + .triggers_per_rotation = \ + DT_PROP_OR(node, triggers_per_rotation, \ + DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ + CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION)) \ + } +#define SENSOR_CHILD_DEFAULTS(idx, arg) \ + { .triggers_per_rotation = DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, 20) } + +static struct zmk_sensor_config configs[] = { +#if ZMK_KEYMAP_SENSORS_CHILD_COUNT > 0 + DT_FOREACH_CHILD_SEP(ZMK_KEYMAP_SENSORS_NODE, SENSOR_CHILD_ITEM, (, )) +#else + LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_CHILD_DEFAULTS, (, ), 0) +#endif +}; + +static struct sensors_item_cfg sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; + +static ATOMIC_DEFINE(pending_sensors, ZMK_KEYMAP_SENSORS_LEN); + +const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position) { + if (sensor_position > ARRAY_SIZE(configs)) { + return NULL; } -#define SENSOR_ITEM(idx, _node) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ({})) + return &configs[sensor_position]; +} -static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; - -static void zmk_sensors_trigger_handler(const struct device *dev, - const struct sensor_trigger *trigger) { +static void trigger_sensor_data_for_position(uint32_t sensor_position) { int err; - const struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); + const struct sensors_item_cfg *item = &sensors[sensor_position]; - LOG_DBG("sensor %d", item->sensor_number); - - err = sensor_sample_fetch(dev); + err = sensor_sample_fetch(item->dev); if (err) { LOG_WRN("Failed to fetch sample from device %d", err); return; } - ZMK_EVENT_RAISE(new_zmk_sensor_event((struct zmk_sensor_event){ - .sensor_number = item->sensor_number, .sensor = dev, .timestamp = k_uptime_get()})); -} + struct sensor_value value; + err = sensor_channel_get(item->dev, item->trigger.chan, &value); -static void zmk_sensors_init_item(const char *node, uint8_t i, uint8_t abs_i) { - LOG_DBG("Init %s at index %d with sensor_number %d", node, i, abs_i); - - sensors[i].dev = device_get_binding(node); - sensors[i].sensor_number = abs_i; - - if (!sensors[i].dev) { - LOG_WRN("Failed to find device for %s", node); + if (err) { + LOG_WRN("Failed to get channel data from device %d", err); return; } - sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); + ZMK_EVENT_RAISE(new_zmk_sensor_event( + (struct zmk_sensor_event){.sensor_position = item->sensor_position, + .channel_data = {(struct zmk_sensor_channel_data){ + .value = value, .channel = item->trigger.chan}}, + .timestamp = k_uptime_get()})); } -#define _SENSOR_INIT(node) \ - zmk_sensors_init_item(DT_PROP(node, label), local_index++, absolute_index++); -#define SENSOR_INIT(idx, _i) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_INIT(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), (absolute_index++;)) +static void run_sensors_data_trigger(struct k_work *work) { + for (int i = 0; i < ARRAY_SIZE(sensors); i++) { + if (atomic_test_and_clear_bit(pending_sensors, i)) { + trigger_sensor_data_for_position(i); + } + } +} + +K_WORK_DEFINE(sensor_data_work, run_sensors_data_trigger); + +static void zmk_sensors_trigger_handler(const struct device *dev, + const struct sensor_trigger *trigger) { + const struct sensors_item_cfg *test_item = + CONTAINER_OF(trigger, struct sensors_item_cfg, trigger); + int sensor_index = test_item - sensors; + + if (sensor_index < 0 || sensor_index >= ARRAY_SIZE(sensors)) { + LOG_ERR("Invalid sensor item triggered our callback"); + return; + } + + if (k_is_in_isr()) { + atomic_set_bit(pending_sensors, sensor_index); + k_work_submit(&sensor_data_work); + } else { + trigger_sensor_data_for_position(sensor_index); + } +} + +static void zmk_sensors_init_item(uint8_t i) { + LOG_DBG("Init sensor at index %d", i); + + sensors[i].sensor_position = i; + + if (!sensors[i].dev) { + LOG_DBG("No local device for %d", i); + return; + } + + int err = sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); + if (err) { + LOG_WRN("Failed to set sensor trigger (%d)", err); + } +} + +#define SENSOR_INIT(idx, _t) zmk_sensors_init_item(idx); static int zmk_sensors_init(const struct device *_arg) { - int local_index = 0; - int absolute_index = 0; - LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, (), 0) + return 0; } From 295ed83409ab0bede761eb2e51f4e4670e4dbf08 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 2 Dec 2021 15:07:29 +0000 Subject: [PATCH 121/134] refactor(sensors): ec11 rotation sensor value in degrees. * Add new `steps` property to the `aips,ec11` binding, to make the driver properly report degrees in the rotation delta channel. * Handle old sensor values in sensor rotate behavior. --- app/drivers/sensor/ec11/Kconfig | 2 ++ app/drivers/sensor/ec11/ec11.c | 33 +++++++++++++++---- app/drivers/sensor/ec11/ec11.h | 1 + .../zephyr/dts/bindings/sensor/alps,ec11.yaml | 5 +++ app/include/zmk/events/sensor_event.h | 4 +-- app/include/zmk/sensors.h | 2 +- 6 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/drivers/sensor/ec11/Kconfig b/app/drivers/sensor/ec11/Kconfig index e86d092a..5da32728 100644 --- a/app/drivers/sensor/ec11/Kconfig +++ b/app/drivers/sensor/ec11/Kconfig @@ -3,6 +3,8 @@ menuconfig EC11 bool "EC11 Incremental Encoder Sensor" + default y + depends on DT_HAS_ALPS_EC11_ENABLED depends on GPIO help Enable driver for EC11 incremental encoder sensors. diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 7091f73e..ee8b41e7 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -16,6 +16,8 @@ #include "ec11.h" +#define FULL_ROTATION 360 + LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL); static int ec11_get_ab_state(const struct device *dev) { @@ -59,9 +61,14 @@ static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) drv_data->pulses += delta; drv_data->ab_state = val; - drv_data->ticks = drv_data->pulses / drv_cfg->resolution; - drv_data->delta = delta; - drv_data->pulses %= drv_cfg->resolution; + // TODO: Temporary code for backwards compatibility to support + // the sensor channel rotation reporting *ticks* instead of delta of degrees. + // REMOVE ME + if (drv_cfg->steps == 0) { + drv_data->ticks = drv_data->pulses / drv_cfg->resolution; + drv_data->delta = delta; + drv_data->pulses %= drv_cfg->resolution; + } return 0; } @@ -69,13 +76,26 @@ static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) static int ec11_channel_get(const struct device *dev, enum sensor_channel chan, struct sensor_value *val) { struct ec11_data *drv_data = dev->data; + const struct ec11_config *drv_cfg = dev->config; + int32_t pulses = drv_data->pulses; if (chan != SENSOR_CHAN_ROTATION) { return -ENOTSUP; } - val->val1 = drv_data->ticks; - val->val2 = drv_data->delta; + drv_data->pulses = 0; + + if (drv_cfg->steps > 0) { + val->val1 = (pulses * FULL_ROTATION) / drv_cfg->steps; + val->val2 = (pulses * FULL_ROTATION) % drv_cfg->steps; + if (val->val2 != 0) { + val->val2 *= 1000000; + val->val2 /= drv_cfg->steps; + } + } else { + val->val1 = drv_data->ticks; + val->val2 = drv_data->delta; + } return 0; } @@ -132,7 +152,8 @@ int ec11_init(const struct device *dev) { const struct ec11_config ec11_cfg_##n = { \ .a = GPIO_DT_SPEC_INST_GET(n, a_gpios), \ .b = GPIO_DT_SPEC_INST_GET(n, b_gpios), \ - COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \ + .resolution = DT_INST_PROP_OR(n, resolution, 1), \ + .steps = DT_INST_PROP_OR(n, steps, 0), \ }; \ DEVICE_DT_INST_DEFINE(n, ec11_init, NULL, &ec11_data_##n, &ec11_cfg_##n, POST_KERNEL, \ CONFIG_SENSOR_INIT_PRIORITY, &ec11_driver_api); diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 82c21572..4e2e5d26 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -14,6 +14,7 @@ struct ec11_config { const struct gpio_dt_spec a; const struct gpio_dt_spec b; + const uint16_t steps; const uint8_t resolution; }; diff --git a/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml b/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml index 5cbe77a2..3672ea30 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml @@ -18,4 +18,9 @@ properties: resolution: type: int description: Number of pulses per tick + deprecated: true + required: false + steps: + type: int + description: Number of pulses in one full rotation required: false diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index 5a5aa3ac..c5157447 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,11 +6,11 @@ #pragma once - +#include #include + #include #include -#include // TODO: Move to Kconfig when we need more than one channel #define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 41061127..06fbc63e 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) From f0f7e2081b5a4aa5bc35d7d8855b0e73e962319b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 26 May 2022 16:53:41 +0000 Subject: [PATCH 122/134] refactor(config): Select SENSOR as needed. * Don't force on SENSOR Kconfig setting unless needed based on the detected DT. --- app/Kconfig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 1766bf07..5b313eff 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -532,8 +532,11 @@ config ZMK_WPM bool "Calculate WPM" default n -config SENSOR +config ZMK_KEYMAP_SENSORS + bool "Enable Keymap Sensors support" default y + depends on DT_HAS_ZMK_KEYMAP_SENSORS_ENABLED + select SENSOR if ZMK_KEYMAP_SENSORS From 621d946d2926f28aa866947f110182726fa9ca10 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 21 May 2023 21:27:41 -0700 Subject: [PATCH 123/134] refactor(bluetooth): Bump HoG stack size. * Bump the default stack size for the HoG processing thread to avoid issues w/ some pathways. --- app/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 5b313eff..a54ad389 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -135,7 +135,7 @@ config SYSTEM_WORKQUEUE_STACK_SIZE config ZMK_BLE_THREAD_STACK_SIZE int "BLE notify thread stack size" - default 512 + default 768 config ZMK_BLE_THREAD_PRIORITY int "BLE notify thread priority" From f8aaaff556e1c43c6646ea1c1ee7faa2907cdf51 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 16 Apr 2023 08:18:57 +0000 Subject: [PATCH 124/134] refactor(shields): Updated ZMK Uno encoder config. * Move to new steps/triggers-per-rotation config. * Leverage QDEC Nordic driver when used on Nordic DK. --- .../boards/nrf52840dk_nrf52840.overlay | 24 +++++++++ app/boards/shields/zmk_uno/zmk_uno.overlay | 49 ++++++++++--------- 2 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay diff --git a/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay b/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay new file mode 100644 index 00000000..5ac7af7c --- /dev/null +++ b/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay @@ -0,0 +1,24 @@ + +/ { + // First, delete the existing basic GPIO based instance. + /delete-node/ encoder; +}; + +&pinctrl { + qdec_default: qdec_default { + group1 { + psels = , + ; + bias-pull-up; + }; + }; +}; + +// Set up the QDEC hardware based driver and give it the same label as the deleted node. +encoder: &qdec0 { + status = "okay"; + led-pre = <0>; + steps = <80>; + pinctrl-0 = <&qdec_default>; + pinctrl-names = "default"; +}; diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index 04332911..78f3b4a7 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -40,10 +40,10 @@ // Commented out until we add more powerful power domain support // external_power { - // compatible = "zmk,ext-power-generic"; - // label = "EXT_POWER"; - // init-delay-ms = <200>; - // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; // }; rgb_power { @@ -128,14 +128,14 @@ diode-direction = "col2row"; col-gpios - = <&arduino_header 10 GPIO_ACTIVE_HIGH> - , <&arduino_header 9 GPIO_ACTIVE_HIGH> - ; + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; row-gpios - = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; @@ -144,11 +144,11 @@ status = "disabled"; input-gpios - = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; @@ -157,23 +157,26 @@ toggle-mode; input-gpios - = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; encoder: encoder { label = "ENCODER"; - resolution = <4>; + steps = <80>; compatible = "alps,ec11"; - a-gpios = <&arduino_header 14 GPIO_PULL_UP>; - b-gpios = <&arduino_header 15 GPIO_PULL_UP>; + a-gpios = <&arduino_header 15 GPIO_PULL_UP>; + b-gpios = <&arduino_header 14 GPIO_PULL_UP>; }; - sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder>; + triggers-per-rotation = <20>; + left { + triggers-per-rotation = <20>; + }; }; }; From d781ec795b9d9e053ce71c30450ba2b979eab43b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 18 Apr 2023 07:14:18 +0000 Subject: [PATCH 125/134] refactor(bluetooth): Add battery reporting config. * Add dedicated battery reporting Kconfig that is `imply`d by enabling ZMK_BLE. --- app/CMakeLists.txt | 4 ++-- app/Kconfig | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index a647e883..ea3b8f73 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -77,8 +77,8 @@ endif() target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/behaviors/behavior_rgb_underglow.c) target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/behaviors/behavior_backlight.c) -target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/events/battery_state_changed.c) -target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/battery.c) +target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/events/battery_state_changed.c) +target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/battery.c) target_sources_ifdef(CONFIG_ZMK_SPLIT app PRIVATE src/events/split_peripheral_status_changed.c) add_subdirectory(src/split) diff --git a/app/Kconfig b/app/Kconfig index a54ad389..9c0606b0 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -114,9 +114,9 @@ menuconfig ZMK_BLE select BT_SMP_APP_PAIRING_ACCEPT select BT_PERIPHERAL select BT_DIS - select BT_BAS select BT_SETTINGS select SETTINGS + imply ZMK_BATTERY_REPORTING if ZMK_BLE @@ -322,6 +322,12 @@ endmenu menu "Power Management" +config ZMK_BATTERY_REPORTING + bool "Battery level detection/reporting" + default n + select SENSOR + select BT_BAS if ZMK_BLE + config ZMK_IDLE_TIMEOUT int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" default 30000 From 8b29f6d34556d98df60f529e84ee66e49e6bf0c0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 4 May 2023 00:04:20 +0000 Subject: [PATCH 126/134] refactor(sensors): Split data handling from triggers. * All sensor behaviors should see sensor data, then selectively only have some trigger their behaviors. --- app/include/drivers/behavior.h | 59 ++++++++++++-- app/src/behaviors/behavior_sensor_rotate.c | 3 +- .../behaviors/behavior_sensor_rotate_common.c | 31 +++++-- .../behaviors/behavior_sensor_rotate_common.h | 13 ++- .../behaviors/behavior_sensor_rotate_var.c | 3 +- app/src/keymap.c | 81 +++++++++++-------- 6 files changed, 135 insertions(+), 55 deletions(-) diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 0aa5d85e..d7e57d02 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -23,9 +23,17 @@ * (Internal use only.) */ +enum behavior_sensor_binding_process_mode { + BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER, + BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD, +}; + typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event); -typedef int (*behavior_sensor_keymap_binding_callback_t)( +typedef int (*behavior_sensor_keymap_binding_process_callback_t)( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode); +typedef int (*behavior_sensor_keymap_binding_data_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data channel_data[channel_data_size]); @@ -41,7 +49,8 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_callback_t sensor_binding_triggered; + behavior_sensor_keymap_binding_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** * @endcond @@ -151,7 +160,7 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi } /** - * @brief Handle the a sensor keymap binding being triggered + * @brief Handle the a sensor keymap binding processing any incoming data from the sensor * @param binding Sensor keymap binding which was triggered. * @param sensor Pointer to the sensor device structure for the sensor driver instance. * @param virtual_key_position ZMK_KEYMAP_LEN + sensor number @@ -160,12 +169,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_triggered( +__syscall int behavior_sensor_keymap_binding_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data); -static inline int z_impl_behavior_sensor_keymap_binding_triggered( +static inline int z_impl_behavior_sensor_keymap_binding_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data) { @@ -177,12 +186,46 @@ static inline int z_impl_behavior_sensor_keymap_binding_triggered( const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; - if (api->sensor_binding_triggered == NULL) { + if (api->sensor_binding_data == NULL) { return -ENOTSUP; } - return api->sensor_binding_triggered(binding, event, sensor_config, channel_data_size, - channel_data); + return api->sensor_binding_data(binding, event, sensor_config, channel_data_size, channel_data); +} + +/** + * @brief Handle the keymap sensor binding being triggered after updating any local data + * @param dev Pointer to the device structure for the driver instance. + * @param param1 User parameter specified at time of behavior binding. + * @param param2 User parameter specified at time of behavior binding. + * + * @retval 0 If successful. + * @retval Negative errno code if failure. + */ +// clang-format off +__syscall int behavior_sensor_keymap_binding_process( + struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode); +// clang-format on + +static inline int +z_impl_behavior_sensor_keymap_binding_process(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode) { + const struct device *dev = device_get_binding(binding->behavior_dev); + + if (dev == NULL) { + return -EINVAL; + } + + const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; + + if (api->sensor_binding_process == NULL) { + return -ENOTSUP; + } + + return api->sensor_binding_process(binding, event, mode); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index 86846d5b..3b5bef62 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -13,7 +13,8 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { - .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 99e4e019..0a2b619d 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -11,13 +11,12 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data) { +int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); - const struct behavior_sensor_rotate_config *cfg = dev->config; struct behavior_sensor_rotate_data *data = dev->data; const struct sensor_value value = channel_data[0].value; @@ -52,6 +51,26 @@ int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *bindi value.val1, value.val2, data->remainder[sensor_position].val1, data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + data->triggers[sensor_position] = triggers; + return 0; +} + +int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode) { + const struct device *dev = device_get_binding(binding->behavior_dev); + const struct behavior_sensor_rotate_config *cfg = dev->config; + struct behavior_sensor_rotate_data *data = dev->data; + + const int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + + if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { + data->triggers[sensor_position] = 0; + return 0; + } + + int triggers = data->triggers[sensor_position]; + struct zmk_behavior_binding triggered_binding; if (triggers > 0) { triggered_binding = cfg->cw_binding; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index eab443a3..d9d4d855 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -4,6 +4,7 @@ * SPDX-License-Identifier: MIT */ +#include #include #include @@ -16,10 +17,14 @@ struct behavior_sensor_rotate_config { struct behavior_sensor_rotate_data { struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN]; + int triggers[ZMK_KEYMAP_SENSORS_LEN]; }; -int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, +int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); +int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data); \ No newline at end of file + enum behavior_sensor_binding_process_mode mode); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index 95bb9961..3c2373b0 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -13,7 +13,8 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { - .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; diff --git a/app/src/keymap.c b/app/src/keymap.c index 16543d37..c8121176 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,48 +252,59 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_triggered( - uint8_t sensor_position, size_t channel_data_size, - const struct zmk_sensor_channel_data channel_data[channel_data_size], int64_t timestamp) { - for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { - if (zmk_keymap_layer_active(layer)) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; - const struct device *behavior; - int ret; +int zmk_keymap_sensor_event(uint8_t sensor_position, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size], + int64_t timestamp) { + bool opaque_response = false; - LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, - binding->behavior_dev); + for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= 0; layer--) { + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; + const struct device *behavior; + int ret; - behavior = device_get_binding(binding->behavior_dev); + LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, + binding->behavior_dev); - if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); - continue; - } + behavior = device_get_binding(binding->behavior_dev); - struct zmk_behavior_binding_event event = { - .layer = layer, - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), - .timestamp = timestamp, - }; + if (!behavior) { + LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); + continue; + } - ret = behavior_sensor_keymap_binding_triggered( - binding, event, zmk_sensors_get_config_at_position(sensor_position), - channel_data_size, channel_data); + struct zmk_behavior_binding_event event = { + .layer = layer, + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .timestamp = timestamp, + }; - if (ret > 0) { - LOG_DBG("behavior processing to continue to next layer"); - continue; - } else if (ret < 0) { - LOG_DBG("Behavior returned error: %d", ret); - return ret; - } else { - return ret; - } + ret = behavior_sensor_keymap_binding_data( + binding, event, zmk_sensors_get_config_at_position(sensor_position), channel_data_size, + channel_data); + + if (ret > 0) { + LOG_DBG("behavior processing to continue to next layer"); + continue; + } + + enum behavior_sensor_binding_process_mode mode = + (!opaque_response && layer >= _zmk_keymap_layer_default && + zmk_keymap_layer_active(layer)) + ? BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER + : BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD; + + ret = behavior_sensor_keymap_binding_process(binding, event, mode); + + if (ret == ZMK_BEHAVIOR_OPAQUE) { + LOG_DBG("sensor event processing complete, behavior response was opaque"); + opaque_response = true; + } else if (ret < 0) { + LOG_DBG("Behavior returned error: %d", ret); + return ret; } } - return -ENOTSUP; + return 0; } #endif /* ZMK_KEYMAP_HAS_SENSORS */ @@ -308,8 +319,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_triggered(sensor_ev->sensor_position, sensor_ev->channel_data_size, - sensor_ev->channel_data, sensor_ev->timestamp); + return zmk_keymap_sensor_event(sensor_ev->sensor_position, sensor_ev->channel_data_size, + sensor_ev->channel_data, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ From 3a91b325138dfba8ede743aec28e2cdbc85d17d2 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 16 May 2023 22:27:01 -0700 Subject: [PATCH 127/134] refactor(sensors): Use "sensor index" consistently --- app/include/drivers/behavior.h | 8 ++--- app/include/zmk/events/sensor_event.h | 4 +-- app/include/zmk/sensors.h | 3 +- .../behaviors/behavior_sensor_rotate_common.c | 18 +++++----- app/src/keymap.c | 33 +++++++++---------- app/src/sensors.c | 16 ++++----- 6 files changed, 40 insertions(+), 42 deletions(-) diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index d7e57d02..bf2843bb 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -33,7 +33,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b typedef int (*behavior_sensor_keymap_binding_process_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, enum behavior_sensor_binding_process_mode mode); -typedef int (*behavior_sensor_keymap_binding_data_callback_t)( +typedef int (*behavior_sensor_keymap_binding_accept_data_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data channel_data[channel_data_size]); @@ -49,7 +49,7 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_data; behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** @@ -169,12 +169,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_data( +__syscall int behavior_sensor_keymap_binding_accept_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data); -static inline int z_impl_behavior_sensor_keymap_binding_data( +static inline int z_impl_behavior_sensor_keymap_binding_accept_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data) { diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index c5157447..f6d23ac7 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -16,12 +16,12 @@ #define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 struct zmk_sensor_event { - uint8_t sensor_position; - size_t channel_data_size; struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS]; int64_t timestamp; + + uint8_t sensor_index; }; ZMK_EVENT_DECLARE(zmk_sensor_event); \ No newline at end of file diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 06fbc63e..8ac1c283 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -8,7 +8,6 @@ #include -#define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) @@ -19,7 +18,7 @@ #define ZMK_KEYMAP_SENSORS_LEN 0 #endif -const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position); +const struct zmk_sensor_config *zmk_sensors_get_config_at_index(uint8_t sensor_index); struct zmk_sensor_config { uint16_t triggers_per_rotation; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 0a2b619d..4ccfea0e 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -21,7 +21,7 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, const struct sensor_value value = channel_data[0].value; int triggers; - int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); // Some funky special casing for "old encoder behavior" where ticks where reported in val2 only, // instead of rotational degrees in val1. @@ -29,7 +29,7 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, if (value.val1 == 0) { triggers = value.val2; } else { - struct sensor_value remainder = data->remainder[sensor_position]; + struct sensor_value remainder = data->remainder[sensor_index]; remainder.val1 += value.val1; remainder.val2 += value.val2; @@ -43,15 +43,15 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, triggers = remainder.val1 / trigger_degrees; remainder.val1 %= trigger_degrees; - data->remainder[sensor_position] = remainder; + data->remainder[sensor_index] = remainder; } LOG_DBG( "val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X", - value.val1, value.val2, data->remainder[sensor_position].val1, - data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + value.val1, value.val2, data->remainder[sensor_index].val1, + data->remainder[sensor_index].val2, triggers, binding->param1, binding->param2); - data->triggers[sensor_position] = triggers; + data->triggers[sensor_index] = triggers; return 0; } @@ -62,14 +62,14 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi const struct behavior_sensor_rotate_config *cfg = dev->config; struct behavior_sensor_rotate_data *data = dev->data; - const int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + const int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { - data->triggers[sensor_position] = 0; + data->triggers[sensor_index] = 0; return 0; } - int triggers = data->triggers[sensor_position]; + int triggers = data->triggers[sensor_index]; struct zmk_behavior_binding triggered_binding; if (triggers > 0) { diff --git a/app/src/keymap.c b/app/src/keymap.c index c8121176..020faf3f 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,38 +252,37 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_event(uint8_t sensor_position, size_t channel_data_size, - const struct zmk_sensor_channel_data channel_data[channel_data_size], - int64_t timestamp) { +int zmk_keymap_sensor_event(uint8_t sensor_index, + const struct zmk_sensor_channel_data *channel_data, + size_t channel_data_size, int64_t timestamp) { bool opaque_response = false; for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= 0; layer--) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; - const struct device *behavior; - int ret; + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_index]; - LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, + LOG_DBG("layer: %d sensor_index: %d, binding name: %s", layer, sensor_index, binding->behavior_dev); - behavior = device_get_binding(binding->behavior_dev); - + const struct device *behavior = device_get_binding(binding->behavior_dev); if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); + LOG_DBG("No behavior assigned to %d on layer %d", sensor_index, layer); continue; } struct zmk_behavior_binding_event event = { .layer = layer, - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_index), .timestamp = timestamp, }; - ret = behavior_sensor_keymap_binding_data( - binding, event, zmk_sensors_get_config_at_position(sensor_position), channel_data_size, + int ret = behavior_sensor_keymap_binding_accept_data( + binding, event, zmk_sensors_get_config_at_index(sensor_index), channel_data_size, channel_data); - if (ret > 0) { - LOG_DBG("behavior processing to continue to next layer"); + if (ret < 0) { + LOG_WRN("behavior data accept for behavior %s returned an error (%d). Processing to " + "continue to next layer", + binding->behavior_dev, ret); continue; } @@ -319,8 +318,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_event(sensor_ev->sensor_position, sensor_ev->channel_data_size, - sensor_ev->channel_data, sensor_ev->timestamp); + return zmk_keymap_sensor_event(sensor_ev->sensor_index, sensor_ev->channel_data, + sensor_ev->channel_data_size, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/sensors.c b/app/src/sensors.c index 5f41c4f2..3a34ca23 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -19,7 +19,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS struct sensors_item_cfg { - uint8_t sensor_position; + uint8_t sensor_index; const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; @@ -57,17 +57,17 @@ static struct sensors_item_cfg sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENS static ATOMIC_DEFINE(pending_sensors, ZMK_KEYMAP_SENSORS_LEN); -const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position) { - if (sensor_position > ARRAY_SIZE(configs)) { +const struct zmk_sensor_config *zmk_sensors_get_config_at_index(uint8_t sensor_index) { + if (sensor_index > ARRAY_SIZE(configs)) { return NULL; } - return &configs[sensor_position]; + return &configs[sensor_index]; } -static void trigger_sensor_data_for_position(uint32_t sensor_position) { +static void trigger_sensor_data_for_position(uint32_t sensor_index) { int err; - const struct sensors_item_cfg *item = &sensors[sensor_position]; + const struct sensors_item_cfg *item = &sensors[sensor_index]; err = sensor_sample_fetch(item->dev); if (err) { @@ -84,7 +84,7 @@ static void trigger_sensor_data_for_position(uint32_t sensor_position) { } ZMK_EVENT_RAISE(new_zmk_sensor_event( - (struct zmk_sensor_event){.sensor_position = item->sensor_position, + (struct zmk_sensor_event){.sensor_index = item->sensor_index, .channel_data = {(struct zmk_sensor_channel_data){ .value = value, .channel = item->trigger.chan}}, .timestamp = k_uptime_get()})); @@ -122,7 +122,7 @@ static void zmk_sensors_trigger_handler(const struct device *dev, static void zmk_sensors_init_item(uint8_t i) { LOG_DBG("Init sensor at index %d", i); - sensors[i].sensor_position = i; + sensors[i].sensor_index = i; if (!sensors[i].dev) { LOG_DBG("No local device for %d", i); From 753802cd79ce12d2e5d86c72ced3a4cc76fe4564 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 18 Jun 2023 05:59:31 +0000 Subject: [PATCH 128/134] fix(sensors): Clean ups based on code review. --- app/Kconfig | 17 +++++------------ app/include/drivers/behavior.h | 7 ++++--- app/src/behaviors/behavior_sensor_rotate.c | 2 +- .../behaviors/behavior_sensor_rotate_common.c | 9 ++++----- .../behaviors/behavior_sensor_rotate_common.h | 9 ++++----- app/src/behaviors/behavior_sensor_rotate_var.c | 2 +- app/src/sensors.c | 9 +++++++-- 7 files changed, 26 insertions(+), 29 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 9c0606b0..92641c14 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -194,18 +194,6 @@ rsource "src/split/Kconfig" #Basic Keyboard Setup endmenu -menu "Encoders" - -config ZMK_ENCODERS_DEFAULT_TRIGGERS_PER_ROTATION - int "Default behavior triggers per rotation" - help - Unless overridden for a specific behavior in the keymap/devicetree, this value - determines how many times to trigger the bound behavior per full rotation. - For tactile encoders with detents, this usually should match the number of - detents per rotation of the encoder. - default 30 - -endmenu menu "Display/LED Options" rsource "src/display/Kconfig" @@ -548,6 +536,11 @@ if ZMK_KEYMAP_SENSORS config ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION int "Default triggers per rotation" + help + Unless overridden for a sensor in the board/shield/devicetree, this value + determines how many times to trigger the bound behavior per full rotation. + For tactile encoders with detents, this usually should match the number of + detents per rotation of the encoder. default 20 endif # ZMK_KEYMAP_SENSORS diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index bf2843bb..066cc723 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -49,7 +49,7 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_accept_data; behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** @@ -186,11 +186,12 @@ static inline int z_impl_behavior_sensor_keymap_binding_accept_data( const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; - if (api->sensor_binding_data == NULL) { + if (api->sensor_binding_accept_data == NULL) { return -ENOTSUP; } - return api->sensor_binding_data(binding, event, sensor_config, channel_data_size, channel_data); + return api->sensor_binding_accept_data(binding, event, sensor_config, channel_data_size, + channel_data); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index 3b5bef62..822bc206 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -13,7 +13,7 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { - .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_accept_data = zmk_behavior_sensor_rotate_common_accept_data, .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 4ccfea0e..eea7bf48 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -11,11 +11,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data) { +int zmk_behavior_sensor_rotate_common_accept_data( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); struct behavior_sensor_rotate_data *data = dev->data; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index d9d4d855..d354b679 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -20,11 +20,10 @@ struct behavior_sensor_rotate_data { int triggers[ZMK_KEYMAP_SENSORS_LEN]; }; -int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data); +int zmk_behavior_sensor_rotate_common_accept_data( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, enum behavior_sensor_binding_process_mode mode); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index 3c2373b0..e6d20cab 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -13,7 +13,7 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { - .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_accept_data = zmk_behavior_sensor_rotate_common_accept_data, .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; diff --git a/app/src/sensors.c b/app/src/sensors.c index 3a34ca23..e339afe0 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -19,10 +19,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS struct sensors_item_cfg { - uint8_t sensor_index; const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; + uint8_t sensor_index; }; #define _SENSOR_ITEM(idx, node) \ @@ -43,7 +43,11 @@ struct sensors_item_cfg { CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION)) \ } #define SENSOR_CHILD_DEFAULTS(idx, arg) \ - { .triggers_per_rotation = DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, 20) } + { \ + .triggers_per_rotation = \ + DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ + CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION) \ + } static struct zmk_sensor_config configs[] = { #if ZMK_KEYMAP_SENSORS_CHILD_COUNT > 0 @@ -85,6 +89,7 @@ static void trigger_sensor_data_for_position(uint32_t sensor_index) { ZMK_EVENT_RAISE(new_zmk_sensor_event( (struct zmk_sensor_event){.sensor_index = item->sensor_index, + .channel_data_size = 1, .channel_data = {(struct zmk_sensor_channel_data){ .value = value, .channel = item->trigger.chan}}, .timestamp = k_uptime_get()})); From 5763558a02154ab599775c770fcf954931816e52 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 30 May 2023 02:38:28 +0000 Subject: [PATCH 129/134] feat(blog): Add post about sensor refactor. * Document changed configuration, support for other Zephyr drivers, next steps. Co-authored-by: Cem Aksoylar --- docs/blog/2023-06-18-encoder-refactors.md | 119 ++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 docs/blog/2023-06-18-encoder-refactors.md diff --git a/docs/blog/2023-06-18-encoder-refactors.md b/docs/blog/2023-06-18-encoder-refactors.md new file mode 100644 index 00000000..26f9cee8 --- /dev/null +++ b/docs/blog/2023-06-18-encoder-refactors.md @@ -0,0 +1,119 @@ +--- +title: "Major Encoder Refactor" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [firmware, zephyr, sensors, encoders] +--- + +Today, we merged a significant change to the low level sensor code that is used to support encoders. In particular, +this paves the way for completing the work on supporting split peripheral sensors/encoders, and other future sensors +like pointing devices. + +As part of the work, backwards compatibility for existing shields has been retained, but only for a grace period to allow out-of-tree shields to move to the new approach for encoders. + +Special thanks to [joelspadin] for the _thorough_ code review and testing throughout the development of the refactor. + +## Summary of Changes + +The following items have been merged: + +1. Split configuration of hardware details, and behavior configuration to allow more flexible functionality of sensors/encoders, in particular linear encoders that lack detents/"clicks" as they rotate. +2. Support for upstream Zephyr sensor drivers, including the NRFX QDEC driver that can be used on nRF52 based keyboards. +3. Sensor data handling changes that pave the way for split sensor handling easily. + +## Configuration Changes + +The major changes to configuration in the devicetree files relates to how the number of steps/triggers for a given encoder are set. In particular, the number of pulses/steps for a given encoder is configured first, allowing ZMK to determine the exact angular degrees of change that is represented by a single pulse on the data lines to that encoder. + +Once that angular degrees mapping is completed, now independently there is a configuration setting to control how many triggers of the behavior in the keymap should occur for each full rotation of the sensor. Another way to think of this is "how many degrees of rotation results in a triggering of the sensor behavior in your keymap layer". + +Splitting these two parts of the encoder configuration allows greater flexibility, and fine grained control of encoder behavior for linear encoders that don't have fixed detents. + +### Old Configuration + +Previously, an encoder configuration looked like: + +``` + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; +``` + +Here, the `resolution` property was used to indicate how many encoder pulses should trigger the sensor behavior one time. Next, the encoder is selected in the sensors node: + +``` + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +``` + +That was the entirety of the configuration for encoders. + +### New Configuration + +``` + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <80>; + }; +``` + +Here, the `steps` property is now used to indicate how many encoder pulses there are in a single complete rotation of the encoder. Next, the encoder is selected in the sensors node as before, but an additional configuration is used to indicate how many times the encoder should trigger the behavior in your keymap per rotation: + +``` + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; + }; +``` + +For tactile encoders that have detents, the `triggers-per-rotation` would match the number of detents on the encoder. For linear encoders, the value can be chosen to suit your needs. + +## Zephyr Sensor Drivers + +The configuration changes bring ZMK's code in line with how upstream Zephyr sensor drivers handle rotations. This has the added advantage of allowing us to leverage other sensor drivers. On Nordic MCUs, like nRF52840, the NRFX QDEC driver can be used, for example: + +``` +&pinctrl { + qdec_default: qdec_default { + group1 { + psels = , + ; + bias-pull-up; + }; + }; +}; + +// Set up the QDEC hardware based driver and give it the same label as the deleted node. +encoder: &qdec0 { + status = "okay"; + led-pre = <0>; + steps = <80>; + pinctrl-0 = <&qdec_default>; + pinctrl-names = "default"; +}; +``` + +The NRFX QDEC driver has the advantage of supporting optical encoders as well, and although it polls, it does so in hardware without waking the MCU core; initial basic power profiling is promising. + +## Split Sensor/Encoder Support + +In addition to the refactors for splitting the configuration, the changes merged included refactors designed to simplify and move forward with the long outstanding feature of supporting encoders on the peripheral side of split keyboards. That work is planned as a follow up. + +## Deprecation + +The old configuration will be supported for a period of one month, and then removed, giving users a grace period to complete the migration to the new separated configuration. + +[petejohanson]: https://github.com/petejohanson +[joelspadin]: https://github.com/joelspadin From e686fce4d917b708da7f2baba4115043d3f0deab Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 19 May 2023 18:41:08 -0400 Subject: [PATCH 130/134] refactor(split): allow central to define connection parameters Fixes #1614 --- app/src/split/bluetooth/Kconfig | 17 +++++++++++++++-- app/src/split/bluetooth/central.c | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index e2c8d5c3..0610b667 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -33,6 +33,18 @@ config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE int "Max number of behavior run events to queue to send to the peripheral(s)" default 5 +config ZMK_SPLIT_BLE_PREF_INT + int "Connection interval to use for split central/peripheral connection" + default 6 + +config ZMK_SPLIT_BLE_PREF_LATENCY + int "Latency to use for split central/peripheral connection" + default 30 + +config ZMK_SPLIT_BLE_PREF_TIMEOUT + int "Supervision timeout to use for split central/peripheral connection" + default 400 + endif # ZMK_SPLIT_ROLE_CENTRAL if !ZMK_SPLIT_ROLE_CENTRAL @@ -58,8 +70,9 @@ config BT_MAX_PAIRED config BT_MAX_CONN default 1 -config BT_PERIPHERAL_PREF_MAX_INT - default 6 +# Allow central to specify connection parameters. +config BT_GAP_AUTO_UPDATE_CONN_PARAMS + default n #!ZMK_SPLIT_ROLE_CENTRAL endif diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 53e61be6..147760ff 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -383,7 +383,9 @@ static bool split_central_eir_found(const bt_addr_le_t *addr) { struct peripheral_slot *slot = &peripherals[slot_idx]; LOG_DBG("Initiating new connnection"); - struct bt_le_conn_param *param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); + struct bt_le_conn_param *param = + BT_LE_CONN_PARAM(CONFIG_ZMK_SPLIT_BLE_PREF_INT, CONFIG_ZMK_SPLIT_BLE_PREF_INT, + CONFIG_ZMK_SPLIT_BLE_PREF_LATENCY, CONFIG_ZMK_SPLIT_BLE_PREF_TIMEOUT); err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); if (err < 0) { LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, BT_HCI_OP_LE_CREATE_CONN); From 805dd4a53bc9ff7fe1f7eb5c9ea332a9affbc5f9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 8 Apr 2022 15:38:46 +0000 Subject: [PATCH 131/134] feat(behaviors): Support parameterized macros. * Add two new compatibles for macros that take one or two parameters when bound in a keymap. * Use `¯o_param_1to1`, `¯o_param_1to2`, `¯o_param_2to1`, and `¯o_param_2to2` control entries in the bindings for the macro to have the next binding entry have it's values substituted. Co-authored-by: Cem Aksoylar --- app/CMakeLists.txt | 2 +- app/Kconfig.behaviors | 7 +- app/dts/behaviors/macros.dtsi | 55 ++++++++-- app/dts/bindings/behaviors/macro_base.yaml | 13 +++ .../zmk,behavior-macro-one-param.yaml | 8 ++ .../zmk,behavior-macro-two-param.yaml | 8 ++ .../behaviors/zmk,behavior-macro.yaml | 13 +-- .../bindings/macros/zmk,macro-param-1to1.yaml | 8 ++ .../bindings/macros/zmk,macro-param-1to2.yaml | 8 ++ .../bindings/macros/zmk,macro-param-2to1.yaml | 8 ++ .../bindings/macros/zmk,macro-param-2to2.yaml | 8 ++ app/src/behaviors/behavior_macro.c | 100 +++++++++++++----- .../place-holder-parameters/events.patterns | 1 + .../keycode_events.snapshot | 16 +++ .../native_posix_64.keymap | 63 +++++++++++ docs/docs/behaviors/macros.md | 40 +++++++ 16 files changed, 310 insertions(+), 48 deletions(-) create mode 100644 app/dts/bindings/behaviors/macro_base.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-1to1.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-1to2.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-2to1.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-2to2.yaml create mode 100644 app/tests/macros/place-holder-parameters/events.patterns create mode 100644 app/tests/macros/place-holder-parameters/keycode_events.snapshot create mode 100644 app/tests/macros/place-holder-parameters/native_posix_64.keymap diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index ea3b8f73..4c1c63c2 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -43,7 +43,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c) target_sources(app PRIVATE src/behaviors/behavior_caps_word.c) target_sources(app PRIVATE src/behaviors/behavior_key_repeat.c) - target_sources(app PRIVATE src/behaviors/behavior_macro.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MACRO app PRIVATE src/behaviors/behavior_macro.c) target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c) target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c) target_sources(app PRIVATE src/behaviors/behavior_outputs.c) diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors index 17850eae..9e4a82b0 100644 --- a/app/Kconfig.behaviors +++ b/app/Kconfig.behaviors @@ -21,4 +21,9 @@ config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR bool default y depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED - select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON \ No newline at end of file + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + +config ZMK_BEHAVIOR_MACRO + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_MACRO_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_ONE_PARAM_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_TWO_PARAM_ENABLED \ No newline at end of file diff --git a/app/dts/behaviors/macros.dtsi b/app/dts/behaviors/macros.dtsi index 757c046e..36b4a8d3 100644 --- a/app/dts/behaviors/macros.dtsi +++ b/app/dts/behaviors/macros.dtsi @@ -4,16 +4,33 @@ * SPDX-License-Identifier: MIT */ +#define MACRO_PLACEHOLDER 0 #define ZMK_MACRO_STRINGIFY(x) #x #define ZMK_MACRO(name,...) \ - name: name { \ - label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ - compatible = "zmk,behavior-macro"; \ - #binding-cells = <0>; \ - __VA_ARGS__ \ - }; +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro"; \ + #binding-cells = <0>; \ + __VA_ARGS__ \ +}; - / { +#define ZMK_MACRO1(name,...) \ +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro-one-param"; \ + #binding-cells = <1>; \ + __VA_ARGS__ \ +}; + +#define ZMK_MACRO2(name,...) \ +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro-two-param"; \ + #binding-cells = <2>; \ + __VA_ARGS__ \ +}; + +/ { behaviors { macro_tap: macro_control_mode_tap { compatible = "zmk,macro-control-mode-tap"; @@ -50,5 +67,29 @@ label = "MAC_WAIT_REL"; #binding-cells = <0>; }; + + macro_param_1to1: macro_param_1to1 { + compatible = "zmk,macro-param-1to1"; + label = "MAC_PARAM_1TO1"; + #binding-cells = <0>; + }; + + macro_param_1to2: macro_param_1to2 { + compatible = "zmk,macro-param-1to2"; + label = "MAC_PARAM_1TO2"; + #binding-cells = <0>; + }; + + macro_param_2to1: macro_param_2to1 { + compatible = "zmk,macro-param-2to1"; + label = "MAC_PARAM_2TO1"; + #binding-cells = <0>; + }; + + macro_param_2to2: macro_param_2to2 { + compatible = "zmk,macro-param-2to2"; + label = "MAC_PARAM_2TO2"; + #binding-cells = <0>; + }; }; }; diff --git a/app/dts/bindings/behaviors/macro_base.yaml b/app/dts/bindings/behaviors/macro_base.yaml new file mode 100644 index 00000000..236ee33d --- /dev/null +++ b/app/dts/bindings/behaviors/macro_base.yaml @@ -0,0 +1,13 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +properties: + bindings: + type: phandle-array + required: true + wait-ms: + type: int + description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. + tap-ms: + type: int + description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml new file mode 100644 index 00000000..4fe5a2fb --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Behavior + +compatible: "zmk,behavior-macro-one-param" + +include: [one_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml new file mode 100644 index 00000000..ab6e32b4 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Behavior + +compatible: "zmk,behavior-macro-two-param" + +include: [two_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml index e6f6757d..035dd943 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml @@ -5,15 +5,4 @@ description: Macro Behavior compatible: "zmk,behavior-macro" -include: zero_param.yaml - -properties: - bindings: - type: phandle-array - required: true - wait-ms: - type: int - description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. - tap-ms: - type: int - description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding +include: [zero_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/macros/zmk,macro-param-1to1.yaml b/app/dts/bindings/macros/zmk,macro-param-1to1.yaml new file mode 100644 index 00000000..ae0d54df --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-1to1.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter One Substituted Into Next Binding's First Parameter + +compatible: "zmk,macro-param-1to1" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-1to2.yaml b/app/dts/bindings/macros/zmk,macro-param-1to2.yaml new file mode 100644 index 00000000..1018526c --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-1to2.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter One Substituted Into Next Binding's Second Parameter + +compatible: "zmk,macro-param-1to2" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-2to1.yaml b/app/dts/bindings/macros/zmk,macro-param-2to1.yaml new file mode 100644 index 00000000..3ebf8fc9 --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-2to1.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter Two Substituted Into Next Binding's First Parameter + +compatible: "zmk,macro-param-2to1" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-2to2.yaml b/app/dts/bindings/macros/zmk,macro-param-2to2.yaml new file mode 100644 index 00000000..e3ebe40f --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-2to2.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter Two Substituted Into Next Binding's Second Parameter + +compatible: "zmk,macro-param-2to2" + +include: zero_param.yaml diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index e84f1fc8..c4728453 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -4,8 +4,6 @@ * SPDX-License-Identifier: MIT */ -#define DT_DRV_COMPAT zmk_behavior_macro - #include #include #include @@ -15,20 +13,22 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - enum behavior_macro_mode { MACRO_MODE_TAP, MACRO_MODE_PRESS, MACRO_MODE_RELEASE, }; +enum param_source { PARAM_SOURCE_BINDING, PARAM_SOURCE_MACRO_1ST, PARAM_SOURCE_MACRO_2ND }; + struct behavior_macro_trigger_state { uint32_t wait_ms; uint32_t tap_ms; enum behavior_macro_mode mode; uint16_t start_index; uint16_t count; + enum param_source param1_source; + enum param_source param2_source; }; struct behavior_macro_state { @@ -52,6 +52,11 @@ struct behavior_macro_config { #define WAIT_TIME DT_PROP(DT_INST(0, zmk_macro_control_wait_time), label) #define WAIT_REL DT_PROP(DT_INST(0, zmk_macro_pause_for_release), label) +#define P1TO1 DT_PROP(DT_INST(0, zmk_macro_param_1to1), label) +#define P1TO2 DT_PROP(DT_INST(0, zmk_macro_param_1to2), label) +#define P2TO1 DT_PROP(DT_INST(0, zmk_macro_param_2to1), label) +#define P2TO2 DT_PROP(DT_INST(0, zmk_macro_param_2to2), label) + #define ZM_IS_NODE_MATCH(a, b) (strcmp(a, b) == 0) #define IS_TAP_MODE(dev) ZM_IS_NODE_MATCH(dev, TAP_MODE) #define IS_PRESS_MODE(dev) ZM_IS_NODE_MATCH(dev, PRESS_MODE) @@ -61,6 +66,11 @@ struct behavior_macro_config { #define IS_WAIT_TIME(dev) ZM_IS_NODE_MATCH(dev, WAIT_TIME) #define IS_PAUSE(dev) ZM_IS_NODE_MATCH(dev, WAIT_REL) +#define IS_P1TO1(dev) ZM_IS_NODE_MATCH(dev, P1TO1) +#define IS_P1TO2(dev) ZM_IS_NODE_MATCH(dev, P1TO2) +#define IS_P2TO1(dev) ZM_IS_NODE_MATCH(dev, P2TO1) +#define IS_P2TO2(dev) ZM_IS_NODE_MATCH(dev, P2TO2) + static bool handle_control_binding(struct behavior_macro_trigger_state *state, const struct zmk_behavior_binding *binding) { if (IS_TAP_MODE(binding->behavior_dev)) { @@ -78,6 +88,18 @@ static bool handle_control_binding(struct behavior_macro_trigger_state *state, } else if (IS_WAIT_TIME(binding->behavior_dev)) { state->wait_ms = binding->param1; LOG_DBG("macro wait time set: %d", state->wait_ms); + } else if (IS_P1TO1(binding->behavior_dev)) { + state->param1_source = PARAM_SOURCE_MACRO_1ST; + LOG_DBG("macro param: 1to1"); + } else if (IS_P1TO2(binding->behavior_dev)) { + state->param2_source = PARAM_SOURCE_MACRO_1ST; + LOG_DBG("macro param: 1to2"); + } else if (IS_P2TO1(binding->behavior_dev)) { + state->param1_source = PARAM_SOURCE_MACRO_2ND; + LOG_DBG("macro param: 2to1"); + } else if (IS_P2TO2(binding->behavior_dev)) { + state->param2_source = PARAM_SOURCE_MACRO_2ND; + LOG_DBG("macro param: 2to2"); } else { return false; } @@ -110,21 +132,47 @@ static int behavior_macro_init(const struct device *dev) { return 0; }; +static uint32_t select_param(enum param_source param_source, uint32_t source_binding, + const struct zmk_behavior_binding *macro_binding) { + switch (param_source) { + case PARAM_SOURCE_MACRO_1ST: + return macro_binding->param1; + case PARAM_SOURCE_MACRO_2ND: + return macro_binding->param2; + default: + return source_binding; + } +}; + +static void replace_params(struct behavior_macro_trigger_state *state, + struct zmk_behavior_binding *binding, + const struct zmk_behavior_binding *macro_binding) { + binding->param1 = select_param(state->param1_source, binding->param1, macro_binding); + binding->param2 = select_param(state->param2_source, binding->param2, macro_binding); + + state->param1_source = PARAM_SOURCE_BINDING; + state->param2_source = PARAM_SOURCE_BINDING; +} + static void queue_macro(uint32_t position, const struct zmk_behavior_binding bindings[], - struct behavior_macro_trigger_state state) { + struct behavior_macro_trigger_state state, + const struct zmk_behavior_binding *macro_binding) { LOG_DBG("Iterating macro bindings - starting: %d, count: %d", state.start_index, state.count); for (int i = state.start_index; i < state.start_index + state.count; i++) { if (!handle_control_binding(&state, &bindings[i])) { + struct zmk_behavior_binding binding = bindings[i]; + replace_params(&state, &binding, macro_binding); + switch (state.mode) { case MACRO_MODE_TAP: - zmk_behavior_queue_add(position, bindings[i], true, state.tap_ms); - zmk_behavior_queue_add(position, bindings[i], false, state.wait_ms); + zmk_behavior_queue_add(position, binding, true, state.tap_ms); + zmk_behavior_queue_add(position, binding, false, state.wait_ms); break; case MACRO_MODE_PRESS: - zmk_behavior_queue_add(position, bindings[i], true, state.wait_ms); + zmk_behavior_queue_add(position, binding, true, state.wait_ms); break; case MACRO_MODE_RELEASE: - zmk_behavior_queue_add(position, bindings[i], false, state.wait_ms); + zmk_behavior_queue_add(position, binding, false, state.wait_ms); break; default: LOG_ERR("Unknown macro mode: %d", state.mode); @@ -145,7 +193,7 @@ static int on_macro_binding_pressed(struct zmk_behavior_binding *binding, .start_index = 0, .count = state->press_bindings_count}; - queue_macro(event.position, cfg->bindings, trigger_state); + queue_macro(event.position, cfg->bindings, trigger_state, binding); return ZMK_BEHAVIOR_OPAQUE; } @@ -156,7 +204,7 @@ static int on_macro_binding_released(struct zmk_behavior_binding *binding, const struct behavior_macro_config *cfg = dev->config; struct behavior_macro_state *state = dev->data; - queue_macro(event.position, cfg->bindings, state->release_state); + queue_macro(event.position, cfg->bindings, state->release_state, binding); return ZMK_BEHAVIOR_OPAQUE; } @@ -166,22 +214,20 @@ static const struct behavior_driver_api behavior_macro_driver_api = { .binding_released = on_macro_binding_released, }; -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) - #define TRANSFORMED_BEHAVIORS(n) \ - {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (, ), n)}, + {LISTIFY(DT_PROP_LEN(n, bindings), ZMK_KEYMAP_EXTRACT_BINDING, (, ), n)}, -#define MACRO_INST(n) \ - static struct behavior_macro_state behavior_macro_state_##n = {}; \ - static struct behavior_macro_config behavior_macro_config_##n = { \ - .default_wait_ms = DT_INST_PROP_OR(n, wait_ms, CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS), \ - .default_tap_ms = DT_INST_PROP_OR(n, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ - .count = DT_INST_PROP_LEN(n, bindings), \ - .bindings = TRANSFORMED_BEHAVIORS(n)}; \ - DEVICE_DT_INST_DEFINE(n, behavior_macro_init, NULL, &behavior_macro_state_##n, \ - &behavior_macro_config_##n, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); +#define MACRO_INST(inst) \ + static struct behavior_macro_state behavior_macro_state_##inst = {}; \ + static struct behavior_macro_config behavior_macro_config_##inst = { \ + .default_wait_ms = DT_PROP_OR(inst, wait_ms, CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS), \ + .default_tap_ms = DT_PROP_OR(inst, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ + .count = DT_PROP_LEN(inst, bindings), \ + .bindings = TRANSFORMED_BEHAVIORS(inst)}; \ + DEVICE_DT_DEFINE(inst, behavior_macro_init, NULL, &behavior_macro_state_##inst, \ + &behavior_macro_config_##inst, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); -DT_INST_FOREACH_STATUS_OKAY(MACRO_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro, MACRO_INST) +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro_one_param, MACRO_INST) +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro_two_param, MACRO_INST) diff --git a/app/tests/macros/place-holder-parameters/events.patterns b/app/tests/macros/place-holder-parameters/events.patterns new file mode 100644 index 00000000..3c9d3f83 --- /dev/null +++ b/app/tests/macros/place-holder-parameters/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode/kp/p \ No newline at end of file diff --git a/app/tests/macros/place-holder-parameters/keycode_events.snapshot b/app/tests/macros/place-holder-parameters/keycode_events.snapshot new file mode 100644 index 00000000..f198a49b --- /dev/null +++ b/app/tests/macros/place-holder-parameters/keycode_events.snapshot @@ -0,0 +1,16 @@ +kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x38 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x38 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/place-holder-parameters/native_posix_64.keymap b/app/tests/macros/place-holder-parameters/native_posix_64.keymap new file mode 100644 index 00000000..59d78b5e --- /dev/null +++ b/app/tests/macros/place-holder-parameters/native_posix_64.keymap @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +/ { + macros { + slash_macro: slash_macro { + #binding-cells = <2>; + label = "ZM_SLASH"; + compatible = "zmk,behavior-macro-two-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + ¯o_param_1to1 &kp MACRO_PLACEHOLDER + &kp SLASH + ¯o_param_2to1 &kp MACRO_PLACEHOLDER>; + }; + + to_second_macro: to_second_macro { + #binding-cells = <2>; + label = "ZMK_TO_SECOND"; + compatible = "zmk,behavior-macro-two-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + ¯o_param_1to2 &mt LSHIFT MACRO_PLACEHOLDER + ¯o_param_2to2 &mt RSHIFT MACRO_PLACEHOLDER>; + }; + + quote_letter_macro: quote_letter_macro { + #binding-cells = <1>; + label = "ZMK_QLET"; + compatible = "zmk,behavior-macro-one-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + &kp QUOT + ¯o_param_1to1 &kp MACRO_PLACEHOLDER + &kp QUOT>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &slash_macro A B "e_letter_macro B + &to_second_macro E F &kp C>; + }; + }; +}; + +&kscan { + events = ; +}; \ No newline at end of file diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 1628e0cb..40c333a9 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -49,6 +49,22 @@ For use cases involving sending a single keycode with modifiers, for instance ct with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. ::: +### Parameterized Macros + +Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: + +``` + raise_layer { + bindings = <&my_cool_macro A> + }; +``` + +When defining a parameterized macro, a different `compatible` value will be used depending on how many parameters are passed into it: + +- `zmk,behavior-macro` - a parameter that takes no parameters. +- `zmk,behavior-macro-one-param` - a parameter that takes one parameter when used. +- `zmk,behavior-macro-two-param` - a parameter that takes two parameters when used. + ### Bindings Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can @@ -67,6 +83,30 @@ bindings There are a set of special macro controls that can be included in the `bindings` list to modify the way the macro is processed. +### Parameters + +When creating a macro that takes parameter(s), there are macro controls that change when the parameters passed to the macro are used +within the macro itself. All of the controls are "one shot" and will change how the passed in parameters are used for the very next non-macro control behavior in the `bindings` list of the macro. + +For example, to pass the first parameter from the macro into a `&kp` used in the macro, you would use: + +``` +bindings + = <¯o_param_1to1> + , <&kp MACRO_PLACEHOLDER> + ; +``` + +Because `kp` takes one parameter, you can't simply make the second entry `<&kp>` in the `bindings` list. Whatever value you do pass in will be replaced when the macro is triggered, so you can put _any_ value there, e.g. `0`, `A` keycode, etc. To make it very obvious that the parameter there is not actually going to be used, you can use `MACRO_PLACEHOLDER` which is simply an alias for `0`. + +The available parameter controls are: + +- `¯o_param_1to1` - pass the first parameter of the macro into the first parameter of the next behavior in the `bindings` list. +- `¯o_param_1to2` - pass the first parameter of the macro into the second parameter of the next behavior in the `bindings` list. + +* `¯o_param_2to1` - pass the second parameter of the macro into the first parameter of the next behavior in the `bindings` list. +* `¯o_param_2to2` - pass the second parameter of the macro into the second parameter of the next behavior in the `bindings` list. + ### Binding Activation Mode Bindings in a macro are activated differently, depending on the current "activation mode" of the macro. From b259d5a22e423458b94bd1aba70fd62f327528c0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Jun 2023 22:23:06 +0000 Subject: [PATCH 132/134] fix(sensors): Sensor rotate behavior fix for layers. * Properly return transparent value when processing mode for higher disabled layers means the processing is ignored. --- app/src/behaviors/behavior_sensor_rotate_common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index eea7bf48..586cac3f 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -65,7 +65,7 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { data->triggers[sensor_index] = 0; - return 0; + return ZMK_BEHAVIOR_TRANSPARENT; } int triggers = data->triggers[sensor_index]; @@ -83,7 +83,7 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi triggered_binding.param1 = binding->param2; } } else { - return 0; + return ZMK_BEHAVIOR_TRANSPARENT; } LOG_DBG("Sensor binding: %s", binding->behavior_dev); From 3772ecb04e777ec4d592711427211cfac26a712d Mon Sep 17 00:00:00 2001 From: Kyle McCreery Date: Wed, 5 Jul 2023 12:50:19 -0400 Subject: [PATCH 133/134] fix(boards): Update pillbug_defconfig to enable pinctrl --- app/boards/arm/pillbug/pillbug_defconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/boards/arm/pillbug/pillbug_defconfig b/app/boards/arm/pillbug/pillbug_defconfig index d71d9f62..9781cf99 100644 --- a/app/boards/arm/pillbug/pillbug_defconfig +++ b/app/boards/arm/pillbug/pillbug_defconfig @@ -8,6 +8,9 @@ CONFIG_BOARD_PILLBUG=y # Enable MPU CONFIG_ARM_MPU=y +# Use pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y From bbb27ac02769c7bf5f20b76605f2b4e0f811e6e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Fri, 7 Jul 2023 01:39:08 +0800 Subject: [PATCH 134/134] feat(docs): Note that UF2 drive unmounts after flashing (#1859) Add a note about the UF2 drive that automatically unmounts itself to restart, which may surprise some new users. --- docs/docs/development/build-flash.md | 4 ++-- docs/docs/user-setup.md | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index 6f4ba84d..f57c4b5c 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -130,8 +130,8 @@ The above build commands generate a UF2 file in `build/zephyr` (or `build/left|right/zephyr` if you followed the instructions for splits) and is by default named `zmk.uf2`. If your board supports USB Flashing Format (UF2), copy that file onto the root of the USB mass storage device for your board. The -controller should flash your built firmware and automatically restart once -flashing is complete. +controller should flash your built firmware, unmount the USB storage device and +automatically restart once flashing is complete. Alternatively, if your board supports flashing and you're not developing from within a Dockerized environment, enable Device Firmware Upgrade (DFU) mode on diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 8faa72df..9d04c347 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -198,8 +198,9 @@ To flash the firmware, first put your board into bootloader mode by double click or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass -storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is -recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. +storage device. Once the flash is complete, the controller should unmount the USB storage, automatically restart and load your newly +flashed firmware. It is recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to +connect to it wirelessly. :::caution Split keyboards