├── .gitignore ├── LICENSE ├── README.md ├── case ├── framework-16-keyboard-case-bottom.stl ├── framework-16-keyboard-case-left.stl ├── framework-16-keyboard-case-right.stl └── framework-16-keyboard-case-top.stl ├── images ├── framework16keyboardv1_0.jpg ├── framework16keyboardv1_1.jpg ├── framework16keyboardv1_2.jpg ├── framework16keyboardv1_3.jpg └── framework16keyboardv1_4.jpg ├── kicad └── framework16v1 │ ├── ._framework16v1.kicad_pcb │ ├── framework16v1.kicad_pcb │ ├── framework16v1.kicad_pro │ ├── framework16v1.round-tracks-config │ ├── framework16v1.step │ └── gerber_to_order │ ├── framework16v1_270.0x104.215538mm_for_Default.zip │ ├── framework16v1_270.0x104.215538mm_for_Elecrow.zip │ ├── framework16v1_270.0x104.215538mm_for_FusionPCB.zip │ ├── framework16v1_270.0x104.215538mm_for_JLCPCB.zip │ └── framework16v1_270.0x104.215538mm_for_PCBWay.zip ├── qmk └── keyboards │ └── framework_v1 │ ├── keyboard.json │ ├── keymaps │ └── default │ │ ├── config.h │ │ └── keymap.c │ └── readme.md └── zmk └── boards └── shields └── framework_v1 ├── Kconfig.defconfig ├── Kconfig.shield ├── framework_v1.conf ├── framework_v1.keymap ├── framework_v1.overlay └── framework_v1_keypos.h /.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: https://www.kicad.org/ 2 | # Format documentation: https://kicad.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.kicad_sch-bak 10 | *-backups 11 | *.kicad_prl 12 | *.sch-bak 13 | *~ 14 | _autosave-* 15 | *.tmp 16 | *-save.pro 17 | *-save.kicad_pcb 18 | fp-info-cache 19 | ~*.lck 20 | \#auto_saved_files# 21 | 22 | # Netlist files (exported from Eeschema) 23 | *.net 24 | 25 | # Autorouter files (exported from Pcbnew) 26 | *.dsn 27 | *.ses 28 | 29 | # Exported BOM files 30 | *.xml 31 | *.csv -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 sommerper 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Framework 16 Keyboard v1 2 | 3 | ![Keyboard Image](images/framework16keyboardv1_0.jpg) 4 | 5 | Here's an ortholinear split keyboard that fits in your Framework 16 instead of the default keyboard. 6 | 7 | It's using Kaihl Choc switches and the case has an angle of 5 degrees so it will not allow you to close the laptop while using it. 8 | 9 | ## ZMK and QMK 10 | 11 | There some settings for zmk and qmk to get you started with the correct pin layout. The ZMK config is based on [Urob's config](https://github.com/urob/zmk-config) 12 | 13 | Any Pro Micro compatible controller should work. The nice!nano v2 is used in the image, and I have also connected an RP2040 without any problems. 14 | 15 | ## 3D Print Files 16 | - Left and Right are for the laptop. They should have a tight fit without having to squeeze them in between the other components. 17 | - Bottom is for your desk so you can choose to put the pcb on your desk as well. It's possible to fit this on the build plate of a standard Prusa mk3s if you put it diagonally. 18 | - Top is for travel protection. It fits on top of the Bottom case with the keyboard inside. 19 | 20 | ![Desk print](images/framework16keyboardv1_4.jpg) 21 | 22 | ## ⚠️ Disclaimer 23 | 24 | These PCB files are provided **as-is**, without any warranty or guarantee of functionality or safety. Use them at your own risk. I am not responsible for any damage, injury, or loss resulting from the use of these files. 25 | -------------------------------------------------------------------------------- /case/framework-16-keyboard-case-top.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/case/framework-16-keyboard-case-top.stl -------------------------------------------------------------------------------- /images/framework16keyboardv1_0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/images/framework16keyboardv1_0.jpg -------------------------------------------------------------------------------- /images/framework16keyboardv1_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/images/framework16keyboardv1_1.jpg -------------------------------------------------------------------------------- /images/framework16keyboardv1_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/images/framework16keyboardv1_2.jpg -------------------------------------------------------------------------------- /images/framework16keyboardv1_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/images/framework16keyboardv1_3.jpg -------------------------------------------------------------------------------- /images/framework16keyboardv1_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/images/framework16keyboardv1_4.jpg -------------------------------------------------------------------------------- /kicad/framework16v1/._framework16v1.kicad_pcb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/kicad/framework16v1/._framework16v1.kicad_pcb -------------------------------------------------------------------------------- /kicad/framework16v1/framework16v1.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "apply_defaults_to_fp_fields": false, 7 | "apply_defaults_to_fp_shapes": false, 8 | "apply_defaults_to_fp_text": false, 9 | "board_outline_line_width": 0.05, 10 | "copper_line_width": 0.2, 11 | "copper_text_italic": false, 12 | "copper_text_size_h": 1.5, 13 | "copper_text_size_v": 1.5, 14 | "copper_text_thickness": 0.3, 15 | "copper_text_upright": false, 16 | "courtyard_line_width": 0.05, 17 | "dimension_precision": 4, 18 | "dimension_units": 3, 19 | "dimensions": { 20 | "arrow_length": 1270000, 21 | "extension_offset": 500000, 22 | "keep_text_aligned": true, 23 | "suppress_zeroes": true, 24 | "text_position": 0, 25 | "units_format": 0 26 | }, 27 | "fab_line_width": 0.1, 28 | "fab_text_italic": false, 29 | "fab_text_size_h": 1.0, 30 | "fab_text_size_v": 1.0, 31 | "fab_text_thickness": 0.15, 32 | "fab_text_upright": false, 33 | "other_line_width": 0.1, 34 | "other_text_italic": false, 35 | "other_text_size_h": 1.0, 36 | "other_text_size_v": 1.0, 37 | "other_text_thickness": 0.15, 38 | "other_text_upright": false, 39 | "pads": { 40 | "drill": 0.762, 41 | "height": 1.524, 42 | "width": 1.524 43 | }, 44 | "silk_line_width": 0.12, 45 | "silk_text_italic": false, 46 | "silk_text_size_h": 1.0, 47 | "silk_text_size_v": 1.0, 48 | "silk_text_thickness": 0.15, 49 | "silk_text_upright": false, 50 | "zones": { 51 | "min_clearance": 0.508 52 | } 53 | }, 54 | "diff_pair_dimensions": [], 55 | "drc_exclusions": [], 56 | "meta": { 57 | "filename": "board_design_settings.json", 58 | "version": 2 59 | }, 60 | "rule_severities": { 61 | "annular_width": "error", 62 | "clearance": "error", 63 | "connection_width": "warning", 64 | "copper_edge_clearance": "error", 65 | "copper_sliver": "warning", 66 | "courtyards_overlap": "error", 67 | "creepage": "error", 68 | "diff_pair_gap_out_of_range": "error", 69 | "diff_pair_uncoupled_length_too_long": "error", 70 | "drill_out_of_range": "error", 71 | "duplicate_footprints": "warning", 72 | "extra_footprint": "warning", 73 | "footprint": "error", 74 | "footprint_filters_mismatch": "ignore", 75 | "footprint_symbol_mismatch": "warning", 76 | "footprint_type_mismatch": "ignore", 77 | "hole_clearance": "error", 78 | "hole_to_hole": "warning", 79 | "holes_co_located": "warning", 80 | "invalid_outline": "error", 81 | "isolated_copper": "warning", 82 | "item_on_disabled_layer": "error", 83 | "items_not_allowed": "error", 84 | "length_out_of_range": "error", 85 | "lib_footprint_issues": "warning", 86 | "lib_footprint_mismatch": "warning", 87 | "malformed_courtyard": "error", 88 | "microvia_drill_out_of_range": "error", 89 | "mirrored_text_on_front_layer": "warning", 90 | "missing_courtyard": "ignore", 91 | "missing_footprint": "warning", 92 | "net_conflict": "warning", 93 | "nonmirrored_text_on_back_layer": "warning", 94 | "npth_inside_courtyard": "ignore", 95 | "padstack": "warning", 96 | "pth_inside_courtyard": "ignore", 97 | "shorting_items": "error", 98 | "silk_edge_clearance": "warning", 99 | "silk_over_copper": "warning", 100 | "silk_overlap": "warning", 101 | "skew_out_of_range": "error", 102 | "solder_mask_bridge": "error", 103 | "starved_thermal": "error", 104 | "text_height": "warning", 105 | "text_thickness": "warning", 106 | "through_hole_pad_without_hole": "error", 107 | "too_many_vias": "error", 108 | "track_angle": "error", 109 | "track_dangling": "warning", 110 | "track_segment_length": "error", 111 | "track_width": "error", 112 | "tracks_crossing": "error", 113 | "unconnected_items": "error", 114 | "unresolved_variable": "error", 115 | "via_dangling": "warning", 116 | "zones_intersect": "error" 117 | }, 118 | "rules": { 119 | "max_error": 0.005, 120 | "min_clearance": 0.0, 121 | "min_connection": 0.0, 122 | "min_copper_edge_clearance": 0.075, 123 | "min_groove_width": 0.0, 124 | "min_hole_clearance": 0.25, 125 | "min_hole_to_hole": 0.25, 126 | "min_microvia_diameter": 0.2, 127 | "min_microvia_drill": 0.1, 128 | "min_resolved_spokes": 2, 129 | "min_silk_clearance": 0.0, 130 | "min_text_height": 0.8, 131 | "min_text_thickness": 0.08, 132 | "min_through_hole_diameter": 0.3, 133 | "min_track_width": 0.2, 134 | "min_via_annular_width": 0.1, 135 | "min_via_diameter": 0.4, 136 | "solder_mask_to_copper_clearance": 0.0, 137 | "use_height_for_length_calcs": true 138 | }, 139 | "teardrop_options": [ 140 | { 141 | "td_onpthpad": true, 142 | "td_onroundshapesonly": false, 143 | "td_onsmdpad": true, 144 | "td_ontrackend": false, 145 | "td_onvia": true 146 | } 147 | ], 148 | "teardrop_parameters": [ 149 | { 150 | "td_allow_use_two_tracks": true, 151 | "td_curve_segcount": 0, 152 | "td_height_ratio": 1.0, 153 | "td_length_ratio": 0.5, 154 | "td_maxheight": 2.0, 155 | "td_maxlen": 1.0, 156 | "td_on_pad_in_zone": false, 157 | "td_target_name": "td_round_shape", 158 | "td_width_to_size_filter_ratio": 0.9 159 | }, 160 | { 161 | "td_allow_use_two_tracks": true, 162 | "td_curve_segcount": 0, 163 | "td_height_ratio": 1.0, 164 | "td_length_ratio": 0.5, 165 | "td_maxheight": 2.0, 166 | "td_maxlen": 1.0, 167 | "td_on_pad_in_zone": false, 168 | "td_target_name": "td_rect_shape", 169 | "td_width_to_size_filter_ratio": 0.9 170 | }, 171 | { 172 | "td_allow_use_two_tracks": true, 173 | "td_curve_segcount": 0, 174 | "td_height_ratio": 1.0, 175 | "td_length_ratio": 0.5, 176 | "td_maxheight": 2.0, 177 | "td_maxlen": 1.0, 178 | "td_on_pad_in_zone": false, 179 | "td_target_name": "td_track_end", 180 | "td_width_to_size_filter_ratio": 0.9 181 | } 182 | ], 183 | "track_widths": [], 184 | "tuning_pattern_settings": { 185 | "diff_pair_defaults": { 186 | "corner_radius_percentage": 80, 187 | "corner_style": 1, 188 | "max_amplitude": 1.0, 189 | "min_amplitude": 0.2, 190 | "single_sided": false, 191 | "spacing": 1.0 192 | }, 193 | "diff_pair_skew_defaults": { 194 | "corner_radius_percentage": 80, 195 | "corner_style": 1, 196 | "max_amplitude": 1.0, 197 | "min_amplitude": 0.2, 198 | "single_sided": false, 199 | "spacing": 0.6 200 | }, 201 | "single_track_defaults": { 202 | "corner_radius_percentage": 80, 203 | "corner_style": 1, 204 | "max_amplitude": 1.0, 205 | "min_amplitude": 0.2, 206 | "single_sided": false, 207 | "spacing": 0.6 208 | } 209 | }, 210 | "via_dimensions": [], 211 | "zones_allow_external_fillets": false 212 | }, 213 | "ipc2581": { 214 | "dist": "", 215 | "distpn": "", 216 | "internal_id": "", 217 | "mfg": "", 218 | "mpn": "" 219 | }, 220 | "layer_pairs": [], 221 | "layer_presets": [], 222 | "viewports": [] 223 | }, 224 | "boards": [], 225 | "cvpcb": { 226 | "equivalence_files": [] 227 | }, 228 | "libraries": { 229 | "pinned_footprint_libs": [], 230 | "pinned_symbol_libs": [] 231 | }, 232 | "meta": { 233 | "filename": "framework16v1.kicad_pro", 234 | "version": 3 235 | }, 236 | "net_settings": { 237 | "classes": [ 238 | { 239 | "bus_width": 12, 240 | "clearance": 0.2, 241 | "diff_pair_gap": 0.25, 242 | "diff_pair_via_gap": 0.25, 243 | "diff_pair_width": 0.2, 244 | "line_style": 0, 245 | "microvia_diameter": 0.3, 246 | "microvia_drill": 0.1, 247 | "name": "Default", 248 | "pcb_color": "rgba(0, 0, 0, 0.000)", 249 | "priority": -1, 250 | "schematic_color": "rgba(0, 0, 0, 0.000)", 251 | "track_width": 0.25, 252 | "via_diameter": 0.8, 253 | "via_drill": 0.4, 254 | "wire_width": 6 255 | } 256 | ], 257 | "meta": { 258 | "version": 4 259 | }, 260 | "net_colors": null, 261 | "netclass_assignments": null, 262 | "netclass_patterns": [ 263 | { 264 | "netclass": "Default", 265 | "pattern": "" 266 | }, 267 | { 268 | "netclass": "Default", 269 | "pattern": "P7" 270 | }, 271 | { 272 | "netclass": "Default", 273 | "pattern": "pinky_home" 274 | }, 275 | { 276 | "netclass": "Default", 277 | "pattern": "pinky_top" 278 | }, 279 | { 280 | "netclass": "Default", 281 | "pattern": "pinky_num" 282 | }, 283 | { 284 | "netclass": "Default", 285 | "pattern": "P8" 286 | }, 287 | { 288 | "netclass": "Default", 289 | "pattern": "ring_bottom" 290 | }, 291 | { 292 | "netclass": "Default", 293 | "pattern": "ring_home" 294 | }, 295 | { 296 | "netclass": "Default", 297 | "pattern": "ring_top" 298 | }, 299 | { 300 | "netclass": "Default", 301 | "pattern": "ring_num" 302 | }, 303 | { 304 | "netclass": "Default", 305 | "pattern": "P9" 306 | }, 307 | { 308 | "netclass": "Default", 309 | "pattern": "middle_bottom" 310 | }, 311 | { 312 | "netclass": "Default", 313 | "pattern": "middle_home" 314 | }, 315 | { 316 | "netclass": "Default", 317 | "pattern": "middle_top" 318 | }, 319 | { 320 | "netclass": "Default", 321 | "pattern": "middle_num" 322 | }, 323 | { 324 | "netclass": "Default", 325 | "pattern": "P10" 326 | }, 327 | { 328 | "netclass": "Default", 329 | "pattern": "index_home" 330 | }, 331 | { 332 | "netclass": "Default", 333 | "pattern": "index_top" 334 | }, 335 | { 336 | "netclass": "Default", 337 | "pattern": "index_num" 338 | }, 339 | { 340 | "netclass": "Default", 341 | "pattern": "P16" 342 | }, 343 | { 344 | "netclass": "Default", 345 | "pattern": "inner_home" 346 | }, 347 | { 348 | "netclass": "Default", 349 | "pattern": "inner_top" 350 | }, 351 | { 352 | "netclass": "Default", 353 | "pattern": "inner_num" 354 | }, 355 | { 356 | "netclass": "Default", 357 | "pattern": "near_thumb" 358 | }, 359 | { 360 | "netclass": "Default", 361 | "pattern": "home_thumb" 362 | }, 363 | { 364 | "netclass": "Default", 365 | "pattern": "P15" 366 | }, 367 | { 368 | "netclass": "Default", 369 | "pattern": "far_thumb" 370 | }, 371 | { 372 | "netclass": "Default", 373 | "pattern": "mirror_pinky_home" 374 | }, 375 | { 376 | "netclass": "Default", 377 | "pattern": "mirror_pinky_top" 378 | }, 379 | { 380 | "netclass": "Default", 381 | "pattern": "mirror_pinky_num" 382 | }, 383 | { 384 | "netclass": "Default", 385 | "pattern": "mirror_ring_bottom" 386 | }, 387 | { 388 | "netclass": "Default", 389 | "pattern": "mirror_ring_home" 390 | }, 391 | { 392 | "netclass": "Default", 393 | "pattern": "mirror_ring_top" 394 | }, 395 | { 396 | "netclass": "Default", 397 | "pattern": "mirror_ring_num" 398 | }, 399 | { 400 | "netclass": "Default", 401 | "pattern": "mirror_middle_bottom" 402 | }, 403 | { 404 | "netclass": "Default", 405 | "pattern": "mirror_middle_home" 406 | }, 407 | { 408 | "netclass": "Default", 409 | "pattern": "mirror_middle_top" 410 | }, 411 | { 412 | "netclass": "Default", 413 | "pattern": "mirror_middle_num" 414 | }, 415 | { 416 | "netclass": "Default", 417 | "pattern": "mirror_index_home" 418 | }, 419 | { 420 | "netclass": "Default", 421 | "pattern": "mirror_index_top" 422 | }, 423 | { 424 | "netclass": "Default", 425 | "pattern": "mirror_index_num" 426 | }, 427 | { 428 | "netclass": "Default", 429 | "pattern": "mirror_inner_home" 430 | }, 431 | { 432 | "netclass": "Default", 433 | "pattern": "mirror_inner_top" 434 | }, 435 | { 436 | "netclass": "Default", 437 | "pattern": "mirror_inner_num" 438 | }, 439 | { 440 | "netclass": "Default", 441 | "pattern": "mirror_near_thumb" 442 | }, 443 | { 444 | "netclass": "Default", 445 | "pattern": "mirror_home_thumb" 446 | }, 447 | { 448 | "netclass": "Default", 449 | "pattern": "mirror_far_thumb" 450 | }, 451 | { 452 | "netclass": "Default", 453 | "pattern": "P4" 454 | }, 455 | { 456 | "netclass": "Default", 457 | "pattern": "P0" 458 | }, 459 | { 460 | "netclass": "Default", 461 | "pattern": "P1" 462 | }, 463 | { 464 | "netclass": "Default", 465 | "pattern": "P5" 466 | }, 467 | { 468 | "netclass": "Default", 469 | "pattern": "P19" 470 | }, 471 | { 472 | "netclass": "Default", 473 | "pattern": "P20" 474 | }, 475 | { 476 | "netclass": "Default", 477 | "pattern": "P21" 478 | }, 479 | { 480 | "netclass": "Default", 481 | "pattern": "P18" 482 | }, 483 | { 484 | "netclass": "Default", 485 | "pattern": "RAW" 486 | }, 487 | { 488 | "netclass": "Default", 489 | "pattern": "GND" 490 | }, 491 | { 492 | "netclass": "Default", 493 | "pattern": "RST" 494 | }, 495 | { 496 | "netclass": "Default", 497 | "pattern": "VCC" 498 | }, 499 | { 500 | "netclass": "Default", 501 | "pattern": "P14" 502 | }, 503 | { 504 | "netclass": "Default", 505 | "pattern": "P2" 506 | }, 507 | { 508 | "netclass": "Default", 509 | "pattern": "P3" 510 | }, 511 | { 512 | "netclass": "Default", 513 | "pattern": "P6" 514 | }, 515 | { 516 | "netclass": "Default", 517 | "pattern": "P101" 518 | }, 519 | { 520 | "netclass": "Default", 521 | "pattern": "P102" 522 | }, 523 | { 524 | "netclass": "Default", 525 | "pattern": "P107" 526 | }, 527 | { 528 | "netclass": "Default", 529 | "pattern": "MCU1_24" 530 | }, 531 | { 532 | "netclass": "Default", 533 | "pattern": "MCU1_1" 534 | }, 535 | { 536 | "netclass": "Default", 537 | "pattern": "MCU1_23" 538 | }, 539 | { 540 | "netclass": "Default", 541 | "pattern": "MCU1_2" 542 | }, 543 | { 544 | "netclass": "Default", 545 | "pattern": "MCU1_22" 546 | }, 547 | { 548 | "netclass": "Default", 549 | "pattern": "MCU1_3" 550 | }, 551 | { 552 | "netclass": "Default", 553 | "pattern": "MCU1_21" 554 | }, 555 | { 556 | "netclass": "Default", 557 | "pattern": "MCU1_4" 558 | }, 559 | { 560 | "netclass": "Default", 561 | "pattern": "MCU1_20" 562 | }, 563 | { 564 | "netclass": "Default", 565 | "pattern": "MCU1_5" 566 | }, 567 | { 568 | "netclass": "Default", 569 | "pattern": "MCU1_19" 570 | }, 571 | { 572 | "netclass": "Default", 573 | "pattern": "MCU1_6" 574 | }, 575 | { 576 | "netclass": "Default", 577 | "pattern": "MCU1_18" 578 | }, 579 | { 580 | "netclass": "Default", 581 | "pattern": "MCU1_7" 582 | }, 583 | { 584 | "netclass": "Default", 585 | "pattern": "MCU1_17" 586 | }, 587 | { 588 | "netclass": "Default", 589 | "pattern": "MCU1_8" 590 | }, 591 | { 592 | "netclass": "Default", 593 | "pattern": "MCU1_16" 594 | }, 595 | { 596 | "netclass": "Default", 597 | "pattern": "MCU1_9" 598 | }, 599 | { 600 | "netclass": "Default", 601 | "pattern": "MCU1_15" 602 | }, 603 | { 604 | "netclass": "Default", 605 | "pattern": "MCU1_10" 606 | }, 607 | { 608 | "netclass": "Default", 609 | "pattern": "MCU1_14" 610 | }, 611 | { 612 | "netclass": "Default", 613 | "pattern": "MCU1_11" 614 | }, 615 | { 616 | "netclass": "Default", 617 | "pattern": "MCU1_13" 618 | }, 619 | { 620 | "netclass": "Default", 621 | "pattern": "MCU1_12" 622 | }, 623 | { 624 | "netclass": "Default", 625 | "pattern": "BAT" 626 | } 627 | ] 628 | }, 629 | "pcbnew": { 630 | "last_paths": { 631 | "gencad": "", 632 | "idf": "", 633 | "netlist": "", 634 | "plot": "", 635 | "pos_files": "", 636 | "specctra_dsn": "", 637 | "step": "", 638 | "svg": "", 639 | "vrml": "" 640 | }, 641 | "page_layout_descr_file": "" 642 | }, 643 | "schematic": { 644 | "legacy_lib_dir": "", 645 | "legacy_lib_list": [] 646 | }, 647 | "sheets": [], 648 | "text_variables": {} 649 | } 650 | -------------------------------------------------------------------------------- /kicad/framework16v1/framework16v1.round-tracks-config: -------------------------------------------------------------------------------- 1 | Default True 1.0 2 2 | False True False 3 | -------------------------------------------------------------------------------- /kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_Default.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_Default.zip -------------------------------------------------------------------------------- /kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_Elecrow.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_Elecrow.zip -------------------------------------------------------------------------------- /kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_FusionPCB.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_FusionPCB.zip -------------------------------------------------------------------------------- /kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_JLCPCB.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_JLCPCB.zip -------------------------------------------------------------------------------- /kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_PCBWay.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sommerper/framework16-keyboard-v1/0367c605819d629a1eedcd6792cfe532f3803712/kicad/framework16v1/gerber_to_order/framework16v1_270.0x104.215538mm_for_PCBWay.zip -------------------------------------------------------------------------------- /qmk/keyboards/framework_v1/keyboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard_name": "Framework 16 Keyboard v1", 3 | "manufacturer": "Phero", 4 | "url": "", 5 | "maintainer": "qmk", 6 | "features": { 7 | "bootmagic": true, 8 | "extrakey": true, 9 | "mousekey": true, 10 | "nkro": true 11 | }, 12 | "usb": { 13 | "vid": "0x4354", 14 | "pid": "0x0001", 15 | "device_version": "0.0.1" 16 | }, 17 | "processor": "atmega32u4", 18 | "bootloader": "caterina", 19 | "diode_direction": "COL2ROW", 20 | "matrix_pins": { 21 | "cols": ["E6", "B4", "B5", "B6", "B2", "B1"], 22 | "rows": ["D3", "F4", "D2", "F5", "D4", "F6", "C6", "F7"] 23 | }, 24 | "community_layouts": ["framework"], 25 | "layouts": { 26 | "LAYOUT_framework": { 27 | "layout": [ 28 | {"label": "Q", "matrix": [0, 0], "x": 1, "y": 0.9}, 29 | {"label": "W", "matrix": [0, 1], "x": 2, "y": 0.6}, 30 | {"label": "E", "matrix": [0, 2], "x": 3, "y": 0.3}, 31 | {"label": "R", "matrix": [0, 3], "x": 4, "y": 0.3}, 32 | {"label": "T", "matrix": [0, 4], "x": 5, "y": 0.6}, 33 | 34 | {"label": "Y", "matrix": [1, 4], "x": 7, "y": 0.6}, 35 | {"label": "U", "matrix": [1, 3], "x": 8, "y": 0.3}, 36 | {"label": "I", "matrix": [1, 2], "x": 9, "y": 0.3}, 37 | {"label": "O", "matrix": [1, 1], "x": 10, "y": 0.6}, 38 | {"label": "P", "matrix": [1, 0], "x": 11, "y": 0.9}, 39 | 40 | {"label": "Q", "matrix": [2, 0], "x": 1, "y": 1.9}, 41 | {"label": "W", "matrix": [2, 1], "x": 2, "y": 1.6}, 42 | {"label": "E", "matrix": [2, 2], "x": 3, "y": 1.3}, 43 | {"label": "R", "matrix": [2, 3], "x": 4, "y": 1.3}, 44 | {"label": "T", "matrix": [2, 4], "x": 5, "y": 1.6}, 45 | 46 | {"label": "Y", "matrix": [3, 4], "x": 7, "y": 1.6}, 47 | {"label": "U", "matrix": [3, 3], "x": 8, "y": 1.3}, 48 | {"label": "I", "matrix": [3, 2], "x": 9, "y": 1.3}, 49 | {"label": "O", "matrix": [3, 1], "x": 10, "y": 1.6}, 50 | {"label": "P", "matrix": [3, 0], "x": 11, "y": 1.9}, 51 | 52 | {"label": "Q", "matrix": [4, 0], "x": 1, "y": 2.9}, 53 | {"label": "W", "matrix": [4, 1], "x": 2, "y": 2.6}, 54 | {"label": "E", "matrix": [4, 2], "x": 3, "y": 2.3}, 55 | {"label": "R", "matrix": [4, 3], "x": 4, "y": 2.3}, 56 | {"label": "T", "matrix": [4, 4], "x": 5, "y": 2.6}, 57 | 58 | {"label": "Y", "matrix": [5, 4], "x": 7, "y": 2.6}, 59 | {"label": "U", "matrix": [5, 3], "x": 8, "y": 2.3}, 60 | {"label": "I", "matrix": [5, 2], "x": 9, "y": 2.3}, 61 | {"label": "O", "matrix": [5, 1], "x": 10, "y": 2.6}, 62 | {"label": "P", "matrix": [5, 0], "x": 11, "y": 2.9}, 63 | 64 | {"label": "W", "matrix": [6, 1], "x": 2, "y": 3}, 65 | {"label": "E", "matrix": [6, 2], "x": 3, "y": 3}, 66 | {"label": "R", "matrix": [6, 3], "x": 3, "y": 3.8}, 67 | {"label": "T", "matrix": [6, 4], "x": 4, "y": 4}, 68 | 69 | {"label": "Y", "matrix": [7, 4], "x": 6, "y": 3}, 70 | {"label": "U", "matrix": [7, 3], "x": 7, "y": 3}, 71 | {"label": "I", "matrix": [7, 2], "x": 8, "y": 3}, 72 | {"label": "O", "matrix": [7, 1], "x": 9, "y": 3}, 73 | 74 | {"label": "Q", "matrix": [6, 5], "x": 5, "y": 4.2}, 75 | {"label": "W", "matrix": [7, 5], "x": 2, "y": 3} 76 | ] 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /qmk/keyboards/framework_v1/keymaps/default/config.h: -------------------------------------------------------------------------------- 1 | // Copyright QMK Community 2 | // SPDX-License-Identifier: GPL-2.0+ 3 | 4 | #pragma once 5 | 6 | 7 | #ifdef AUDIO_ENABLE 8 | #define STARTUP_SONG SONG(PLANCK_SOUND) 9 | // #define STARTUP_SONG SONG(NO_SOUND) 10 | 11 | #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ 12 | SONG(COLEMAK_SOUND), \ 13 | SONG(DVORAK_SOUND) \ 14 | } 15 | #endif 16 | 17 | #define MUSIC_MASK (keycode != KC_NO) 18 | 19 | /* 20 | * MIDI options 21 | */ 22 | 23 | /* enable basic MIDI features: 24 | - MIDI notes can be sent when in Music mode is on 25 | */ 26 | 27 | #define MIDI_BASIC 28 | 29 | /* enable advanced MIDI features: 30 | - MIDI notes can be added to the keymap 31 | - Octave shift and transpose 32 | - Virtual sustain, portamento, and modulation wheel 33 | - etc. 34 | */ 35 | //#define MIDI_ADVANCED 36 | 37 | /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ 38 | //#define MIDI_TONE_KEYCODE_OCTAVES 2 39 | -------------------------------------------------------------------------------- /qmk/keyboards/framework_v1/keymaps/default/keymap.c: -------------------------------------------------------------------------------- 1 | /* Copyright 2015-2017 Jack Humbert 2 | * 3 | * This program is free software: you can redistribute it and/or modify 4 | * it under the terms of the GNU General Public License as published by 5 | * the Free Software Foundation, either version 2 of the License, or 6 | * (at your option) any later version. 7 | * 8 | * This program is distributed in the hope that it will be useful, 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | * GNU General Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License 14 | * along with this program. If not, see . 15 | */ 16 | 17 | #include QMK_KEYBOARD_H 18 | 19 | 20 | enum framework_layers { 21 | _QWERTY, 22 | }; 23 | 24 | #define QWERTY PDF(_QWERTY) 25 | 26 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 27 | [_QWERTY] = LAYOUT_framework( 28 | KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 29 | KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, 30 | KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, 31 | KC_U, KC_Y, KC_Z, KC_X, KC_SPC, KC_ASTR, KC_COMMA,KC_AT, KC_AMPR, KC_DOT 32 | ) 33 | }; 34 | 35 | -------------------------------------------------------------------------------- /qmk/keyboards/framework_v1/readme.md: -------------------------------------------------------------------------------- 1 | # Contra 2 | 3 | Contra is a low cost 40% keyboard. 4 | 5 | * Keyboard Maintainer: The QMK Community 6 | * Hardware Supported: [Contra](https://github.com/ai03-2725/Contra) 7 | * Hardware Availability: PCB sold by various vendors 8 | 9 | Make example for this keyboard (after setting up your build environment): 10 | 11 | make contra:default 12 | 13 | See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). 14 | 15 | ## Bootloader 16 | 17 | Enter the bootloader in 3 ways: 18 | 19 | * **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is configured. 20 | * **Physical reset button**: Briefly press the reset button soldered on the PCB. 21 | * **Bootmagic reset**: Hold down the top left key and plug in the controller. 22 | -------------------------------------------------------------------------------- /zmk/boards/shields/framework_v1/Kconfig.defconfig: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 The ZMK Contributors 2 | # SPDX-License-Identifier: MIT 3 | 4 | if SHIELD_FRAMEWORK_V1 5 | 6 | config ZMK_KEYBOARD_NAME 7 | default "Framework v1 Keyboard" 8 | 9 | endif -------------------------------------------------------------------------------- /zmk/boards/shields/framework_v1/Kconfig.shield: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2021 The ZMK Contributors 2 | # SPDX-License-Identifier: MIT 3 | 4 | config SHIELD_FRAMEWORK_V1 5 | def_bool $(shields_list_contains,framework_v1) -------------------------------------------------------------------------------- /zmk/boards/shields/framework_v1/framework_v1.conf: -------------------------------------------------------------------------------- 1 | CONFIG_ZMK_KEYBOARD_NAME="Framework_v1" 2 | CONFIG_ZMK_BLE_EXPERIMENTAL_FEATURES=y 3 | CONFIG_ZMK_SLEEP=y 4 | CONFIG_BT_CTLR_TX_PWR_PLUS_8=y 5 | CONFIG_ZMK_BLE_EXPERIMENTAL_CONN=y 6 | CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y 7 | CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n -------------------------------------------------------------------------------- /zmk/boards/shields/framework_v1/framework_v1.keymap: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2021 The ZMK Contributors 3 | * 4 | * SPDX-License-Identifier: MIT 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include "zmk-helpers/helper.h" 13 | #include "framework_v1.overlay" 14 | #include "framework_v1_keypos.h" 15 | 16 | 17 | #define BASE 0 18 | #define LOWER 1 19 | #define RAISE 2 20 | 21 | #define BASEMAC 3 22 | #define LOWERMAC 4 23 | #define RAISEMAC 5 24 | 25 | #define QUERTY 6 26 | #define EXTRAS 7 27 | #define NUMPAD 8 28 | #define NUMBERS 9 29 | #define BLUETOOTH 10 30 | #define LANG 11 31 | 32 | // left-hand keys 33 | #define KEYS_L LN4 LN3 LN2 LN1 LN0 LT4 LT3 LT2 LT1 LT0 LM4 LM3 LM2 LM1 LM0 LB1 LB0 34 | // right-hand keys 35 | #define KEYS_R RN0 RN1 RN2 RN3 RN4 RT0 RT1 RT2 RT3 RT4 RM0 RM1 RM2 RM3 RM4 RB0 RB1 36 | // left-hand thumb keys 37 | #define THUMBS_L LH0 LH1 LH2 38 | // right-hand thumb keys 39 | #define THUMBS_R RH0 RH1 RH2 40 | 41 | / { 42 | conditional_layers { 43 | compatible = "zmk,conditional-layers"; 44 | tri_layer { 45 | if-layers = ; 46 | then-layer = ; 47 | }; 48 | tri_layer_mac { 49 | if-layers = ; 50 | then-layer = ; 51 | }; 52 | }; 53 | }; 54 | 55 | 56 | #define XXX &none 57 | #define ___ &trans 58 | 59 | #undef COMBO_TERM 60 | #define COMBO_TERM 18 61 | 62 | 63 | // -------------------------------------------- 64 | // ------------------ COMBOS ------------------ 65 | // -------------------------------------------- 66 | ZMK_COMBO(comboDoubleQuote1, &kp SQT, RM1 RM2, BASE) 67 | 68 | 69 | 70 | // -------------------------------------------- 71 | // ------------------- HMR -------------------- 72 | // -------------------------------------------- 73 | #define MAKE_HRM(NAME, HOLD, TAP, TRIGGER_POS) \ 74 | ZMK_BEHAVIOR(NAME, hold_tap, \ 75 | flavor = "balanced"; \ 76 | tapping-term-ms = <280>; \ 77 | quick-tap-ms = <150>; \ 78 | bindings = , ; \ 79 | hold-trigger-key-positions = ; \ 80 | hold-trigger-on-release; \ 81 | hold-while-undecided; \ 82 | ) 83 | 84 | // left-hand HRMs 85 | MAKE_HRM(hml, &kp, &kp, THUMBS_L THUMBS_R KEYS_R) 86 | // right-hand HRMs 87 | MAKE_HRM(hmr, &kp, &kp, THUMBS_L THUMBS_R KEYS_L) 88 | 89 | 90 | // -------------------------------------------- 91 | // ----------------- TOGGLES ------------------ 92 | // -------------------------------------------- 93 | < { 94 | tapping-term-ms = <280>; 95 | quick-tap-ms = <280>; // repeat on tap-into-hold 96 | flavor = "balanced"; 97 | }; 98 | 99 | &mt { 100 | tapping-term-ms = <280>; 101 | quick-tap-ms = <280>; // repeat on tap-into-hold 102 | flavor = "balanced"; 103 | }; 104 | 105 | // -------------------------------------------- 106 | // --------------- BEHAVIOURS ----------------- 107 | // -------------------------------------------- 108 | 109 | ZMK_BEHAVIOR(alt_dot, hold_tap, 110 | flavor = "balanced"; 111 | tapping-term-ms = <200>; 112 | bindings = <&kp>, <&alt_morph>; 113 | hold-while-undecided; 114 | ) 115 | ZMK_BEHAVIOR(alt_morph, mod_morph, 116 | bindings = <&kp DOT>, <&kp COMMA>; 117 | mods = <(MOD_LSFT|MOD_RSFT)>; 118 | ) 119 | // ---------------------------- 120 | ZMK_BEHAVIOR(alt_sqt, hold_tap, 121 | flavor = "balanced"; 122 | tapping-term-ms = <200>; 123 | bindings = <&kp>, <&alt_morph_sqt>; 124 | ) 125 | 126 | ZMK_BEHAVIOR(alt_morph_sqt, mod_morph, 127 | bindings = <&kp SQT>, <&kp COMMA>; 128 | mods = <(MOD_LSFT|MOD_RSFT)>; 129 | ) 130 | 131 | ZMK_BEHAVIOR(copy_cut, tap_dance, 132 | tapping-term-ms = <200>; 133 | bindings = <&kp LC(INS)>, <&kp LC(X)>; 134 | ) 135 | 136 | ZMK_BEHAVIOR(copy_cut_mac, tap_dance, 137 | tapping-term-ms = <200>; 138 | bindings = <&kp LG(C)>, <&kp LG(X)>; 139 | ) 140 | 141 | 142 | // -------------------------------------------- 143 | // ----------------- MACROS ------------------- 144 | // -------------------------------------------- 145 | ZMK_BEHAVIOR(qu_macro, macro, 146 | wait-ms = <0>; 147 | tap-ms = <5>; 148 | bindings = <&kp Q>, <&kp U>; 149 | ) 150 | ZMK_BEHAVIOR(qui_macro, macro, 151 | wait-ms = <0>; 152 | tap-ms = <5>; 153 | bindings = <&kp Q>, <&kp U>, <&kp I>; 154 | ) 155 | ZMK_BEHAVIOR(sch_macro, macro, 156 | wait-ms = <0>; 157 | tap-ms = <5>; 158 | bindings = <&kp S>, <&kp C>, <&kp H>; 159 | ) 160 | 161 | // ------------------------------------------------------------------- 162 | // Linux 163 | // ------------------------------------------------------------------- 164 | // / { 165 | // keymap { 166 | // compatible = "zmk,keymap"; 167 | 168 | // base_layer { 169 | // bindings = < 170 | // &kp TILDE &kp C &kp L &kp D &kp K &kp J &kp F &kp O &kp U &kp SEMI 171 | // &kp R &kp S &kp T &kp H &kp G &kp M &kp N &kp E &kp I &kp A 172 | // &kp Q &kp W &kp V &kp B &kp SQT &kp COLON &kp P &kp X &kp Y &kp Z 173 | // &kp GRAVE &kp DQT &kp COMMA &kp DOT 174 | // &mt LALT TAB &kp HASH &kp DOLLAR &kp LT &kp SLASH &kp GT 175 | 176 | 177 | // >; 178 | // }; 179 | // }; 180 | // }; 181 | 182 | 183 | ZMK_LAYER(base, 184 | &kp HASH &kp C &kp L &kp D &kp K &kp J &kp F &kp O &kp U &kp SEMI 185 | &kp R &hml LGUI S &hml LCTRL T &hml LSHIFT H &kp G &kp M &hmr RSHIFT N &hmr RCTRL E &hmr RGUI I &kp A 186 | &kp Q &kp W &kp V < NUMPAD B &kp SQT &kp COLON &kp P &kp X &kp Y &kp Z 187 | &kp GRAVE &kp DQT &kp COMMA &kp DOT 188 | &mt LALT TAB < LOWER BSPC < NUMBERS ESC < LANG RET < RAISE SPC &alt_sqt RALT 0 189 | ) 190 | 191 | ZMK_LAYER(lower, 192 | &tog BASEMAC &kp K_VOL_DN &kp K_MUTE &kp K_VOL_UP &kp LC(BSPC) XXX &kp HOME XXX &kp END XXX 193 | &caps_word &kp LGUI &kp LCTRL &kp LSHIFT &kp BSPC XXX &kp LEFT &kp UP &kp RIGHT XXX 194 | &kp LC(Z) XXX ©_cut &kp LS(INS) &kp DEL XXX &kp PG_UP &kp DOWN &kp PG_DN &kp LC(SLASH) 195 | ___ ___ ___ ___ 196 | ___ ___ ___ ___ < RAISE MINUS ___ 197 | ) 198 | 199 | ZMK_LAYER(raise, 200 | XXX &kp AT &kp HASH &kp DOLLAR &kp PERCENT XXX &kp AMPS &kp LPAR &kp RPAR XXX 201 | &kp BACKSLASH &kp LT &kp SLASH &kp GT &kp QMARK XXX &kp PIPE &kp LBRC &kp RBRC &kp CARET 202 | &kp EXCL &kp TILDE &kp MINUS &kp DOT XXX &kp SEMI &kp ASTERISK &kp LBKT &kp RBKT &kp EQUAL 203 | ___ ___ ___ ___ 204 | ___ < LOWER UNDERSCORE ___ ___ ___ &kp EQUAL 205 | ) 206 | 207 | // ------------------------------------------------------------------- 208 | // Linux end 209 | // ------------------------------------------------------------------- 210 | 211 | // ------------------------------------------------------------------- 212 | // Mac start 213 | // ------------------------------------------------------------------- 214 | 215 | ZMK_LAYER(basemac, 216 | &kp M &kp C &kp L &kp D &kp K &kp J &kp F &kp O &kp U &kp SEMI 217 | &kp R &hml LGUI S &hml LCTRL T &hml LSHIFT H &kp G &kp M &hmr RSHIFT N &hmr RCTRL E &hmr RGUI I &kp A 218 | &kp Q &kp W &kp V < NUMPAD B &kp SQT &kp COLON &kp P &kp X &kp Y &kp Z 219 | &kp GRAVE &kp DQT &kp COMMA &kp DOT 220 | &mt LALT TAB < LOWERMAC BSPC < NUMBERS ESC < LANG RET < RAISEMAC SPC &alt_sqt RALT 0 221 | 222 | ) 223 | 224 | ZMK_LAYER(lowermac, 225 | &tog BASE &kp K_VOL_DN &kp K_MUTE &kp K_VOL_UP &kp LG(BSPC) &kp HOME &kp LG(LEFT) XXX &kp LG(RIGHT) &kp END 226 | XXX &kp LGUI &kp LCTRL &kp LSHIFT &kp BSPC XXX &kp LEFT &kp UP &kp RIGHT &kp RETURN 227 | &kp LG(Z) XXX ©_cut_mac &kp LG(V) &kp DEL XXX &kp PG_UP &kp DOWN &kp PG_DN &kp LG(SLASH) 228 | ___ ___ ___ ___ 229 | ___ ___ ___ ___ < RAISEMAC MINUS ___ 230 | ) 231 | 232 | ZMK_LAYER(raisemac, 233 | XXX &kp AT &kp HASH &kp DOLLAR &kp PERCENT XXX &kp AMPS &kp LPAR &kp RPAR XXX 234 | &kp BACKSLASH &kp LT &kp SLASH &kp GT &kp QMARK XXX &kp PIPE &kp LBRC &kp RBRC &kp CARET 235 | &kp EXCL &kp TILDE &kp MINUS &kp DOT XXX &kp SEMI &kp ASTERISK &kp LBKT &kp RBKT &kp EQUAL 236 | ___ ___ ___ ___ 237 | ___ < LOWERMAC UNDERSCORE ___ ___ ___ ___ 238 | ) 239 | 240 | // ------------------------------------------------------------------- 241 | // Mac end 242 | // ------------------------------------------------------------------- 243 | 244 | ZMK_LAYER(querty, 245 | &kp Q &kp R &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P 246 | &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp K &kp L 247 | &kp Z &kp X &kp C &kp V &kp B &kp N &kp N &kp M &kp COMMA &kp DOT 248 | &kp LCTRL &kp LSHIFT &kp COMMA &kp DOT 249 | &mt LALT TAB < LOWER BSPC < NUMBERS ESC < LANG RET < RAISE SPC &alt_dot RALT 0 250 | ) 251 | 252 | ZMK_LAYER(extras, 253 | XXX XXX XXX XXX XXX &kp F13 &kp F7 &kp F8 &kp F9 &kp F10 254 | &mo BLUETOOTH XXX XXX XXX XXX &kp F14 &kp F4 &kp F5 &kp F6 &kp F11 255 | XXX XXX XXX XXX XXX &kp F15 &kp F1 &kp F2 &kp F3 &kp F12 256 | ___ ___ ___ ___ 257 | ___ XXX ___ ___ XXX ___ 258 | ) 259 | 260 | ZMK_LAYER(numpad, 261 | XXX &kp NUMBER_7 &kp NUMBER_8 &kp NUMBER_9 XXX &kp KP_DIVIDE &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_MINUS 262 | XXX &kp NUMBER_4 &kp NUMBER_5 &kp NUMBER_6 XXX &kp KP_MULTIPLY &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS 263 | &kp NUMBER_0 &kp NUMBER_1 &kp NUMBER_2 &kp NUMBER_3 XXX &kp COLON &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_EQUAL 264 | &kp CAPSLOCK &kp KP_NUMLOCK &kp COMMA &kp KP_DOT 265 | ___ ___ ___ ___ &kp KP_N0 &kp KP_DOT 266 | ) 267 | 268 | ZMK_LAYER(numbers, 269 | &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp KP_N8 &kp F9 &kp F10 270 | &kp NUMBER_1 &kp NUMBER_2 &kp NUMBER_3 &kp NUMBER_4 &kp NUMBER_5 &kp NUMBER_6 &kp NUMBER_7 &kp KP_N8 &kp NUMBER_9 &kp NUMBER_0 271 | &kp F11 &kp F12 &kp F13 &kp F14 &kp F15 &kp F16 &kp F17 &kp KP_N8 &kp F19 &kp F20 272 | ___ ___ ___ ___ 273 | ___ ___ ___ ___ ___ ___ 274 | ) 275 | 276 | ZMK_LAYER(bluetooth, 277 | XXX XXX XXX XXX XXX &sys_reset XXX &out OUT_BLE &out OUT_USB &bootloader 278 | XXX XXX XXX XXX XXX XXX &bt BT_SEL 4 &bt BT_SEL 5 XXX XXX 279 | XXX XXX XXX XXX XXX &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 XXX 280 | XXX XXX &bt BT_CLR XXX 281 | XXX XXX XXX XXX XXX XXX 282 | ) 283 | 284 | ZMK_LAYER(lang, 285 | XXX &sch_macro XXX XXX XXX XXX XXX &kp RA(P) &kp RA(Y) XXX 286 | &qui_macro &kp RA(S) XXX XXX XXX XXX XXX &kp RA(L) &kp RA(Z) &kp RA(Q) 287 | &qu_macro XXX XXX XXX XXX XXX XXX XXX XXX &kp RA(W) 288 | ___ ___ XXX XXX 289 | ___ XXX ___ ___ XXX XXX 290 | ) -------------------------------------------------------------------------------- /zmk/boards/shields/framework_v1/framework_v1.overlay: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2021 The ZMK Contributors 3 | * 4 | * SPDX-License-Identifier: MIT 5 | */ 6 | 7 | #include 8 | 9 | / { 10 | chosen { 11 | zmk,kscan = &kscan0; 12 | zmk,matrix_transform = &default_transform; 13 | }; 14 | 15 | default_transform: keymap_transform_0 { 16 | compatible = "zmk,matrix-transform"; 17 | columns = <5>; 18 | rows = <8>; 19 | map = < 20 | RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) 21 | RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0) 22 | RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0) 23 | RC(6,1) RC(6,2) RC(7,2) RC(7,1) 24 | RC(6,3) RC(6,4) RC(6,5) RC(7,5) RC(7,4) RC(7,3) 25 | >; 26 | }; 27 | 28 | kscan0: kscan_0 { 29 | compatible = "zmk,kscan-gpio-matrix"; 30 | label = "KSCAN"; 31 | diode-direction = "col2row"; 32 | 33 | // nrfmicro_13 34 | // col-gpios 35 | // = <&gpio0 9 GPIO_ACTIVE_HIGH> 36 | // , <&gpio0 10 GPIO_ACTIVE_HIGH> 37 | // , <&gpio1 6 GPIO_ACTIVE_HIGH> 38 | // , <&gpio1 11 GPIO_ACTIVE_HIGH> 39 | // , <&gpio0 28 GPIO_ACTIVE_HIGH> 40 | // , <&gpio1 13 GPIO_ACTIVE_HIGH> 41 | // ; 42 | 43 | // row-gpios 44 | // = <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 45 | // , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 46 | // , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 47 | // , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 48 | // , <&gpio0 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 49 | // , <&gpio0 29 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 50 | // , <&gpio0 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 51 | // , <&gpio1 02 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 52 | // ; 53 | 54 | // nice nano 55 | col-gpios 56 | = <&gpio0 11 GPIO_ACTIVE_HIGH> 57 | , <&gpio1 4 GPIO_ACTIVE_HIGH> 58 | , <&gpio1 6 GPIO_ACTIVE_HIGH> 59 | , <&gpio0 9 GPIO_ACTIVE_HIGH> 60 | , <&gpio0 10 GPIO_ACTIVE_HIGH> 61 | , <&gpio1 13 GPIO_ACTIVE_HIGH> 62 | ; 63 | 64 | row-gpios 65 | = <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 66 | , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 67 | , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 68 | , <&gpio0 29 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 69 | , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 70 | , <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 71 | , <&gpio0 24 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 72 | , <&gpio1 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 73 | ; 74 | 75 | // pro micro 76 | // col-gpios 77 | // = <&pro_micro 7 GPIO_ACTIVE_HIGH> 78 | // , <&pro_micro 8 GPIO_ACTIVE_HIGH> 79 | // , <&pro_micro 9 GPIO_ACTIVE_HIGH> 80 | // , <&pro_micro 10 GPIO_ACTIVE_HIGH> 81 | // , <&pro_micro 16 GPIO_ACTIVE_HIGH> 82 | // , <&pro_micro 15 GPIO_ACTIVE_HIGH> 83 | // ; 84 | 85 | // row-gpios 86 | // = <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 87 | // , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 88 | // , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 89 | // , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 90 | // , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 91 | // , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 92 | // , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 93 | // , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 94 | // ; 95 | }; 96 | }; 97 | -------------------------------------------------------------------------------- /zmk/boards/shields/framework_v1/framework_v1_keypos.h: -------------------------------------------------------------------------------- 1 | /* 2 | KEY MATRIX / LAYOUT MAPPING 3 | ╭────────────────────────────┬─────────────────────────────╮ ╭─────────────────────────┬──────────────────────────╮ 4 | │ 0 1 2 3 4 │ 5 6 7 8 9 │ │ LN4 LN3 LN2 LN1 LN0 │ RN0 RN1 RN2 RN3 RN4 │ 5 | │ 10 11 12 13 14 │ 15 16 17 18 19 │ │ LT4 LT3 LT2 LT1 LT0 │ RT0 RT1 RT2 RT3 RT4 │ 6 | │ 20 21 22 23 24 │ 25 26 27 28 29 │ │ LM4 LM3 LM2 LM1 LM0 │ RM0 RM1 RM2 RM3 RM4 │ 7 | │ 30 31 │ 32 33 │ │ LB1 LB0 │ RB0 RB1 │ 8 | ╰───────────────┬────────────┼────────────┬────────────────╯ ╰──────────┬──────────────┼──────────────┬───────────╯ 9 | │ 34 35 36 │ 37 38 39 │ │ LH2 LH1 LH0 │ RH0 RH1 RH3 │ 10 | ╰────────────┴────────────╯ ╰──────────────┴──────────────╯ 11 | */ 12 | 13 | #pragma once 14 | 15 | // left-num row 16 | #define LN0 4 17 | #define LN1 3 18 | #define LN2 2 19 | #define LN3 1 20 | #define LN4 0 21 | 22 | // right-num row 23 | #define RN0 5 24 | #define RN1 6 25 | #define RN2 7 26 | #define RN3 8 27 | #define RN4 9 28 | 29 | // left-top row 30 | #define LT0 14 31 | #define LT1 13 32 | #define LT2 12 33 | #define LT3 11 34 | #define LT4 10 35 | 36 | // right-top row 37 | #define RT0 15 38 | #define RT1 16 39 | #define RT2 17 40 | #define RT3 18 41 | #define RT4 19 42 | 43 | // left-middle row 44 | #define LM0 24 45 | #define LM1 23 46 | #define LM2 22 47 | #define LM3 21 48 | #define LM4 20 49 | 50 | // right-middle row 51 | #define RM0 25 52 | #define RM1 26 53 | #define RM2 27 54 | #define RM3 28 55 | #define RM4 29 56 | 57 | // left-bottom row 58 | #define LB0 31 59 | #define LB1 30 60 | 61 | // right-bottom row 62 | #define RB0 32 63 | #define RB1 33 64 | 65 | // left thumb keys 66 | #define LH0 36 67 | #define LH1 35 68 | #define LH2 34 69 | 70 | // right thumb keys 71 | #define RH0 37 72 | #define RH1 38 73 | #define RH2 39 74 | 75 | --------------------------------------------------------------------------------