├── components ├── README ├── additional │ ├── JLC_tooling_hole.kicad_mod │ ├── HRS_DF14_20P.kicad_mod │ └── logo.kicad_mod └── sleep-lib │ ├── LICENSE │ ├── Sleep-lib.kicad_sym │ └── RP2040-QFN-56.kicad_mod ├── rev1 ├── jlcpcb │ ├── project.db │ └── production_files │ │ ├── GERBER-fc980c-controller.zip │ │ ├── BOM-fc980c-controller.csv │ │ └── CPL-fc980c-controller.csv ├── rev1-schematic.pdf ├── sym-lib-table ├── fp-lib-table ├── fc980c-controller.kicad_pro └── LICENSE.txt ├── rev2 ├── jlcpcb │ ├── project.db │ └── production_files │ │ ├── GERBER-fc980c-controller.zip │ │ ├── BOM-fc980c-controller.csv │ │ └── CPL-fc980c-controller.csv ├── rev2-schematic.pdf ├── sym-lib-table ├── fp-lib-table ├── fc980c-controller.kicad_pro └── LICENSE.txt ├── img ├── main-board-photo.jpg ├── rev1-board-photo.jpg ├── rev0-board-render.png └── rev2-board-render.png ├── rev0 ├── rev0-schematic.pdf ├── sym-lib-table ├── fp-lib-table ├── fc980c-controller.kicad_pro └── LICENSE.txt ├── firmware ├── keyboards │ └── leopold │ │ └── fc980c │ │ └── wlhlm │ │ ├── keymaps │ │ ├── wlhlm │ │ │ ├── rules.mk │ │ │ ├── config.h │ │ │ └── keymap.c │ │ ├── actuation_point_example │ │ │ ├── readme.md │ │ │ └── keymap.c │ │ └── default │ │ │ └── keymap.c │ │ ├── rules.mk │ │ ├── halconf.h │ │ ├── mcuconf.h │ │ ├── wlhlm.h │ │ ├── config.h │ │ ├── actuation_point.h │ │ ├── wlhlm.c │ │ ├── readme.md │ │ ├── actuation_point.c │ │ ├── matrix.c │ │ └── keyboard.json ├── leopold_fc980c_wlhlm_default.bin ├── leopold_fc980c_wlhlm_actuation_point_example.bin ├── README.md └── LICENSE ├── .gitmodules ├── .gitignore └── README.md /components/README: -------------------------------------------------------------------------------- 1 | This contains KiCad parts libraries required for the FC980C controller PCB. 2 | -------------------------------------------------------------------------------- /rev1/jlcpcb/project.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/rev1/jlcpcb/project.db -------------------------------------------------------------------------------- /rev2/jlcpcb/project.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/rev2/jlcpcb/project.db -------------------------------------------------------------------------------- /img/main-board-photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/img/main-board-photo.jpg -------------------------------------------------------------------------------- /img/rev1-board-photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/img/rev1-board-photo.jpg -------------------------------------------------------------------------------- /rev0/rev0-schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/rev0/rev0-schematic.pdf -------------------------------------------------------------------------------- /rev1/rev1-schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/rev1/rev1-schematic.pdf -------------------------------------------------------------------------------- /rev2/rev2-schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/rev2/rev2-schematic.pdf -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/keymaps/wlhlm/rules.mk: -------------------------------------------------------------------------------- 1 | COMMAND_ENABLE = yes 2 | CONSOLE_ENABLE = yes 3 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/rules.mk: -------------------------------------------------------------------------------- 1 | CUSTOM_MATRIX = lite 2 | SRC += matrix.c actuation_point.c 3 | -------------------------------------------------------------------------------- /img/rev0-board-render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/img/rev0-board-render.png -------------------------------------------------------------------------------- /img/rev2-board-render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/img/rev2-board-render.png -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "firmware/qmk_firmware"] 2 | path = firmware/qmk_firmware 3 | url = https://github.com/qmk/qmk_firmware.git/ 4 | -------------------------------------------------------------------------------- /firmware/leopold_fc980c_wlhlm_default.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/firmware/leopold_fc980c_wlhlm_default.bin -------------------------------------------------------------------------------- /firmware/leopold_fc980c_wlhlm_actuation_point_example.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/firmware/leopold_fc980c_wlhlm_actuation_point_example.bin -------------------------------------------------------------------------------- /rev1/jlcpcb/production_files/GERBER-fc980c-controller.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/rev1/jlcpcb/production_files/GERBER-fc980c-controller.zip -------------------------------------------------------------------------------- /rev2/jlcpcb/production_files/GERBER-fc980c-controller.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wlhlm/fc980c-controller/HEAD/rev2/jlcpcb/production_files/GERBER-fc980c-controller.zip -------------------------------------------------------------------------------- /rev0/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name "Sleep-lib")(type "KiCad")(uri "${KIPRJMOD}/../components/sleep-lib/Sleep-lib.kicad_sym")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /rev1/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name "Sleep-lib")(type "KiCad")(uri "${KIPRJMOD}/../components/sleep-lib/Sleep-lib.kicad_sym")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /rev2/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name "Sleep-lib")(type "KiCad")(uri "${KIPRJMOD}/../components/sleep-lib/Sleep-lib.kicad_sym")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/halconf.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #pragma once 5 | 6 | #define HAL_USE_I2C TRUE 7 | 8 | #include_next 9 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/keymaps/wlhlm/config.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #pragma once 5 | 6 | #define SERIAL_NUMBER "1" 7 | 8 | #define DEBUG_MATRIX_SCAN_RATE 9 | -------------------------------------------------------------------------------- /rev0/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name "sleep-lib")(type "KiCad")(uri "${KIPRJMOD}/../components/sleep-lib")(options "")(descr "")) 3 | (lib (name "additional")(type "KiCad")(uri "${KIPRJMOD}/../components/additional")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /rev1/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name "sleep-lib")(type "KiCad")(uri "${KIPRJMOD}/../components/sleep-lib")(options "")(descr "")) 3 | (lib (name "additional")(type "KiCad")(uri "${KIPRJMOD}/../components/additional")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /rev2/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name "sleep-lib")(type "KiCad")(uri "${KIPRJMOD}/../components/sleep-lib")(options "")(descr "")) 3 | (lib (name "additional")(type "KiCad")(uri "${KIPRJMOD}/../components/additional")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/mcuconf.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #pragma once 5 | 6 | #include_next 7 | 8 | #undef STM32_I2C_USE_I2C1 9 | #define STM32_I2C_USE_I2C1 TRUE 10 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/wlhlm.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #pragma once 5 | 6 | #include "quantum.h" 7 | 8 | #include "actuation_point.h" 9 | 10 | typedef union { 11 | uint32_t raw; 12 | struct { 13 | int8_t actuation_point_value; 14 | }; 15 | } keyboard_config_t; 16 | 17 | void fc980c_eeconfig_update_kb(void); 18 | -------------------------------------------------------------------------------- /.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 | 20 | # Netlist files (exported from Eeschema) 21 | *.net 22 | 23 | # Autorouter files (exported from Pcbnew) 24 | *.dsn 25 | *.ses 26 | 27 | # custom 28 | */jlcpcb/gerber 29 | 30 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/config.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #pragma once 5 | 6 | /* Custom matrix pins and port select array */ 7 | #define MATRIX_KEY_ENABLE_PIN A4 8 | #define MATRIX_KEY_STATE_PIN B15 9 | #define MATRIX_KEY_HYS_PIN A8 10 | #define MATRIX_MUX_ROW_PINS {A5, A6, A7} 11 | #define MATRIX_MUX_COL_PINS {B0, B12, B13, B14} 12 | 13 | /* While the original BOM uses an M24C64 EEPROM not directly supported by QMK, 14 | * said EEPROM uses the same parameters as the already supported 24LC64. */ 15 | #define EEPROM_I2C_24LC64 16 | 17 | //#define DEBUG_MATRIX_SCAN_RATE 18 | -------------------------------------------------------------------------------- /rev2/jlcpcb/production_files/BOM-fc980c-controller.csv: -------------------------------------------------------------------------------- 1 | Comment,Designator,Footprint,LCSC 2 | 8MHz Cl 20pF,Y1,Crystal_SMD_5032-2Pin_5.0x3.2mm,C115962 3 | STM32F401CBUx,U2,QFN-48-1EP_7x7mm_P0.5mm_EP5.6x5.6mm,C118825 4 | 100nF,"C11,C12,C13,C14,C15,C5,C6",C_0402_1005Metric,C1525 5 | 20pF,"C10,C9",C_0402_1005Metric,C1554 6 | USB,J2,JST_PH_S5B-PH-K_1x05_P2.00mm_Horizontal,C157923 7 | 1uF,"C3,C4,C8",C_0603_1608Metric,C15849 8 | 4.7uF,C2,C_0603_1608Metric,C19666 9 | 10uF,C7,C_0603_1608Metric,C19702 10 | 10k,"R1,R2,R3,R4",R_0402_1005Metric,C25744 11 | USBLC6-2SC6,U3,SOT-23-6,C2827654 12 | BOOT0,SW1,SW_PUSH_6mm,C2834895 13 | KEYBOARD,J3,HRS_DF14_20P,C506679 14 | 1uF,C1,C_0402_1005Metric,C52923 15 | XC6206P332MR,U1,SOT-23,C5446 16 | 500mA,F1,Fuse_1206_3216Metric,C70076 17 | M24C64-RMN6TP,U4,SOIC-8_3.9x4.9mm_P1.27mm,C79988 18 | SWD,J1,PinHeader_1x05_P2.54mm_Horizontal, 19 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/keymaps/actuation_point_example/readme.md: -------------------------------------------------------------------------------- 1 | Keymap for adjusting the switch acuation point 2 | ============================================== 3 | 4 | This keymap provides custom keycodes that allow adjusting the actuation point of 5 | the Topre switches on the FC980C. The keyboard comes with an actuation point 6 | predefined from the factory. This value will never be touched, rather QMK will 7 | store the custom actuation point value separetely so that it can easily be reset 8 | to the factory value. 9 | 10 | Actuation point adjustment keycodes 11 | ----------------------------------- 12 | 13 | - `AP_UP` - makes the actuation point deeper 14 | - `AP_DN` - makes the actuation point shallower 15 | - `AP_RST` - restores the factory actuation point value 16 | - `AP_PRINT_VAL` - types out the current actuation point value (between 0 and 17 | 63, inclusive) 18 | -------------------------------------------------------------------------------- /components/additional/JLC_tooling_hole.kicad_mod: -------------------------------------------------------------------------------- 1 | (module JLC_tooling_hole (layer F.Cu) (tedit 618EEEFE) 2 | (descr "Mounting Hole 2.1mm, no annular") 3 | (tags "mounting hole 2.1mm no annular") 4 | (attr virtual) 5 | (fp_text reference REF** (at 0 -3.2) (layer F.SilkS) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text value MountingHole_1.152mm (at 0 3.2) (layer F.Fab) 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | ) 11 | (fp_text user %R (at 0.3 0) (layer F.Fab) 12 | (effects (font (size 1 1) (thickness 0.15))) 13 | ) 14 | (fp_circle (center 0 0) (end 2.1 0) (layer Cmts.User) (width 0.15)) 15 | (fp_circle (center 0 0) (end 2.35 0) (layer F.CrtYd) (width 0.05)) 16 | (pad "" np_thru_hole circle (at 0 0) (size 1.152 1.152) (drill 1.152) (layers *.Cu *.Mask) 17 | (solder_mask_margin 0.148) (solder_paste_margin 1.152) (zone_connect 0)) 18 | ) 19 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/actuation_point.h: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // Copyright 2017 Balz Guenat 3 | // SPDX-License-Identifier: GPL-2.0-or-later 4 | 5 | #pragma once 6 | 7 | #include 8 | 9 | // Check out keymaps/actuation_point_example to see how these functions can be used. 10 | // Read current actuation point value 11 | int8_t actuation_point_read_rdac(void); 12 | // Read factory stored actuation point value 13 | int8_t actuation_point_read_eeprom(void); 14 | // Set new actuation point value (discarded on power loss) 15 | int8_t actuation_point_write_rdac(uint8_t value); 16 | 17 | // Adjust current actuation point value (discarded on power loss) 18 | int8_t actuation_point_make_shallower(void); 19 | int8_t actuation_point_make_deeper(void); 20 | int8_t actuation_point_adjust(int8_t offset); 21 | 22 | // Restore factory actuation point value 23 | void actuation_point_reset(void); 24 | -------------------------------------------------------------------------------- /rev1/jlcpcb/production_files/BOM-fc980c-controller.csv: -------------------------------------------------------------------------------- 1 | Comment,Designator,Footprint,LCSC 2 | 8MHz Cl 20pF,Y1,Crystal_SMD_5032-2Pin_5.0x3.2mm,C115962 3 | STM32F401CBUx,U2,QFN-48-1EP_7x7mm_P0.5mm_EP5.6x5.6mm,C118825 4 | 100nF,"C11,C12,C13,C14,C15,C5,C6",C_0402_1005Metric,C1525 5 | 20pF,"C10,C9",C_0402_1005Metric,C1554 6 | USB,J2,JST_PH_S5B-PH-K_1x05_P2.00mm_Horizontal,C157923 7 | 1uF,"C3,C4,C8",C_0603_1608Metric,C15849 8 | 4.7uF,C2,C_0603_1608Metric,C19666 9 | 10uF,C7,C_0603_1608Metric,C19702 10 | 10k,"R1,R2,R3,R7,R8",R_0402_1005Metric,C25744 11 | 200k,R6,R_0402_1005Metric,C25764 12 | USBLC6-2SC6,U3,SOT-23-6,C2827654 13 | BOOT0,SW1,SW_PUSH_6mm,C2834895 14 | PCA9306DC,U5,VSSOP-8_2.3x2mm_P0.5mm,C33196 15 | KEYBOARD,J3,HRS_DF14_20P,C506679 16 | 1uF,C1,C_0402_1005Metric,C52923 17 | XC6206P332MR,U1,SOT-23,C5446 18 | 500mA,F1,Fuse_1206_3216Metric,C70076 19 | M24C64-RMN6TP,U4,SOIC-8_3.9x4.9mm_P1.27mm,C79988 20 | SWD,J1,PinHeader_1x05_P2.54mm_Horizontal, 21 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/wlhlm.c: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #include QMK_KEYBOARD_H 5 | 6 | #include "debug.h" 7 | #include "i2c_master.h" 8 | 9 | #include "actuation_point.h" 10 | 11 | keyboard_config_t fc980c_config; 12 | 13 | void matrix_init_kb(void) { 14 | i2c_init(); // actuation_point 15 | 16 | matrix_init_user(); 17 | } 18 | 19 | void fc980c_eeconfig_update_kb(void) { 20 | dprintf("saving rdac config (%"PRId8") to qmk eeprom\n", fc980c_config.actuation_point_value); 21 | eeconfig_update_kb(fc980c_config.raw); 22 | } 23 | 24 | void eeconfig_init_kb(void) { 25 | fc980c_config.actuation_point_value = -1; 26 | fc980c_eeconfig_update_kb(); 27 | 28 | eeconfig_init_user(); 29 | } 30 | 31 | void keyboard_post_init_kb(void) { 32 | fc980c_config.raw = eeconfig_read_kb(); 33 | 34 | if (fc980c_config.actuation_point_value >= 0) { 35 | actuation_point_write_rdac(fc980c_config.actuation_point_value); 36 | } 37 | 38 | keyboard_post_init_user(); 39 | } 40 | -------------------------------------------------------------------------------- /components/sleep-lib/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Sleepdealer 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 | -------------------------------------------------------------------------------- /rev2/jlcpcb/production_files/CPL-fc980c-controller.csv: -------------------------------------------------------------------------------- 1 | Designator,Val,Package,Mid X,Mid Y,Rotation,Layer 2 | C1,1uF,C_0402_1005Metric,43.7,-21.92,-90.0,top 3 | C2,4.7uF,C_0603_1608Metric,48.725,-14.2,0.0,top 4 | C3,1uF,C_0603_1608Metric,29.975,-27.3,0.0,top 5 | C4,1uF,C_0603_1608Metric,33.0,-24.575,-90.0,top 6 | C5,100nF,C_0402_1005Metric,44.7,-21.92,-90.0,top 7 | C6,100nF,C_0402_1005Metric,67.42,-18.8,180.0,top 8 | C7,10uF,C_0603_1608Metric,48.775,-11.6,0.0,top 9 | C8,1uF,C_0603_1608Metric,35.075,-21.2,0.0,top 10 | C9,20pF,C_0402_1005Metric,38.42,-26.4,180.0,top 11 | C10,20pF,C_0402_1005Metric,41.88,-26.4,0.0,top 12 | C11,100nF,C_0402_1005Metric,48.48,-12.9,0.0,top 13 | C12,100nF,C_0402_1005Metric,36.8,-19.42,-90.0,top 14 | C13,100nF,C_0402_1005Metric,39.38,-11.1,0.0,top 15 | C14,100nF,C_0402_1005Metric,38.52,-21.0,180.0,top 16 | C15,100nF,C_0402_1005Metric,37.22,-12.3,180.0,top 17 | F1,500mA,Fuse_1206_3216Metric,16.6,-22.2,180.0,top 18 | R1,10k,R_0402_1005Metric,48.49,-15.5,0.0,top 19 | R2,10k,R_0402_1005Metric,45.7,-21.91,-90.0,top 20 | R3,10k,R_0402_1005Metric,18.91,-14.5,0.0,top 21 | R4,10k,R_0402_1005Metric,67.39,-19.9,180.0,top 22 | U1,XC6206P332MR,SOT-23,30.1625,-24.75,0.0,top 23 | U2,STM32F401CBUx,QFN-48-1EP_7x7mm_P0.5mm_EP5.6x5.6mm,42.5,-16.0,0.0,top 24 | U3,USBLC6-2SC6,SOT-23-6,16.5125,-18.35,90.0,top 25 | U4,M24C64-RMN6TP,SOIC-8_3.9x4.9mm_P1.27mm,65.9,-14.4,180.0,top 26 | Y1,8MHz Cl 20pF,Crystal_SMD_5032-2Pin_5.0x3.2mm,40.05,-24.0,180.0,top 27 | -------------------------------------------------------------------------------- /rev1/jlcpcb/production_files/CPL-fc980c-controller.csv: -------------------------------------------------------------------------------- 1 | Designator,Val,Package,Mid X,Mid Y,Rotation,Layer 2 | C1,1uF,C_0402_1005Metric,43.7,-21.92,-90.0,top 3 | C2,4.7uF,C_0603_1608Metric,48.725,-14.2,0.0,top 4 | C3,1uF,C_0603_1608Metric,29.975,-27.3,0.0,top 5 | C4,1uF,C_0603_1608Metric,33.0,-24.575,-90.0,top 6 | C5,100nF,C_0402_1005Metric,44.7,-21.92,-90.0,top 7 | C6,100nF,C_0402_1005Metric,67.9,-13.71,90.0,top 8 | C7,10uF,C_0603_1608Metric,48.775,-11.6,0.0,top 9 | C8,1uF,C_0603_1608Metric,35.075,-21.2,0.0,top 10 | C9,20pF,C_0402_1005Metric,38.42,-26.4,180.0,top 11 | C10,20pF,C_0402_1005Metric,41.88,-26.4,0.0,top 12 | C11,100nF,C_0402_1005Metric,48.48,-12.9,0.0,top 13 | C12,100nF,C_0402_1005Metric,36.8,-19.42,-90.0,top 14 | C13,100nF,C_0402_1005Metric,39.6,-10.8,0.0,top 15 | C14,100nF,C_0402_1005Metric,38.52,-21.0,180.0,top 16 | C15,100nF,C_0402_1005Metric,37.22,-12.3,180.0,top 17 | F1,500mA,Fuse_1206_3216Metric,16.6,-22.2,180.0,top 18 | R1,10k,R_0402_1005Metric,48.49,-15.5,0.0,top 19 | R2,10k,R_0402_1005Metric,45.7,-21.91,-90.0,top 20 | R3,10k,R_0402_1005Metric,18.91,-14.5,0.0,top 21 | R6,200k,R_0402_1005Metric,67.31,-19.4,180.0,top 22 | R7,10k,R_0402_1005Metric,63.49,-15.5,0.0,top 23 | R8,10k,R_0402_1005Metric,65.51,-15.5,180.0,top 24 | U1,XC6206P332MR,SOT-23,30.1625,-24.75,0.0,top 25 | U2,STM32F401CBUx,QFN-48-1EP_7x7mm_P0.5mm_EP5.6x5.6mm,42.5,-16.0,0.0,top 26 | U3,USBLC6-2SC6,SOT-23-6,16.5125,-18.35,90.0,top 27 | U4,M24C64-RMN6TP,SOIC-8_3.9x4.9mm_P1.27mm,64.665,-10.925,180.0,top 28 | U5,PCA9306DC,VSSOP-8_2.3x2mm_P0.5mm,65.05,-18.35,90.0,top 29 | Y1,8MHz Cl 20pF,Crystal_SMD_5032-2Pin_5.0x3.2mm,40.05,-24.0,180.0,top 30 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/readme.md: -------------------------------------------------------------------------------- 1 | # Leopold FC980C replacement controller 2 | 3 | ![wlhlm FC980C replacement controller render](https://i.imgur.com/5AW0DTm.png) 4 | 5 | * Keyboard Maintainer: [wlhlm](https://github.com/wlhlm) 6 | * Hardware Supported: rev. 1, rev. 2 7 | * [PCB Source](https://github.com/wlhlm/fc980c-controller/) 8 | 9 | Make example for this keyboard (after setting up your build environment): 10 | 11 | make leopold/fc980c/wlhlm: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 | ## Flashing the firmware onto the keyboard 16 | 17 | To be able to flash the controller, it first has to be brought into bootloader mode. There are three ways this can be accomplished: 18 | 19 | - Hold the `BOOT0` button at the back of the controller board (also accessible with the case installed) pressed while plugging the board into USB. 20 | - Hold the `Escape` key while plugging the board into USB (requires QMK to already be flashed onto the controller). 21 | - Press `Fn+Esc` (requires QMK to already be flashed onto the controller). 22 | 23 | After entering bootloader mode, new firmware can be flashed. Make example for flashing this keyboard: 24 | 25 | make leopold/fc980c/wlhlm:default:flash 26 | 27 | ## Actuation point adjustment 28 | 29 | Topre keyboards such as the FC980C are based around capacitive sense and allow adjustment of the actuation point. This feature is not supported by the stock FC980C controller, this replacement controller however unlocks said functionality. Check the `actuation_point_example` keymap for guidance. 30 | 31 | 32 | -------------------------------------------------------------------------------- /firmware/README.md: -------------------------------------------------------------------------------- 1 | Leopold FC980C replacement controller firmware 2 | ============================================== 3 | 4 | This repository provides [QMK firmware][QMK] configuration files, which as of 5 | this writing have not been incorporated into the main QMK repository. 6 | 7 | Building QMK configurations that are not part of the main repository is a bit of 8 | a nuisance as the official configurator cannot be used and the setup for local 9 | builds requires additional manual steps. Because of this, premade firmware 10 | binaries is provided, but is is recommended to build their own your firmware. No 11 | effort is made to keep the binaries up to date. 12 | 13 | [QMK]: https://qmk.fm/ 14 | 15 | Building QMK 16 | ------------ 17 | 18 | QMK is a fast moving project and a such it is not guaranteed that using the 19 | firmware config in this repository will work with the latest main branch of QMK. 20 | Because of that, this repository includes the main QMK repository as a submodule 21 | pinned to a specific version verified to work with this config. 22 | 23 | For git to download the QMK submodule you either have to clone this repository 24 | recursively 25 | 26 | ```bash 27 | $ git clone --recursive "https://github.com/wlhlm/fc980c-controller.git" 28 | ``` 29 | 30 | or recursively initialize the submodule if you've already done the clone 31 | non-recursively. 32 | 33 | ```bash 34 | $ git submodule update --init --recursive 35 | ``` 36 | 37 | After initializing the QMK submodule you can either symlink or copy the contents 38 | of the `keyboard` directory into QMK's `keyboards` directory. 39 | 40 | After this the firmware can be built like normal using either `make` 41 | 42 | ```bash 43 | $ make leopold/fc980c/wlhlm:default 44 | ``` 45 | 46 | or the QMK CLI (just make sure that the CLI uses this QMK submodule rather than 47 | your normal QMK repository by running 48 | `qmk config user.qmk_home=`). 49 | 50 | Flashing the firmware 51 | --------------------- 52 | 53 | Before flashing, the bootloader must be entered. This can be achieved by 54 | keeping the BOOT0 button pressed while plugging the keyboard in. 55 | 56 | Flashing is done the same it is done for flashing QMK using `make` or the QMK 57 | CLI. 58 | 59 | The premade firmware images can be flashed using the QMK CLI (via 60 | `qmk flash leopold_fc980c_wlhlm_default.bin`), QMK Toolbox, or directly using 61 | `dfu-util`: 62 | 63 | ```bash 64 | $ dfu-util -d 0483:DF11 -a 0 -s 0x08000000:leave -D leopold_fc980c_wlhlm_default.bin 65 | 66 | ``` 67 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/keymaps/default/keymap.c: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #include "debug.h" 5 | 6 | #include QMK_KEYBOARD_H 7 | 8 | enum layer_names { 9 | _BASE_LAYER, 10 | _FUNCTION_LAYER 11 | }; 12 | 13 | #define FN MO(_FUNCTION_LAYER) 14 | 15 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 16 | [_BASE_LAYER] = LAYOUT( 17 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, KC_PGUP, KC_PGDN, 18 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, 19 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, 20 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, 21 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, 22 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, FN, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT 23 | ), 24 | 25 | [_FUNCTION_LAYER] = LAYOUT( 26 | QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, KC_HOME, KC_END, 27 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 28 | _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______, _______, _______, _______, 29 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 30 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, 31 | _______, _______, _______, _______, _______, KC_APP, _______, KC_HOME, KC_PGDN, KC_END, _______, _______ 32 | ) 33 | }; 34 | 35 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/actuation_point.c: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // based on work by Jun Wako and Balz Guenat 3 | // SPDX-License-Identifier: GPL-2.0-or-later 4 | 5 | #include "actuation_point.h" 6 | 7 | #include "i2c_master.h" 8 | #include "debug.h" 9 | #include "util.h" 10 | #include "wait.h" 11 | 12 | #include QMK_KEYBOARD_H 13 | 14 | #define ACTUATION_POINT_I2C_TIMEOUT 100 15 | 16 | /////////////////////////////////////////////////////////////////////////////// 17 | // 18 | // AD5258 I2C digital potentiometer 19 | // https://www.analog.com/media/en/technical-documentation/data-sheets/AD5258.pdf 20 | // 21 | #define AD5258_ADDR (0b0011000 << 1) // QMK I2C API requires shifting the address one bit to the left 22 | #define AD5258_INST_RDAC 0x00 23 | #define AD5258_INST_EEPROM 0x20 24 | #define AD5258_INST_NOP 0x80 25 | #define AD5258_INST_RESTORE 0xA0 26 | 27 | #define AD5258_RDAC_MAX 63 28 | #define AD5258_RDAC_MIN 0 29 | 30 | // read RDAC register 31 | int8_t actuation_point_read_rdac(void) { 32 | uint8_t ret = 0; 33 | 34 | i2c_status_t e = i2c_read_register(AD5258_ADDR, AD5258_INST_RDAC, &ret, 1, ACTUATION_POINT_I2C_TIMEOUT); 35 | if (e != I2C_STATUS_SUCCESS) { 36 | return -1; 37 | } 38 | 39 | return MIN(AD5258_RDAC_MAX, ret); 40 | }; 41 | 42 | int8_t actuation_point_read_eeprom(void) { 43 | uint8_t ret = 0; 44 | 45 | i2c_status_t e = i2c_read_register(AD5258_ADDR, AD5258_INST_EEPROM, &ret, 1, ACTUATION_POINT_I2C_TIMEOUT); 46 | if (e != I2C_STATUS_SUCCESS) { 47 | return -1; 48 | } 49 | 50 | return MIN(AD5258_RDAC_MAX, ret); 51 | }; 52 | 53 | int8_t actuation_point_write_rdac(uint8_t value) { 54 | value = MIN(AD5258_RDAC_MAX, value); 55 | i2c_status_t e = i2c_write_register(AD5258_ADDR, AD5258_INST_RDAC, &value, 1, ACTUATION_POINT_I2C_TIMEOUT); 56 | if (e == I2C_STATUS_SUCCESS) { 57 | return value; 58 | } else if (e == I2C_STATUS_TIMEOUT) { 59 | dprintf("actuation_point_write_rdac: timeout\n"); 60 | } else if (e == I2C_STATUS_ERROR) { 61 | dprintf("actuation_point_write_rdac: error\n"); 62 | } 63 | 64 | return -1; 65 | }; 66 | 67 | int8_t actuation_point_adjust(int8_t offset) { 68 | int8_t r = -1; 69 | int8_t rdac = actuation_point_read_rdac(); 70 | 71 | if (rdac >= 0) { 72 | uint8_t rdac_new = rdac + offset; 73 | 74 | if (offset > 0) { 75 | r = actuation_point_write_rdac(MIN(AD5258_RDAC_MAX, rdac_new)); 76 | } else if (offset < 0) { 77 | r = actuation_point_write_rdac(MAX(AD5258_RDAC_MIN, rdac_new)); 78 | } 79 | } 80 | 81 | return r; 82 | } 83 | 84 | int8_t actuation_point_make_shallower(void) { 85 | return actuation_point_adjust(-1); 86 | }; 87 | 88 | int8_t actuation_point_make_deeper(void) { 89 | return actuation_point_adjust(1); 90 | }; 91 | 92 | void actuation_point_reset(void) { 93 | i2c_status_t e = i2c_write_register(AD5258_ADDR, AD5258_INST_RESTORE, NULL, 0, ACTUATION_POINT_I2C_TIMEOUT); 94 | if (e == I2C_STATUS_TIMEOUT) { 95 | dprintf("actuation_point_reset: timeout\n"); 96 | } else if (e == I2C_STATUS_ERROR) { 97 | dprintf("actuation_point_reset: error\n"); 98 | } else { 99 | wait_us(350); // datasheet specifies 300us restore interval 100 | i2c_write_register(AD5258_ADDR, AD5258_INST_NOP, NULL, 0, ACTUATION_POINT_I2C_TIMEOUT); // recommended in datasheet 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/matrix.c: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // Copyright 2019 Evy Dekkers 3 | // Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar 4 | // SPDX-License-Identifier: GPL-2.0-or-later 5 | 6 | #include "matrix.h" 7 | #include "gpio.h" 8 | #include "util.h" 9 | #include "wait.h" 10 | 11 | static const pin_t row_pins[] = MATRIX_MUX_ROW_PINS; 12 | static const pin_t col_pins[] = MATRIX_MUX_COL_PINS; 13 | 14 | static inline void KEY_ENABLE_on(void) { gpio_write_pin_low(MATRIX_KEY_ENABLE_PIN); } 15 | static inline void KEY_ENABLE_off(void) { gpio_write_pin_high(MATRIX_KEY_ENABLE_PIN); } 16 | static inline void KEY_HYS_on(void) { gpio_write_pin_high(MATRIX_KEY_HYS_PIN); } 17 | static inline void KEY_HYS_off(void) { gpio_write_pin_low(MATRIX_KEY_HYS_PIN); } 18 | 19 | static void set_row(int row) { 20 | gpio_write_pin(row_pins[0], row & 0b00000001); 21 | gpio_write_pin(row_pins[1], row & 0b00000010); 22 | gpio_write_pin(row_pins[2], row & 0b00000100); 23 | } 24 | 25 | static void set_col(int col) { 26 | gpio_write_pin(col_pins[0], col & 0b00000001); 27 | gpio_write_pin(col_pins[1], col & 0b00000010); 28 | gpio_write_pin(col_pins[2], col & 0b00000100); 29 | gpio_write_pin(col_pins[3], col & 0b00001000); 30 | } 31 | 32 | static bool read_rows_on_col(matrix_row_t current_matrix[], int current_col) { 33 | bool matrix_changed = false; 34 | 35 | set_col(current_col); 36 | 37 | for (int row_index = 0; row_index < MATRIX_ROWS; row_index++) { 38 | // store last value of row prior to reading 39 | matrix_row_t last_row_value = current_matrix[row_index]; 40 | 41 | set_row(row_index); 42 | 43 | if (last_row_value & (1 << current_col)) { 44 | KEY_HYS_on(); 45 | } 46 | matrix_output_select_delay(); 47 | 48 | KEY_ENABLE_on(); 49 | wait_us(2); 50 | 51 | // KEY_STATE is only valid for 20us after KEY_ENABLE 52 | if (!gpio_read_pin(MATRIX_KEY_STATE_PIN)) { 53 | // pin LO, set col bit 54 | current_matrix[row_index] |= (MATRIX_ROW_SHIFTER << current_col); 55 | } else { 56 | // pin HI, clear col bit 57 | current_matrix[row_index] &= ~(MATRIX_ROW_SHIFTER << current_col); 58 | } 59 | 60 | KEY_HYS_off(); 61 | KEY_ENABLE_off(); 62 | 63 | // KEY_STATE keeps its state for 20us after KEY_ENABLE. Wait for 25us or 64 | // more to make sure KEY_STATE returns to idle state. 65 | wait_us(25); 66 | 67 | // determine if the matrix changed state 68 | if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) { 69 | matrix_changed = true; 70 | } 71 | } 72 | 73 | return matrix_changed; 74 | } 75 | 76 | void matrix_init_custom(void) { 77 | gpio_set_pin_input(MATRIX_KEY_STATE_PIN); // uses external pullup 78 | gpio_set_pin_output(MATRIX_KEY_HYS_PIN); 79 | gpio_set_pin_output(MATRIX_KEY_ENABLE_PIN); 80 | 81 | for (int i = 0; i < ARRAY_SIZE(row_pins); i++) { 82 | gpio_set_pin_output(row_pins[i]); 83 | } 84 | for (int i = 0; i < ARRAY_SIZE(col_pins); i++) { 85 | gpio_set_pin_output(col_pins[i]); 86 | } 87 | 88 | KEY_ENABLE_off(); 89 | KEY_HYS_off(); 90 | } 91 | 92 | bool matrix_scan_custom(matrix_row_t current_matrix[]) { 93 | bool changed = false; 94 | 95 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { 96 | changed |= read_rows_on_col(current_matrix, current_col); 97 | } 98 | 99 | return changed; 100 | } 101 | 102 | -------------------------------------------------------------------------------- /components/additional/HRS_DF14_20P.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "HRS_DF14_20P" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 58AEA20F) 4 | (descr "http://www.mouser.com/ds/2/185/e53800017-12550.pdf") 5 | (tags "HHKB JP, HRS, Hirose, DF14, 15P") 6 | (attr through_hole) 7 | (fp_text reference "HRS_DF14_20P" (at -3.2 0.5) (layer "F.SilkS") 8 | (effects (font (size 0.8 0.8) (thickness 0.15))) 9 | (tstamp a18f6dcb-6a08-476e-958f-3f2e75cd7aa5) 10 | ) 11 | (fp_text value "VAL**" (at -3.1 6.1) (layer "F.SilkS") 12 | (effects (font (size 0.8 0.8) (thickness 0.15))) 13 | (tstamp d01f487c-a601-40f8-ae9a-d3028d3d9dd8) 14 | ) 15 | (pad "" np_thru_hole circle (at -15.1 2.4) (size 1.1 1.1) (drill 1.1) (layers *.Cu *.Mask) (tstamp 5f4e6bc8-6d50-42b7-ba75-9e59306f78b6)) 16 | (pad "" np_thru_hole circle (at 13.85 2.4) (size 1.1 1.1) (drill 1.1) (layers *.Cu *.Mask) (tstamp 63135682-ed9a-45f5-a38c-cb2b18529c3c)) 17 | (pad "1" smd rect (at 11.25 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 4817fea2-0624-4628-b16b-a95d902bc078)) 18 | (pad "2" smd rect (at 10 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp b7de6eea-e615-479f-85bc-54f095b1aad7)) 19 | (pad "3" smd rect (at 8.75 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 1cc8ca4f-ef42-4765-bd4b-c5816e3359b9)) 20 | (pad "4" smd rect (at 7.5 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 7f56a675-778b-4cb0-9637-95e9c471f78d)) 21 | (pad "5" smd rect (at 6.25 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 2bd6a254-8eb6-4834-80d5-a432b5dd5426)) 22 | (pad "6" smd rect (at 5 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 39dd65b8-4545-4047-9f5a-71ee8338a653)) 23 | (pad "7" smd rect (at 3.75 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp e362856c-46b6-47f4-b999-20ef38cfecd0)) 24 | (pad "8" smd rect (at 2.5 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 46781148-6bc0-4ef4-a5f1-2a4802a95caf)) 25 | (pad "9" smd rect (at 1.25 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 31c867b4-8da0-4c01-82c7-3a87d3690e0f)) 26 | (pad "10" smd rect (at 0 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 116a48f5-8875-4e03-849c-d7d8d7a3d986)) 27 | (pad "11" smd rect (at -1.25 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 24f7f0fc-95f7-4151-bbe4-585418dc21a6)) 28 | (pad "12" smd rect (at -2.5 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp f7c81378-8a7a-4dd8-9ba2-c181ea13947f)) 29 | (pad "13" smd rect (at -3.75 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp b580140f-7a03-4e86-afeb-7301b55c6e7f)) 30 | (pad "14" smd rect (at -5 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 2e8a2269-9890-4608-98c5-bceeb4e3c01f)) 31 | (pad "15" smd rect (at -6.25 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp be29e500-901d-4601-8838-3f11721a7595)) 32 | (pad "16" smd rect (at -7.5 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 0cc0c40e-52e4-4239-a42e-ec0bdce48bdb)) 33 | (pad "17" smd rect (at -8.75 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 03d100d8-ed8c-41b9-92cc-0f0439711c17)) 34 | (pad "18" smd rect (at -10 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 179cdec9-1ce4-4a1e-a9a6-ebba156ccac1)) 35 | (pad "19" smd rect (at -11.25 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 18b211d1-86d6-4f9a-9760-0a7c2614e698)) 36 | (pad "20" smd rect (at -12.5 3.5) (size 0.7 1.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp b4c9f286-50f4-4920-83ce-e3df93020d7c)) 37 | (pad "21" smd rect (at -14.9 -1.6) (size 2 2.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp e3f0309a-3b76-4d94-8ff9-85ee991e7582)) 38 | (pad "22" smd rect (at 13.65 -1.6) (size 2 2.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 672382d3-0832-453f-9b12-4c0e10588d3d)) 39 | ) 40 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/keymaps/actuation_point_example/keymap.c: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #include 5 | 6 | #include "debug.h" 7 | 8 | #include QMK_KEYBOARD_H 9 | 10 | extern keyboard_config_t fc980c_config; 11 | 12 | enum layer_names { 13 | _BASE_LAYER, 14 | _FUNCTION_LAYER 15 | }; 16 | 17 | enum custom_keycodes { 18 | AP_UP = SAFE_RANGE, // make actuation point deeper 19 | AP_DN, // make actuation point shallower 20 | AP_RST, // reset actuation point to factory value 21 | AP_PRINT_VAL // type current actuation point value (max 63) 22 | }; 23 | 24 | #define FN MO(_FUNCTION_LAYER) 25 | 26 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 27 | [_BASE_LAYER] = LAYOUT( 28 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, KC_PGUP, KC_PGDN, 29 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, 30 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, 31 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, 32 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, 33 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, FN, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT 34 | ), 35 | 36 | [_FUNCTION_LAYER] = LAYOUT( 37 | QK_BOOT, AP_PRINT_VAL, AP_DN, AP_UP, AP_RST, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, KC_HOME, KC_END, 38 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 39 | _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______, _______, _______, _______, 40 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 41 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, 42 | _______, _______, _______, _______, _______, KC_APP, _______, KC_HOME, KC_PGDN, KC_END, _______, _______ 43 | ) 44 | }; 45 | 46 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { 47 | if (record->event.pressed) { 48 | int8_t r_val; 49 | 50 | switch (keycode) { 51 | case AP_UP: 52 | r_val = actuation_point_make_deeper(); 53 | if (r_val >= 0) fc980c_config.actuation_point_value = r_val; 54 | fc980c_eeconfig_update_kb(); 55 | break; 56 | case AP_DN: 57 | r_val = actuation_point_make_shallower(); 58 | if (r_val >= 0) fc980c_config.actuation_point_value = r_val; 59 | fc980c_eeconfig_update_kb(); 60 | break; 61 | case AP_RST: 62 | actuation_point_reset(); 63 | eeconfig_init_kb(); 64 | break; 65 | case AP_PRINT_VAL: 66 | dprintf("actuation_point (AD5258): rdac %"PRId8", eeprom %"PRId8"\n", actuation_point_read_rdac(), actuation_point_read_eeprom()); 67 | #ifdef SEND_STRING_ENABLE 68 | char rdac_buf[3]; 69 | snprintf(rdac_buf, sizeof(rdac_buf), "%"PRId8, actuation_point_read_rdac()); 70 | send_string(rdac_buf); 71 | #endif 72 | break; 73 | } 74 | } 75 | 76 | return true; 77 | } 78 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/keymaps/wlhlm/keymap.c: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Wilhelm Schuster 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #include 5 | 6 | #include "debug.h" 7 | 8 | #include QMK_KEYBOARD_H 9 | 10 | extern keyboard_config_t fc980c_config; 11 | 12 | enum layer_names { 13 | KM_BASE_LAYER, 14 | KM_FUNCTION_LAYER 15 | }; 16 | 17 | enum custom_keycodes { 18 | AP_UP = SAFE_RANGE, // make actuation point deeper 19 | AP_DN, // make actuation point shallower 20 | AP_RST, // reset actuation point to factory value 21 | AP_PRINT_VAL // type out current actuation point value (max 63) 22 | }; 23 | 24 | #define FN MO(KM_FUNCTION_LAYER) 25 | 26 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 27 | [KM_BASE_LAYER] = LAYOUT( 28 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, KC_PGUP, KC_PGDN, 29 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, 30 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, 31 | KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, 32 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, 33 | KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, FN, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT 34 | ), 35 | 36 | [KM_FUNCTION_LAYER] = LAYOUT( 37 | QK_BOOT, AP_PRINT_VAL, AP_DN, AP_UP, AP_RST, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, KC_HOME, KC_END, 38 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 39 | _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______, _______, _______, _______, 40 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 41 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, 42 | _______, _______, _______, _______, _______, KC_APP, _______, KC_HOME, KC_PGDN, KC_END, _______, _______ 43 | ), 44 | }; 45 | 46 | void keyboard_post_init_user(void) { 47 | debug_enable = true; 48 | debug_matrix = false; 49 | debug_keyboard = false; 50 | } 51 | 52 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { 53 | if (record->event.pressed) { 54 | int8_t r_val; 55 | 56 | switch (keycode) { 57 | case AP_UP: 58 | r_val = actuation_point_make_deeper(); 59 | if (r_val >= 0) fc980c_config.actuation_point_value = r_val; 60 | fc980c_eeconfig_update_kb(); 61 | break; 62 | case AP_DN: 63 | r_val = actuation_point_make_shallower(); 64 | if (r_val >= 0) fc980c_config.actuation_point_value = r_val; 65 | fc980c_eeconfig_update_kb(); 66 | break; 67 | case AP_RST: 68 | actuation_point_reset(); 69 | eeconfig_init_kb(); 70 | break; 71 | case AP_PRINT_VAL: 72 | dprintf("acutation_point (AD5258): rdac %"PRId8", eeprom %"PRId8"\n", actuation_point_read_rdac(), actuation_point_read_eeprom()); 73 | #ifdef SEND_STRING_ENABLE 74 | char rdac_buf[3]; 75 | snprintf(rdac_buf, sizeof(rdac_buf), "%"PRId8, actuation_point_read_rdac()); 76 | send_string(rdac_buf); 77 | #endif 78 | break; 79 | default: 80 | dprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %u, time: %5u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time); 81 | break; 82 | } 83 | } 84 | 85 | return true; 86 | } 87 | -------------------------------------------------------------------------------- /firmware/keyboards/leopold/fc980c/wlhlm/keyboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "manufacturer": "Leopold", 3 | "keyboard_name": "FC980C (wlhlm, QMK)", 4 | "url": "https://github.com/wlhlm/fc980c-controller", 5 | "maintainer": "wlhlm", 6 | 7 | "usb": { 8 | "vid": "0xFEED", 9 | "pid": "0xF980", 10 | "device_version": "2.0.0", 11 | 12 | "max_power": 100 13 | }, 14 | 15 | "processor": "STM32F401", 16 | "bootloader": "stm32-dfu", 17 | 18 | "features": { 19 | "bootmagic": true, 20 | "mousekey": true, 21 | "extrakey": true, 22 | "nkro": true, 23 | "console": true 24 | }, 25 | 26 | "eeprom": { 27 | "driver": "i2c" 28 | }, 29 | 30 | "build": { 31 | "lto": true 32 | }, 33 | 34 | "matrix_size": { 35 | "rows": 8, 36 | "cols": 16 37 | }, 38 | 39 | "debounce": 0, 40 | 41 | "bootmagic": { 42 | "matrix": [0, 13] 43 | }, 44 | 45 | "indicators": { 46 | "num_lock": "A3", 47 | "caps_lock": "A2", 48 | "scroll_lock": "A1" 49 | }, 50 | 51 | "layouts": { 52 | "LAYOUT": { 53 | "layout": [ 54 | {"label":"Esc", "x":0, "y":0, "matrix": [0, 13]}, 55 | {"label":"F1", "x":2, "y":0, "matrix": [2, 13]}, 56 | {"label":"F2", "x":3, "y":0, "matrix": [5, 13]}, 57 | {"label":"F3", "x":4, "y":0, "matrix": [3, 13]}, 58 | {"label":"F4", "x":5, "y":0, "matrix": [6, 13]}, 59 | {"label":"F5", "x":6.5, "y":0, "matrix": [7, 13]}, 60 | {"label":"F6", "x":7.5, "y":0, "matrix": [7, 15]}, 61 | {"label":"F7", "x":8.5, "y":0, "matrix": [7, 14]}, 62 | {"label":"F8", "x":9.5, "y":0, "matrix": [7, 12]}, 63 | {"label":"F9", "x":11, "y":0, "matrix": [7, 2]}, 64 | {"label":"F10", "x":12, "y":0, "matrix": [7, 1]}, 65 | {"label":"F11", "x":13, "y":0, "matrix": [7, 0]}, 66 | {"label":"F12", "x":14, "y":0, "matrix": [7, 3]}, 67 | {"label":"Delete", "x":15.5, "y":0, "matrix": [7, 4]}, 68 | {"label":"Insert", "x":16.5, "y":0, "matrix": [7, 6]}, 69 | {"label":"Page Up", "x":17.5, "y":0, "matrix": [7, 7]}, 70 | {"label":"Page Down", "x":18.5, "y":0, "matrix": [7, 5]}, 71 | 72 | {"label":"`", "x":0, "y":1.5, "matrix": [0, 10]}, 73 | {"label":"1", "x":1, "y":1.5, "matrix": [6, 9]}, 74 | {"label":"2", "x":2, "y":1.5, "matrix": [5, 9]}, 75 | {"label":"3", "x":3, "y":1.5, "matrix": [5, 8]}, 76 | {"label":"4", "x":4, "y":1.5, "matrix": [5, 11]}, 77 | {"label":"5", "x":5, "y":1.5, "matrix": [6, 15]}, 78 | {"label":"6", "x":6, "y":1.5, "matrix": [5, 15]}, 79 | {"label":"7", "x":7, "y":1.5, "matrix": [5, 14]}, 80 | {"label":"8", "x":8, "y":1.5, "matrix": [6, 12]}, 81 | {"label":"9", "x":9, "y":1.5, "matrix": [5, 12]}, 82 | {"label":"0", "x":10, "y":1.5, "matrix": [5, 2]}, 83 | {"label":"-", "x":11, "y":1.5, "matrix": [5, 1]}, 84 | {"label":"=", "x":12, "y":1.5, "matrix": [5, 0]}, 85 | {"label":"Backspace", "x":13, "y":1.5, "w":2, "matrix": [5, 5]}, 86 | {"label":"Num Lock", "x":15.5, "y":1.5, "matrix": [5, 4]}, 87 | {"label":"/", "x":16.5, "y":1.5, "matrix": [5, 6]}, 88 | {"label":"*", "x":17.5, "y":1.5, "matrix": [5, 7]}, 89 | {"label":"-", "x":18.5, "y":1.5, "matrix": [6, 5]}, 90 | 91 | {"label":"Tab", "x":0, "y":2.5, "w":1.5, "matrix": [6, 10]}, 92 | {"label":"Q", "x":1.5, "y":2.5, "matrix": [3, 9]}, 93 | {"label":"W", "x":2.5, "y":2.5, "matrix": [6, 8]}, 94 | {"label":"E", "x":3.5, "y":2.5, "matrix": [6, 11]}, 95 | {"label":"R", "x":4.5, "y":2.5, "matrix": [3, 11]}, 96 | {"label":"T", "x":5.5, "y":2.5, "matrix": [3, 15]}, 97 | {"label":"Y", "x":6.5, "y":2.5, "matrix": [6, 14]}, 98 | {"label":"U", "x":7.5, "y":2.5, "matrix": [3, 14]}, 99 | {"label":"I", "x":8.5, "y":2.5, "matrix": [3, 12]}, 100 | {"label":"O", "x":9.5, "y":2.5, "matrix": [6, 2]}, 101 | {"label":"P", "x":10.5, "y":2.5, "matrix": [6, 1]}, 102 | {"label":"[", "x":11.5, "y":2.5, "matrix": [6, 0]}, 103 | {"label":"]", "x":12.5, "y":2.5, "matrix": [3, 3]}, 104 | {"label":"\\", "x":13.5, "y":2.5, "w":1.5, "matrix": [5, 3]}, 105 | {"label":"7", "x":15.5, "y":2.5, "matrix": [6, 4]}, 106 | {"label":"8", "x":16.5, "y":2.5, "matrix": [6, 6]}, 107 | {"label":"9", "x":17.5, "y":2.5, "matrix": [6, 7]}, 108 | {"label":"+", "x":18.5, "y":2.5, "h":2, "matrix": [2, 5]}, 109 | 110 | {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75, "matrix": [3, 10]}, 111 | {"label":"A", "x":1.75, "y":3.5, "matrix": [2, 9]}, 112 | {"label":"S", "x":2.75, "y":3.5, "matrix": [3, 8]}, 113 | {"label":"D", "x":3.75, "y":3.5, "matrix": [2, 8]}, 114 | {"label":"F", "x":4.75, "y":3.5, "matrix": [2, 11]}, 115 | {"label":"G", "x":5.75, "y":3.5, "matrix": [2, 15]}, 116 | {"label":"H", "x":6.75, "y":3.5, "matrix": [2, 14]}, 117 | {"label":"J", "x":7.75, "y":3.5, "matrix": [2, 12]}, 118 | {"label":"K", "x":8.75, "y":3.5, "matrix": [1, 12]}, 119 | {"label":"L", "x":9.75, "y":3.5, "matrix": [3, 2]}, 120 | {"label":";", "x":10.75, "y":3.5, "matrix": [3, 1]}, 121 | {"label":"'", "x":11.75, "y":3.5, "matrix": [2, 0]}, 122 | {"label":"Enter", "x":12.75, "y":3.5, "w":2.25, "matrix": [6, 3]}, 123 | {"label":"4", "x":15.5, "y":3.5, "matrix": [2, 4]}, 124 | {"label":"5", "x":16.5, "y":3.5, "matrix": [2, 6]}, 125 | {"label":"6", "x":17.5, "y":3.5, "matrix": [2, 7]}, 126 | 127 | {"label":"Shift", "x":0, "y":4.5, "w":2.25, "matrix": [2, 10]}, 128 | {"label":"Z", "x":2.25, "y":4.5, "matrix": [1, 8]}, 129 | {"label":"X", "x":3.25, "y":4.5, "matrix": [0, 8]}, 130 | {"label":"C", "x":4.25, "y":4.5, "matrix": [1, 11]}, 131 | {"label":"V", "x":5.25, "y":4.5, "matrix": [0, 11]}, 132 | {"label":"B", "x":6.25, "y":4.5, "matrix": [1, 15]}, 133 | {"label":"N", "x":7.25, "y":4.5, "matrix": [1, 14]}, 134 | {"label":"M", "x":8.25, "y":4.5, "matrix": [0, 14]}, 135 | {"label":",", "x":9.25, "y":4.5, "matrix": [2, 2]}, 136 | {"label":".", "x":10.25, "y":4.5, "matrix": [1, 1]}, 137 | {"label":"/", "x":11.25, "y":4.5, "matrix": [2, 1]}, 138 | {"label":"Shift", "x":12.25, "y":4.5, "w":1.75, "matrix": [3, 0]}, 139 | {"label":"Up", "x":14.25, "y":4.75, "matrix": [3, 4]}, 140 | {"label":"1", "x":15.5, "y":4.5, "matrix": [1, 4]}, 141 | {"label":"2", "x":16.5, "y":4.5, "matrix": [1, 6]}, 142 | {"label":"3", "x":17.5, "y":4.5, "matrix": [1, 7]}, 143 | {"label":"Enter", "x":18.5, "y":4.5, "h":2, "matrix": [1, 5]}, 144 | 145 | {"label":"Ctrl", "x":0, "y":5.5, "w":1.25, "matrix": [1, 10]}, 146 | {"label":"Win", "x":1.25, "y":5.5, "matrix": [0, 9]}, 147 | {"label":"Alt", "x":2.25, "y":5.5, "w":1.25, "matrix": [1, 9]}, 148 | {"label":"Space", "x":3.5, "y":5.5, "w":6, "matrix": [0, 15]}, 149 | {"label":"Alt", "x":9.5, "y":5.5, "w":1.25, "matrix": [0, 2]}, 150 | {"label":"Ctrl", "x":10.75, "y":5.5, "matrix": [0, 1]}, 151 | {"label":"Fn", "x":11.75, "y":5.5, "w":1.25, "matrix": [1, 0]}, 152 | {"label":"Left", "x":13.25, "y":5.75, "matrix": [0, 0]}, 153 | {"label":"Down", "x":14.25, "y":5.75, "matrix": [0, 4]}, 154 | {"label":"Right", "x":15.25, "y":5.75, "matrix": [0, 6]}, 155 | {"label":"0", "x":16.5, "y":5.5, "matrix": [0, 7]}, 156 | {"label":".", "x":17.5, "y":5.5, "matrix": [0, 5]} 157 | ] 158 | } 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /components/additional/logo.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "LOGO" (version 20210606) (generator bitmap2component) (layer "F.Cu") 2 | (at 0 0) 3 | (attr board_only exclude_from_pos_files exclude_from_bom) 4 | (fp_text reference "G***" (at 0 0) (layer F.SilkS) 5 | (effects (font (thickness 0.3))) 6 | ) 7 | (fp_text value "LOGO" (at 0.75 0) (layer F.SilkS) hide 8 | (effects (font (thickness 0.3))) 9 | ) 10 | (fp_poly (pts (xy 0.087503 -1.677884) (xy 0.209379 -1.667196) (xy 0.249300 -1.661775) (xy 0.368499 -1.639692) (xy 0.484945 -1.609226) (xy 0.598262 -1.570660) (xy 0.708076 -1.524274) (xy 0.814014 -1.470349) 11 | (xy 0.915701 -1.409168) (xy 1.012763 -1.341012) (xy 1.104826 -1.266161) (xy 1.191516 -1.184898) (xy 1.272459 -1.097504) (xy 1.347281 -1.004260) (xy 1.415607 -0.905448) (xy 1.477064 -0.801348) 12 | (xy 1.527651 -0.700202) (xy 1.574238 -0.588021) (xy 1.612390 -0.473250) (xy 1.642087 -0.356402) (xy 1.663309 -0.237991) (xy 1.676037 -0.118531) (xy 1.680252 0.001467) (xy 1.675935 0.121487) 13 | (xy 1.663066 0.241016) (xy 1.641625 0.359542) (xy 1.611594 0.476551) (xy 1.575998 0.583399) (xy 1.529496 0.695954) (xy 1.475470 0.803952) (xy 1.414278 0.907104) (xy 1.346280 1.005122) 14 | (xy 1.271833 1.097714) (xy 1.191296 1.184594) (xy 1.105028 1.265471) (xy 1.013387 1.340057) (xy 0.916732 1.408062) (xy 0.815421 1.469197) (xy 0.709814 1.523173) (xy 0.600267 1.569702) 15 | (xy 0.487141 1.608493) (xy 0.370794 1.639258) (xy 0.251583 1.661708) (xy 0.235850 1.664006) (xy 0.175273 1.671095) (xy 0.109668 1.676164) (xy 0.041848 1.679130) (xy -0.025373 1.679908) 16 | (xy -0.089180 1.678415) (xy -0.139265 1.675242) (xy -0.260514 1.660361) (xy -0.379985 1.636879) (xy -0.497164 1.604999) (xy -0.611539 1.564926) (xy -0.722597 1.516863) (xy -0.829823 1.461016) 17 | (xy -0.932706 1.397587) (xy -1.030733 1.326781) (xy -1.046728 1.314144) (xy -1.140309 1.233641) (xy -1.227046 1.147526) (xy -1.306763 1.056165) (xy -1.379282 0.959927) (xy -1.444426 0.859179) 18 | (xy -1.502018 0.754289) (xy -1.531428 0.690197) (xy -0.974461 0.690197) (xy -0.972822 0.715309) (xy -0.967983 0.744135) (xy -0.967848 0.744803) (xy -0.954080 0.791395) (xy -0.932680 0.834852) 19 | (xy -0.904526 0.874021) (xy -0.870494 0.907749) (xy -0.831463 0.934885) (xy -0.817616 0.942205) (xy -0.771593 0.961006) (xy -0.726729 0.971432) (xy -0.681534 0.973692) (xy -0.634515 0.967997) 20 | (xy -0.634362 0.967967) (xy -0.587886 0.954342) (xy -0.544416 0.932985) (xy -0.505132 0.904791) (xy -0.471214 0.870658) (xy -0.443844 0.831483) (xy -0.436381 0.817463) (xy -0.417019 0.769222) 21 | (xy -0.406634 0.721168) (xy -0.405641 0.687336) (xy -0.280581 0.687336) (xy -0.280448 0.713782) (xy -0.279681 0.733579) (xy -0.278018 0.749055) (xy -0.275200 0.762538) (xy -0.270966 0.776356) 22 | (xy -0.270455 0.777843) (xy -0.250154 0.823417) (xy -0.222739 0.864478) (xy -0.189132 0.900231) (xy -0.150250 0.929881) (xy -0.107014 0.952633) (xy -0.060342 0.967693) (xy -0.047969 0.970213) 23 | (xy -0.015322 0.973227) (xy 0.021353 0.971915) (xy 0.058398 0.966601) (xy 0.091794 0.957738) (xy 0.137329 0.937404) (xy 0.178280 0.909717) (xy 0.213860 0.875469) (xy 0.243288 0.835447) 24 | (xy 0.265778 0.790442) (xy 0.270455 0.777843) (xy 0.274844 0.763863) (xy 0.277792 0.750451) (xy 0.279558 0.735279) (xy 0.280403 0.716018) (xy 0.280470 0.706726) (xy 0.405340 0.706726) 25 | (xy 0.412173 0.754025) (xy 0.427372 0.799590) (xy 0.450817 0.842670) (xy 0.482383 0.882514) (xy 0.489593 0.889961) (xy 0.528421 0.922737) (xy 0.571088 0.947600) (xy 0.616838 0.964317) 26 | (xy 0.664915 0.972658) (xy 0.714563 0.972391) (xy 0.744803 0.968001) (xy 0.791495 0.954325) (xy 0.834714 0.932908) (xy 0.873608 0.904606) (xy 0.907322 0.870274) (xy 0.935002 0.830766) 27 | (xy 0.955792 0.786938) (xy 0.967848 0.744803) (xy 0.972919 0.714336) (xy 0.974452 0.687758) (xy 0.972453 0.660809) (xy 0.967967 0.634361) (xy 0.954318 0.587752) (xy 0.933120 0.544781) 28 | (xy 0.905265 0.506185) (xy 0.871644 0.472698) (xy 0.833148 0.445059) (xy 0.790670 0.424003) (xy 0.745100 0.410265) (xy 0.697330 0.404584) (xy 0.689582 0.404471) (xy 0.641894 0.408836) 29 | (xy 0.595649 0.421446) (xy 0.552023 0.441569) (xy 0.512190 0.468476) (xy 0.477325 0.501437) (xy 0.448602 0.539722) (xy 0.436262 0.561938) (xy 0.417262 0.609932) (xy 0.406996 0.658445) 30 | (xy 0.405340 0.706726) (xy 0.280470 0.706726) (xy 0.280588 0.690340) (xy 0.280580 0.687336) (xy 0.280323 0.661602) (xy 0.279546 0.642557) (xy 0.277951 0.627908) (xy 0.275242 0.615361) 31 | (xy 0.271121 0.602625) (xy 0.268797 0.596403) (xy 0.246547 0.549710) (xy 0.218190 0.508836) (xy 0.184526 0.474165) (xy 0.146352 0.446079) (xy 0.104467 0.424961) (xy 0.059670 0.411194) 32 | (xy 0.012759 0.405159) (xy -0.035467 0.407239) (xy -0.084211 0.417817) (xy -0.095900 0.421664) (xy -0.139917 0.441810) (xy -0.179686 0.469519) (xy -0.214532 0.504109) (xy -0.243782 0.544901) 33 | (xy -0.266763 0.591213) (xy -0.268798 0.596403) (xy -0.273630 0.609944) (xy -0.276921 0.622292) (xy -0.278967 0.635738) (xy -0.280065 0.652577) (xy -0.280513 0.675101) (xy -0.280581 0.687336) 34 | (xy -0.405641 0.687336) (xy -0.405225 0.673165) (xy -0.412793 0.625080) (xy -0.429336 0.576778) (xy -0.436381 0.561549) (xy -0.461125 0.521065) (xy -0.492680 0.485407) (xy -0.529854 0.455315) 35 | (xy -0.571458 0.431527) (xy -0.616300 0.414782) (xy -0.663190 0.405817) (xy -0.689583 0.404471) (xy -0.737407 0.408798) (xy -0.783276 0.421274) (xy -0.826274 0.441138) (xy -0.865481 0.467631) 36 | (xy -0.899980 0.499994) (xy -0.928852 0.537467) (xy -0.951180 0.579291) (xy -0.966045 0.624706) (xy -0.968193 0.634946) (xy -0.972914 0.664756) (xy -0.974461 0.690197) (xy -1.531428 0.690197) 37 | (xy -1.551882 0.645623) (xy -1.593839 0.533549) (xy -1.627713 0.418436) (xy -1.653327 0.300650) (xy -1.670503 0.180559) (xy -1.679065 0.058530) (xy -1.679936 0.007437) (xy 0.404824 0.007437) 38 | (xy 0.408058 0.039335) (xy 0.411382 0.057467) (xy 0.425467 0.104715) (xy 0.447295 0.148152) (xy 0.476166 0.187045) (xy 0.511381 0.220662) (xy 0.552243 0.248271) (xy 0.598052 0.269138) 39 | (xy 0.619950 0.276095) (xy 0.644562 0.280509) (xy 0.674678 0.282277) (xy 0.707260 0.281540) (xy 0.739271 0.278440) (xy 0.767672 0.273118) (xy 0.782761 0.268532) (xy 0.830142 0.246318) 40 | (xy 0.871578 0.217459) (xy 0.906759 0.182274) (xy 0.935371 0.141081) (xy 0.957102 0.094196) (xy 0.958591 0.090046) (xy 0.964698 0.071641) (xy 0.968640 0.056192) (xy 0.970877 0.040632) 41 | (xy 0.971867 0.021897) (xy 0.972072 0.000000) (xy 0.971807 -0.024158) (xy 0.970704 -0.042405) (xy 0.968306 -0.057806) (xy 0.964153 -0.073426) (xy 0.958591 -0.090047) (xy 0.937446 -0.137389) 42 | (xy 0.909391 -0.179073) (xy 0.874754 -0.214769) (xy 0.833862 -0.244143) (xy 0.787042 -0.266863) (xy 0.782761 -0.268491) (xy 0.754188 -0.276321) (xy 0.720457 -0.281166) (xy 0.684944 -0.282852) 43 | (xy 0.651026 -0.281206) (xy 0.624357 -0.276657) (xy 0.575817 -0.259954) (xy 0.532093 -0.236118) (xy 0.493803 -0.205788) (xy 0.461566 -0.169598) (xy 0.435999 -0.128187) (xy 0.417722 -0.082192) 44 | (xy 0.411425 -0.057262) (xy 0.405946 -0.023286) (xy 0.404824 0.007437) (xy -1.679936 0.007437) (xy -1.680063 0.000000) (xy -1.675635 -0.122564) (xy -1.662452 -0.243716) (xy -1.640665 -0.363035) 45 | (xy -1.610427 -0.480103) (xy -1.571888 -0.594500) (xy -1.533953 -0.684945) (xy -0.282852 -0.684945) (xy -0.281206 -0.651026) (xy -0.276657 -0.624358) (xy -0.260149 -0.576552) (xy -0.236473 -0.533140) 46 | (xy -0.206375 -0.494856) (xy -0.170605 -0.462439) (xy -0.129911 -0.436624) (xy -0.085042 -0.418149) (xy -0.060648 -0.411759) (xy -0.017668 -0.405570) (xy 0.023814 -0.406248) (xy 0.057261 -0.411426) 47 | (xy 0.105342 -0.425761) (xy 0.149163 -0.447700) (xy 0.188086 -0.476624) (xy 0.221474 -0.511915) (xy 0.248690 -0.552954) (xy 0.269098 -0.599124) (xy 0.276656 -0.624358) (xy 0.281491 -0.653882) 48 | (xy 0.282834 -0.688078) (xy 0.280861 -0.723569) (xy 0.275744 -0.756980) (xy 0.268490 -0.782762) (xy 0.246356 -0.830075) (xy 0.217540 -0.871488) (xy 0.182374 -0.906674) (xy 0.141190 -0.935306) 49 | (xy 0.094320 -0.957057) (xy 0.090046 -0.958592) (xy 0.071641 -0.964699) (xy 0.056192 -0.968641) (xy 0.040632 -0.970878) (xy 0.021897 -0.971868) (xy 0.000000 -0.972073) (xy -0.024158 -0.971807) 50 | (xy -0.042405 -0.970705) (xy -0.057806 -0.968307) (xy -0.073426 -0.964154) (xy -0.090047 -0.958592) (xy -0.137389 -0.937446) (xy -0.179073 -0.909391) (xy -0.214769 -0.874754) (xy -0.244143 -0.833862) 51 | (xy -0.266863 -0.787043) (xy -0.268491 -0.782762) (xy -0.276321 -0.754189) (xy -0.281166 -0.720457) (xy -0.282852 -0.684945) (xy -1.533953 -0.684945) (xy -1.525202 -0.705808) (xy -1.470519 -0.813606) 52 | (xy -1.407991 -0.917476) (xy -1.337770 -1.016998) (xy -1.290607 -1.076130) (xy -1.208802 -1.167223) (xy -1.121468 -1.251418) (xy -1.029012 -1.328559) (xy -0.931843 -1.398491) (xy -0.830368 -1.461059) 53 | (xy -0.724995 -1.516108) (xy -0.616132 -1.563482) (xy -0.504186 -1.603027) (xy -0.389566 -1.634588) (xy -0.272679 -1.658009) (xy -0.153933 -1.673136) (xy -0.033737 -1.679812) )(layer F.SilkS) (width 0.000000) 54 | ) 55 | ) 56 | -------------------------------------------------------------------------------- /components/sleep-lib/Sleep-lib.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "RP2040" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) 3 | (property "Reference" "U" (id 0) (at 8.89 51.435 0) 4 | (effects (font (size 1.27 1.27)) (justify left bottom)) 5 | ) 6 | (property "Value" "RP2040" (id 1) (at 8.89 48.895 0) 7 | (effects (font (size 1.27 1.27)) (justify left bottom)) 8 | ) 9 | (property "Footprint" "Sleep-Lib:RP2040-QFN-56" (id 2) (at -20.32 62.23 0) 10 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 11 | ) 12 | (property "Datasheet" "https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf" (id 3) (at -20.32 62.23 0) 13 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 14 | ) 15 | (property "ki_keywords" "raspberry pi 2040" (id 4) (at 0 0 0) 16 | (effects (font (size 1.27 1.27)) hide) 17 | ) 18 | (symbol "RP2040_0_0" 19 | (rectangle (start -17.78 -45.72) (end 17.78 48.26) 20 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 21 | (fill (type background)) 22 | ) 23 | ) 24 | (symbol "RP2040_1_1" 25 | (pin power_in line (at -5.08 50.8 270) (length 2.54) 26 | (name "IOVDD" (effects (font (size 1.27 1.27)))) 27 | (number "1" (effects (font (size 1.27 1.27)))) 28 | ) 29 | (pin power_in line (at -5.08 50.8 270) (length 2.54) hide 30 | (name "IOVDD" (effects (font (size 1.27 1.27)))) 31 | (number "10" (effects (font (size 1.27 1.27)))) 32 | ) 33 | (pin input line (at 20.32 22.86 180) (length 2.54) 34 | (name "GPIO8" (effects (font (size 1.27 1.27)))) 35 | (number "11" (effects (font (size 1.27 1.27)))) 36 | ) 37 | (pin input line (at 20.32 20.32 180) (length 2.54) 38 | (name "GPIO9" (effects (font (size 1.27 1.27)))) 39 | (number "12" (effects (font (size 1.27 1.27)))) 40 | ) 41 | (pin input line (at 20.32 17.78 180) (length 2.54) 42 | (name "GPIO10" (effects (font (size 1.27 1.27)))) 43 | (number "13" (effects (font (size 1.27 1.27)))) 44 | ) 45 | (pin input line (at 20.32 15.24 180) (length 2.54) 46 | (name "GPIO11" (effects (font (size 1.27 1.27)))) 47 | (number "14" (effects (font (size 1.27 1.27)))) 48 | ) 49 | (pin input line (at 20.32 12.7 180) (length 2.54) 50 | (name "GPIO12" (effects (font (size 1.27 1.27)))) 51 | (number "15" (effects (font (size 1.27 1.27)))) 52 | ) 53 | (pin input line (at 20.32 10.16 180) (length 2.54) 54 | (name "GPIO13" (effects (font (size 1.27 1.27)))) 55 | (number "16" (effects (font (size 1.27 1.27)))) 56 | ) 57 | (pin input line (at 20.32 7.62 180) (length 2.54) 58 | (name "GPIO14" (effects (font (size 1.27 1.27)))) 59 | (number "17" (effects (font (size 1.27 1.27)))) 60 | ) 61 | (pin input line (at 20.32 5.08 180) (length 2.54) 62 | (name "GPIO15" (effects (font (size 1.27 1.27)))) 63 | (number "18" (effects (font (size 1.27 1.27)))) 64 | ) 65 | (pin input line (at -20.32 -39.37 0) (length 2.54) 66 | (name "TESTEN" (effects (font (size 1.27 1.27)))) 67 | (number "19" (effects (font (size 1.27 1.27)))) 68 | ) 69 | (pin input line (at 20.32 43.18 180) (length 2.54) 70 | (name "GPIO0" (effects (font (size 1.27 1.27)))) 71 | (number "2" (effects (font (size 1.27 1.27)))) 72 | ) 73 | (pin input clock (at -20.32 19.05 0) (length 2.54) 74 | (name "XTAL_IN" (effects (font (size 1.27 1.27)))) 75 | (number "20" (effects (font (size 1.27 1.27)))) 76 | ) 77 | (pin input clock (at -20.32 13.97 0) (length 2.54) 78 | (name "XTAL_OUT" (effects (font (size 1.27 1.27)))) 79 | (number "21" (effects (font (size 1.27 1.27)))) 80 | ) 81 | (pin power_in line (at -5.08 50.8 270) (length 2.54) hide 82 | (name "IOVDD" (effects (font (size 1.27 1.27)))) 83 | (number "22" (effects (font (size 1.27 1.27)))) 84 | ) 85 | (pin power_in line (at 0 50.8 270) (length 2.54) hide 86 | (name "DVDD" (effects (font (size 1.27 1.27)))) 87 | (number "23" (effects (font (size 1.27 1.27)))) 88 | ) 89 | (pin input clock (at -20.32 -11.43 0) (length 2.54) 90 | (name "SWCLK" (effects (font (size 1.27 1.27)))) 91 | (number "24" (effects (font (size 1.27 1.27)))) 92 | ) 93 | (pin bidirectional line (at -20.32 -13.97 0) (length 2.54) 94 | (name "SWDIO" (effects (font (size 1.27 1.27)))) 95 | (number "25" (effects (font (size 1.27 1.27)))) 96 | ) 97 | (pin input line (at -20.32 43.18 0) (length 2.54) 98 | (name "~{RUN}" (effects (font (size 1.27 1.27)))) 99 | (number "26" (effects (font (size 1.27 1.27)))) 100 | ) 101 | (pin input line (at 20.32 2.54 180) (length 2.54) 102 | (name "GPIO16" (effects (font (size 1.27 1.27)))) 103 | (number "27" (effects (font (size 1.27 1.27)))) 104 | ) 105 | (pin input line (at 20.32 0 180) (length 2.54) 106 | (name "GPIO17" (effects (font (size 1.27 1.27)))) 107 | (number "28" (effects (font (size 1.27 1.27)))) 108 | ) 109 | (pin input line (at 20.32 -2.54 180) (length 2.54) 110 | (name "GPIO18" (effects (font (size 1.27 1.27)))) 111 | (number "29" (effects (font (size 1.27 1.27)))) 112 | ) 113 | (pin input line (at 20.32 40.64 180) (length 2.54) 114 | (name "GPIO1" (effects (font (size 1.27 1.27)))) 115 | (number "3" (effects (font (size 1.27 1.27)))) 116 | ) 117 | (pin input line (at 20.32 -5.08 180) (length 2.54) 118 | (name "GPIO19" (effects (font (size 1.27 1.27)))) 119 | (number "30" (effects (font (size 1.27 1.27)))) 120 | ) 121 | (pin input line (at 20.32 -7.62 180) (length 2.54) 122 | (name "GPIO20" (effects (font (size 1.27 1.27)))) 123 | (number "31" (effects (font (size 1.27 1.27)))) 124 | ) 125 | (pin input line (at 20.32 -10.16 180) (length 2.54) 126 | (name "GPIO21" (effects (font (size 1.27 1.27)))) 127 | (number "32" (effects (font (size 1.27 1.27)))) 128 | ) 129 | (pin power_in line (at -5.08 50.8 270) (length 2.54) hide 130 | (name "IOVDD" (effects (font (size 1.27 1.27)))) 131 | (number "33" (effects (font (size 1.27 1.27)))) 132 | ) 133 | (pin input line (at 20.32 -12.7 180) (length 2.54) 134 | (name "GPIO22" (effects (font (size 1.27 1.27)))) 135 | (number "34" (effects (font (size 1.27 1.27)))) 136 | ) 137 | (pin input line (at 20.32 -15.24 180) (length 2.54) 138 | (name "GPIO23" (effects (font (size 1.27 1.27)))) 139 | (number "35" (effects (font (size 1.27 1.27)))) 140 | ) 141 | (pin input line (at 20.32 -17.78 180) (length 2.54) 142 | (name "GPIO24" (effects (font (size 1.27 1.27)))) 143 | (number "36" (effects (font (size 1.27 1.27)))) 144 | ) 145 | (pin input line (at 20.32 -20.32 180) (length 2.54) 146 | (name "GPIO25" (effects (font (size 1.27 1.27)))) 147 | (number "37" (effects (font (size 1.27 1.27)))) 148 | ) 149 | (pin input line (at 20.32 -26.67 180) (length 2.54) 150 | (name "GPIO26/ADC0" (effects (font (size 1.27 1.27)))) 151 | (number "38" (effects (font (size 1.27 1.27)))) 152 | ) 153 | (pin input line (at 20.32 -29.21 180) (length 2.54) 154 | (name "GPIO27/ADC1" (effects (font (size 1.27 1.27)))) 155 | (number "39" (effects (font (size 1.27 1.27)))) 156 | ) 157 | (pin input line (at 20.32 38.1 180) (length 2.54) 158 | (name "GPIO2" (effects (font (size 1.27 1.27)))) 159 | (number "4" (effects (font (size 1.27 1.27)))) 160 | ) 161 | (pin input line (at 20.32 -31.75 180) (length 2.54) 162 | (name "GPIO28/ADC2" (effects (font (size 1.27 1.27)))) 163 | (number "40" (effects (font (size 1.27 1.27)))) 164 | ) 165 | (pin input line (at 20.32 -34.29 180) (length 2.54) 166 | (name "GPIO29/ADC3" (effects (font (size 1.27 1.27)))) 167 | (number "41" (effects (font (size 1.27 1.27)))) 168 | ) 169 | (pin power_in line (at -5.08 50.8 270) (length 2.54) hide 170 | (name "IOVDD" (effects (font (size 1.27 1.27)))) 171 | (number "42" (effects (font (size 1.27 1.27)))) 172 | ) 173 | (pin power_in line (at -2.54 50.8 270) (length 2.54) 174 | (name "ADC_AVDD" (effects (font (size 1.27 1.27)))) 175 | (number "43" (effects (font (size 1.27 1.27)))) 176 | ) 177 | (pin power_in line (at -20.32 -2.54 0) (length 2.54) 178 | (name "VREG_VIN" (effects (font (size 1.27 1.27)))) 179 | (number "44" (effects (font (size 1.27 1.27)))) 180 | ) 181 | (pin power_out line (at -20.32 -5.08 0) (length 2.54) 182 | (name "VREG_VOUT" (effects (font (size 1.27 1.27)))) 183 | (number "45" (effects (font (size 1.27 1.27)))) 184 | ) 185 | (pin bidirectional line (at -20.32 29.21 0) (length 2.54) 186 | (name "D-" (effects (font (size 1.27 1.27)))) 187 | (number "46" (effects (font (size 1.27 1.27)))) 188 | ) 189 | (pin bidirectional line (at -20.32 31.75 0) (length 2.54) 190 | (name "D+" (effects (font (size 1.27 1.27)))) 191 | (number "47" (effects (font (size 1.27 1.27)))) 192 | ) 193 | (pin power_in line (at -7.62 50.8 270) (length 2.54) 194 | (name "USB_VDD" (effects (font (size 1.27 1.27)))) 195 | (number "48" (effects (font (size 1.27 1.27)))) 196 | ) 197 | (pin power_in line (at -5.08 50.8 270) (length 2.54) hide 198 | (name "IOVDD" (effects (font (size 1.27 1.27)))) 199 | (number "49" (effects (font (size 1.27 1.27)))) 200 | ) 201 | (pin input line (at 20.32 35.56 180) (length 2.54) 202 | (name "GPIO3" (effects (font (size 1.27 1.27)))) 203 | (number "5" (effects (font (size 1.27 1.27)))) 204 | ) 205 | (pin power_in line (at 0 50.8 270) (length 2.54) 206 | (name "DVDD" (effects (font (size 1.27 1.27)))) 207 | (number "50" (effects (font (size 1.27 1.27)))) 208 | ) 209 | (pin bidirectional line (at -20.32 -31.75 0) (length 2.54) 210 | (name "QSPI_SD3" (effects (font (size 1.27 1.27)))) 211 | (number "51" (effects (font (size 1.27 1.27)))) 212 | ) 213 | (pin output clock (at -20.32 -21.59 0) (length 2.54) 214 | (name "QSPI_SCLK" (effects (font (size 1.27 1.27)))) 215 | (number "52" (effects (font (size 1.27 1.27)))) 216 | ) 217 | (pin bidirectional line (at -20.32 -24.13 0) (length 2.54) 218 | (name "QSPI_SD0" (effects (font (size 1.27 1.27)))) 219 | (number "53" (effects (font (size 1.27 1.27)))) 220 | ) 221 | (pin bidirectional line (at -20.32 -29.21 0) (length 2.54) 222 | (name "QSPI_SD2" (effects (font (size 1.27 1.27)))) 223 | (number "54" (effects (font (size 1.27 1.27)))) 224 | ) 225 | (pin bidirectional line (at -20.32 -26.67 0) (length 2.54) 226 | (name "QSPI_SD1" (effects (font (size 1.27 1.27)))) 227 | (number "55" (effects (font (size 1.27 1.27)))) 228 | ) 229 | (pin bidirectional line (at -20.32 -19.05 0) (length 2.54) 230 | (name "QSPI_SS_N" (effects (font (size 1.27 1.27)))) 231 | (number "56" (effects (font (size 1.27 1.27)))) 232 | ) 233 | (pin power_in line (at -3.81 -48.26 90) (length 2.54) 234 | (name "GND" (effects (font (size 1.27 1.27)))) 235 | (number "57" (effects (font (size 1.27 1.27)))) 236 | ) 237 | (pin input line (at 20.32 33.02 180) (length 2.54) 238 | (name "GPIO4" (effects (font (size 1.27 1.27)))) 239 | (number "6" (effects (font (size 1.27 1.27)))) 240 | ) 241 | (pin input line (at 20.32 30.48 180) (length 2.54) 242 | (name "GPIO5" (effects (font (size 1.27 1.27)))) 243 | (number "7" (effects (font (size 1.27 1.27)))) 244 | ) 245 | (pin input line (at 20.32 27.94 180) (length 2.54) 246 | (name "GPIO6" (effects (font (size 1.27 1.27)))) 247 | (number "8" (effects (font (size 1.27 1.27)))) 248 | ) 249 | (pin input line (at 20.32 25.4 180) (length 2.54) 250 | (name "GPIO7" (effects (font (size 1.27 1.27)))) 251 | (number "9" (effects (font (size 1.27 1.27)))) 252 | ) 253 | ) 254 | ) 255 | ) 256 | -------------------------------------------------------------------------------- /rev1/fc980c-controller.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "design_settings": { 4 | "defaults": { 5 | "board_outline_line_width": 0.09999999999999999, 6 | "copper_line_width": 0.19999999999999998, 7 | "copper_text_italic": false, 8 | "copper_text_size_h": 1.5, 9 | "copper_text_size_v": 1.5, 10 | "copper_text_thickness": 0.3, 11 | "copper_text_upright": false, 12 | "courtyard_line_width": 0.049999999999999996, 13 | "dimension_precision": 4, 14 | "dimension_units": 3, 15 | "dimensions": { 16 | "arrow_length": 1270000, 17 | "extension_offset": 500000, 18 | "keep_text_aligned": true, 19 | "suppress_zeroes": false, 20 | "text_position": 0, 21 | "units_format": 1 22 | }, 23 | "fab_line_width": 0.09999999999999999, 24 | "fab_text_italic": false, 25 | "fab_text_size_h": 1.0, 26 | "fab_text_size_v": 1.0, 27 | "fab_text_thickness": 0.15, 28 | "fab_text_upright": false, 29 | "other_line_width": 0.15, 30 | "other_text_italic": false, 31 | "other_text_size_h": 1.0, 32 | "other_text_size_v": 1.0, 33 | "other_text_thickness": 0.15, 34 | "other_text_upright": false, 35 | "pads": { 36 | "drill": 0.0, 37 | "height": 2.6, 38 | "width": 2.0 39 | }, 40 | "silk_line_width": 0.15, 41 | "silk_text_italic": false, 42 | "silk_text_size_h": 1.0, 43 | "silk_text_size_v": 1.0, 44 | "silk_text_thickness": 0.15, 45 | "silk_text_upright": false, 46 | "zones": { 47 | "45_degree_only": false, 48 | "min_clearance": 0.15 49 | } 50 | }, 51 | "diff_pair_dimensions": [ 52 | { 53 | "gap": 0.0, 54 | "via_gap": 0.0, 55 | "width": 0.0 56 | } 57 | ], 58 | "drc_exclusions": [], 59 | "meta": { 60 | "version": 2 61 | }, 62 | "rule_severities": { 63 | "annular_width": "error", 64 | "clearance": "error", 65 | "copper_edge_clearance": "error", 66 | "courtyards_overlap": "error", 67 | "diff_pair_gap_out_of_range": "error", 68 | "diff_pair_uncoupled_length_too_long": "error", 69 | "drill_out_of_range": "error", 70 | "duplicate_footprints": "warning", 71 | "extra_footprint": "warning", 72 | "footprint_type_mismatch": "error", 73 | "hole_clearance": "error", 74 | "hole_near_hole": "error", 75 | "invalid_outline": "error", 76 | "item_on_disabled_layer": "error", 77 | "items_not_allowed": "error", 78 | "length_out_of_range": "error", 79 | "malformed_courtyard": "error", 80 | "microvia_drill_out_of_range": "error", 81 | "missing_courtyard": "ignore", 82 | "missing_footprint": "warning", 83 | "net_conflict": "warning", 84 | "npth_inside_courtyard": "ignore", 85 | "padstack": "error", 86 | "pth_inside_courtyard": "ignore", 87 | "shorting_items": "error", 88 | "silk_over_copper": "warning", 89 | "silk_overlap": "warning", 90 | "skew_out_of_range": "error", 91 | "through_hole_pad_without_hole": "error", 92 | "too_many_vias": "error", 93 | "track_dangling": "warning", 94 | "track_width": "error", 95 | "tracks_crossing": "error", 96 | "unconnected_items": "error", 97 | "unresolved_variable": "error", 98 | "via_dangling": "warning", 99 | "zone_has_empty_net": "error", 100 | "zones_intersect": "error" 101 | }, 102 | "rules": { 103 | "allow_blind_buried_vias": false, 104 | "allow_microvias": false, 105 | "max_error": 0.005, 106 | "min_clearance": 0.19999999999999998, 107 | "min_copper_edge_clearance": 0.39999999999999997, 108 | "min_hole_clearance": 0.254, 109 | "min_hole_to_hole": 0.5, 110 | "min_microvia_diameter": 0.19999999999999998, 111 | "min_microvia_drill": 0.09999999999999999, 112 | "min_silk_clearance": 0.0, 113 | "min_through_hole_diameter": 0.3, 114 | "min_track_width": 0.19999999999999998, 115 | "min_via_annular_width": 0.049999999999999996, 116 | "min_via_diameter": 0.39999999999999997, 117 | "solder_mask_clearance": 0.0, 118 | "solder_mask_min_width": 0.0, 119 | "use_height_for_length_calcs": true 120 | }, 121 | "track_widths": [ 122 | 0.0, 123 | 0.2, 124 | 0.25, 125 | 0.6, 126 | 1.0 127 | ], 128 | "via_dimensions": [ 129 | { 130 | "diameter": 0.0, 131 | "drill": 0.0 132 | }, 133 | { 134 | "diameter": 0.6, 135 | "drill": 0.3 136 | }, 137 | { 138 | "diameter": 0.7, 139 | "drill": 0.3 140 | } 141 | ], 142 | "zones_allow_external_fillets": false, 143 | "zones_use_no_outline": true 144 | }, 145 | "layer_presets": [] 146 | }, 147 | "boards": [], 148 | "cvpcb": { 149 | "equivalence_files": [] 150 | }, 151 | "erc": { 152 | "erc_exclusions": [], 153 | "meta": { 154 | "version": 0 155 | }, 156 | "pin_map": [ 157 | [ 158 | 0, 159 | 0, 160 | 0, 161 | 0, 162 | 0, 163 | 0, 164 | 1, 165 | 0, 166 | 0, 167 | 0, 168 | 0, 169 | 2 170 | ], 171 | [ 172 | 0, 173 | 2, 174 | 0, 175 | 1, 176 | 0, 177 | 0, 178 | 1, 179 | 0, 180 | 2, 181 | 2, 182 | 2, 183 | 2 184 | ], 185 | [ 186 | 0, 187 | 0, 188 | 0, 189 | 0, 190 | 0, 191 | 0, 192 | 1, 193 | 0, 194 | 1, 195 | 0, 196 | 1, 197 | 2 198 | ], 199 | [ 200 | 0, 201 | 1, 202 | 0, 203 | 0, 204 | 0, 205 | 0, 206 | 1, 207 | 1, 208 | 2, 209 | 1, 210 | 1, 211 | 2 212 | ], 213 | [ 214 | 0, 215 | 0, 216 | 0, 217 | 0, 218 | 0, 219 | 0, 220 | 1, 221 | 0, 222 | 0, 223 | 0, 224 | 0, 225 | 2 226 | ], 227 | [ 228 | 0, 229 | 0, 230 | 0, 231 | 0, 232 | 0, 233 | 0, 234 | 0, 235 | 0, 236 | 0, 237 | 0, 238 | 0, 239 | 2 240 | ], 241 | [ 242 | 1, 243 | 1, 244 | 1, 245 | 1, 246 | 1, 247 | 0, 248 | 1, 249 | 1, 250 | 1, 251 | 1, 252 | 1, 253 | 2 254 | ], 255 | [ 256 | 0, 257 | 0, 258 | 0, 259 | 1, 260 | 0, 261 | 0, 262 | 1, 263 | 0, 264 | 0, 265 | 0, 266 | 0, 267 | 2 268 | ], 269 | [ 270 | 0, 271 | 2, 272 | 1, 273 | 2, 274 | 0, 275 | 0, 276 | 1, 277 | 0, 278 | 2, 279 | 2, 280 | 2, 281 | 2 282 | ], 283 | [ 284 | 0, 285 | 2, 286 | 0, 287 | 1, 288 | 0, 289 | 0, 290 | 1, 291 | 0, 292 | 2, 293 | 0, 294 | 0, 295 | 2 296 | ], 297 | [ 298 | 0, 299 | 2, 300 | 1, 301 | 1, 302 | 0, 303 | 0, 304 | 1, 305 | 0, 306 | 2, 307 | 0, 308 | 0, 309 | 2 310 | ], 311 | [ 312 | 2, 313 | 2, 314 | 2, 315 | 2, 316 | 2, 317 | 2, 318 | 2, 319 | 2, 320 | 2, 321 | 2, 322 | 2, 323 | 2 324 | ] 325 | ], 326 | "rule_severities": { 327 | "bus_definition_conflict": "error", 328 | "bus_entry_needed": "error", 329 | "bus_label_syntax": "error", 330 | "bus_to_bus_conflict": "error", 331 | "bus_to_net_conflict": "error", 332 | "different_unit_footprint": "error", 333 | "different_unit_net": "error", 334 | "duplicate_reference": "error", 335 | "duplicate_sheet_names": "error", 336 | "extra_units": "error", 337 | "global_label_dangling": "warning", 338 | "hier_label_mismatch": "error", 339 | "label_dangling": "error", 340 | "lib_symbol_issues": "warning", 341 | "multiple_net_names": "warning", 342 | "net_not_bus_member": "warning", 343 | "no_connect_connected": "warning", 344 | "no_connect_dangling": "warning", 345 | "pin_not_connected": "error", 346 | "pin_not_driven": "error", 347 | "pin_to_pin": "warning", 348 | "power_pin_not_driven": "error", 349 | "similar_labels": "warning", 350 | "unannotated": "error", 351 | "unit_value_mismatch": "error", 352 | "unresolved_variable": "error", 353 | "wire_dangling": "error" 354 | } 355 | }, 356 | "libraries": { 357 | "pinned_footprint_libs": [], 358 | "pinned_symbol_libs": [] 359 | }, 360 | "meta": { 361 | "filename": "fc980c-controller.kicad_pro", 362 | "version": 1 363 | }, 364 | "net_settings": { 365 | "classes": [ 366 | { 367 | "bus_width": 12.0, 368 | "clearance": 0.2, 369 | "diff_pair_gap": 0.25, 370 | "diff_pair_via_gap": 0.25, 371 | "diff_pair_width": 0.2, 372 | "line_style": 0, 373 | "microvia_diameter": 0.3, 374 | "microvia_drill": 0.1, 375 | "name": "Default", 376 | "pcb_color": "rgba(0, 0, 0, 0.000)", 377 | "schematic_color": "rgba(0, 0, 0, 0.000)", 378 | "track_width": 0.2, 379 | "via_diameter": 0.5, 380 | "via_drill": 0.25, 381 | "wire_width": 6.0 382 | }, 383 | { 384 | "bus_width": 12.0, 385 | "clearance": 0.2, 386 | "diff_pair_gap": 0.25, 387 | "diff_pair_via_gap": 0.25, 388 | "diff_pair_width": 0.2, 389 | "line_style": 0, 390 | "microvia_diameter": 0.3, 391 | "microvia_drill": 0.1, 392 | "name": "Power", 393 | "nets": [ 394 | "+5V", 395 | "GND", 396 | "VBUS" 397 | ], 398 | "pcb_color": "rgba(0, 0, 0, 0.000)", 399 | "schematic_color": "rgba(0, 0, 0, 0.000)", 400 | "track_width": 0.6, 401 | "via_diameter": 0.8, 402 | "via_drill": 0.4, 403 | "wire_width": 6.0 404 | }, 405 | { 406 | "bus_width": 12.0, 407 | "clearance": 0.127, 408 | "diff_pair_gap": 0.127, 409 | "diff_pair_via_gap": 0.25, 410 | "diff_pair_width": 0.65, 411 | "line_style": 0, 412 | "microvia_diameter": 0.3, 413 | "microvia_drill": 0.1, 414 | "name": "USB Data", 415 | "nets": [ 416 | "D_N", 417 | "D_P" 418 | ], 419 | "pcb_color": "rgba(0, 0, 0, 0.000)", 420 | "schematic_color": "rgba(0, 0, 0, 0.000)", 421 | "track_width": 0.2, 422 | "via_diameter": 0.5, 423 | "via_drill": 0.25, 424 | "wire_width": 6.0 425 | } 426 | ], 427 | "meta": { 428 | "version": 2 429 | }, 430 | "net_colors": null 431 | }, 432 | "pcbnew": { 433 | "last_paths": { 434 | "gencad": "", 435 | "idf": "", 436 | "netlist": "", 437 | "specctra_dsn": "", 438 | "step": "", 439 | "vrml": "" 440 | }, 441 | "page_layout_descr_file": "" 442 | }, 443 | "schematic": { 444 | "annotate_start_num": 0, 445 | "drawing": { 446 | "default_line_thickness": 6.0, 447 | "default_text_size": 50.0, 448 | "field_names": [], 449 | "intersheets_ref_own_page": false, 450 | "intersheets_ref_prefix": "", 451 | "intersheets_ref_short": false, 452 | "intersheets_ref_show": false, 453 | "intersheets_ref_suffix": "", 454 | "junction_size_choice": 3, 455 | "label_size_ratio": 0.375, 456 | "pin_symbol_size": 25.0, 457 | "text_offset_ratio": 0.15 458 | }, 459 | "legacy_lib_dir": "", 460 | "legacy_lib_list": [], 461 | "meta": { 462 | "version": 1 463 | }, 464 | "net_format_name": "", 465 | "ngspice": { 466 | "fix_include_paths": true, 467 | "fix_passive_vals": false, 468 | "meta": { 469 | "version": 0 470 | }, 471 | "model_mode": 0, 472 | "workbook_filename": "" 473 | }, 474 | "page_layout_descr_file": "", 475 | "plot_directory": "./", 476 | "spice_adjust_passive_values": false, 477 | "spice_external_command": "spice \"%I\"", 478 | "subpart_first_id": 65, 479 | "subpart_id_separator": 0 480 | }, 481 | "sheets": [ 482 | [ 483 | "3c7f716a-ef14-43e1-9875-4495ece27a97", 484 | "" 485 | ] 486 | ], 487 | "text_variables": {} 488 | } 489 | -------------------------------------------------------------------------------- /rev2/fc980c-controller.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "design_settings": { 4 | "defaults": { 5 | "board_outline_line_width": 0.09999999999999999, 6 | "copper_line_width": 0.19999999999999998, 7 | "copper_text_italic": false, 8 | "copper_text_size_h": 1.5, 9 | "copper_text_size_v": 1.5, 10 | "copper_text_thickness": 0.3, 11 | "copper_text_upright": false, 12 | "courtyard_line_width": 0.049999999999999996, 13 | "dimension_precision": 4, 14 | "dimension_units": 3, 15 | "dimensions": { 16 | "arrow_length": 1270000, 17 | "extension_offset": 500000, 18 | "keep_text_aligned": true, 19 | "suppress_zeroes": false, 20 | "text_position": 0, 21 | "units_format": 1 22 | }, 23 | "fab_line_width": 0.09999999999999999, 24 | "fab_text_italic": false, 25 | "fab_text_size_h": 1.0, 26 | "fab_text_size_v": 1.0, 27 | "fab_text_thickness": 0.15, 28 | "fab_text_upright": false, 29 | "other_line_width": 0.15, 30 | "other_text_italic": false, 31 | "other_text_size_h": 1.0, 32 | "other_text_size_v": 1.0, 33 | "other_text_thickness": 0.15, 34 | "other_text_upright": false, 35 | "pads": { 36 | "drill": 0.0, 37 | "height": 2.6, 38 | "width": 2.0 39 | }, 40 | "silk_line_width": 0.15, 41 | "silk_text_italic": false, 42 | "silk_text_size_h": 1.0, 43 | "silk_text_size_v": 1.0, 44 | "silk_text_thickness": 0.15, 45 | "silk_text_upright": false, 46 | "zones": { 47 | "45_degree_only": false, 48 | "min_clearance": 0.15 49 | } 50 | }, 51 | "diff_pair_dimensions": [ 52 | { 53 | "gap": 0.0, 54 | "via_gap": 0.0, 55 | "width": 0.0 56 | } 57 | ], 58 | "drc_exclusions": [], 59 | "meta": { 60 | "version": 2 61 | }, 62 | "rule_severities": { 63 | "annular_width": "error", 64 | "clearance": "error", 65 | "copper_edge_clearance": "error", 66 | "courtyards_overlap": "error", 67 | "diff_pair_gap_out_of_range": "error", 68 | "diff_pair_uncoupled_length_too_long": "error", 69 | "drill_out_of_range": "error", 70 | "duplicate_footprints": "warning", 71 | "extra_footprint": "warning", 72 | "footprint_type_mismatch": "error", 73 | "hole_clearance": "error", 74 | "hole_near_hole": "error", 75 | "invalid_outline": "error", 76 | "item_on_disabled_layer": "error", 77 | "items_not_allowed": "error", 78 | "length_out_of_range": "error", 79 | "malformed_courtyard": "error", 80 | "microvia_drill_out_of_range": "error", 81 | "missing_courtyard": "ignore", 82 | "missing_footprint": "warning", 83 | "net_conflict": "warning", 84 | "npth_inside_courtyard": "ignore", 85 | "padstack": "error", 86 | "pth_inside_courtyard": "ignore", 87 | "shorting_items": "error", 88 | "silk_over_copper": "warning", 89 | "silk_overlap": "warning", 90 | "skew_out_of_range": "error", 91 | "through_hole_pad_without_hole": "error", 92 | "too_many_vias": "error", 93 | "track_dangling": "warning", 94 | "track_width": "error", 95 | "tracks_crossing": "error", 96 | "unconnected_items": "error", 97 | "unresolved_variable": "error", 98 | "via_dangling": "warning", 99 | "zone_has_empty_net": "error", 100 | "zones_intersect": "error" 101 | }, 102 | "rules": { 103 | "allow_blind_buried_vias": false, 104 | "allow_microvias": false, 105 | "max_error": 0.005, 106 | "min_clearance": 0.19999999999999998, 107 | "min_copper_edge_clearance": 0.39999999999999997, 108 | "min_hole_clearance": 0.254, 109 | "min_hole_to_hole": 0.5, 110 | "min_microvia_diameter": 0.19999999999999998, 111 | "min_microvia_drill": 0.09999999999999999, 112 | "min_silk_clearance": 0.0, 113 | "min_through_hole_diameter": 0.3, 114 | "min_track_width": 0.19999999999999998, 115 | "min_via_annular_width": 0.049999999999999996, 116 | "min_via_diameter": 0.39999999999999997, 117 | "solder_mask_clearance": 0.0, 118 | "solder_mask_min_width": 0.0, 119 | "use_height_for_length_calcs": true 120 | }, 121 | "track_widths": [ 122 | 0.0, 123 | 0.2, 124 | 0.25, 125 | 0.6, 126 | 1.0 127 | ], 128 | "via_dimensions": [ 129 | { 130 | "diameter": 0.0, 131 | "drill": 0.0 132 | }, 133 | { 134 | "diameter": 0.6, 135 | "drill": 0.3 136 | }, 137 | { 138 | "diameter": 0.7, 139 | "drill": 0.3 140 | } 141 | ], 142 | "zones_allow_external_fillets": false, 143 | "zones_use_no_outline": true 144 | }, 145 | "layer_presets": [] 146 | }, 147 | "boards": [], 148 | "cvpcb": { 149 | "equivalence_files": [] 150 | }, 151 | "erc": { 152 | "erc_exclusions": [], 153 | "meta": { 154 | "version": 0 155 | }, 156 | "pin_map": [ 157 | [ 158 | 0, 159 | 0, 160 | 0, 161 | 0, 162 | 0, 163 | 0, 164 | 1, 165 | 0, 166 | 0, 167 | 0, 168 | 0, 169 | 2 170 | ], 171 | [ 172 | 0, 173 | 2, 174 | 0, 175 | 1, 176 | 0, 177 | 0, 178 | 1, 179 | 0, 180 | 2, 181 | 2, 182 | 2, 183 | 2 184 | ], 185 | [ 186 | 0, 187 | 0, 188 | 0, 189 | 0, 190 | 0, 191 | 0, 192 | 1, 193 | 0, 194 | 1, 195 | 0, 196 | 1, 197 | 2 198 | ], 199 | [ 200 | 0, 201 | 1, 202 | 0, 203 | 0, 204 | 0, 205 | 0, 206 | 1, 207 | 1, 208 | 2, 209 | 1, 210 | 1, 211 | 2 212 | ], 213 | [ 214 | 0, 215 | 0, 216 | 0, 217 | 0, 218 | 0, 219 | 0, 220 | 1, 221 | 0, 222 | 0, 223 | 0, 224 | 0, 225 | 2 226 | ], 227 | [ 228 | 0, 229 | 0, 230 | 0, 231 | 0, 232 | 0, 233 | 0, 234 | 0, 235 | 0, 236 | 0, 237 | 0, 238 | 0, 239 | 2 240 | ], 241 | [ 242 | 1, 243 | 1, 244 | 1, 245 | 1, 246 | 1, 247 | 0, 248 | 1, 249 | 1, 250 | 1, 251 | 1, 252 | 1, 253 | 2 254 | ], 255 | [ 256 | 0, 257 | 0, 258 | 0, 259 | 1, 260 | 0, 261 | 0, 262 | 1, 263 | 0, 264 | 0, 265 | 0, 266 | 0, 267 | 2 268 | ], 269 | [ 270 | 0, 271 | 2, 272 | 1, 273 | 2, 274 | 0, 275 | 0, 276 | 1, 277 | 0, 278 | 2, 279 | 2, 280 | 2, 281 | 2 282 | ], 283 | [ 284 | 0, 285 | 2, 286 | 0, 287 | 1, 288 | 0, 289 | 0, 290 | 1, 291 | 0, 292 | 2, 293 | 0, 294 | 0, 295 | 2 296 | ], 297 | [ 298 | 0, 299 | 2, 300 | 1, 301 | 1, 302 | 0, 303 | 0, 304 | 1, 305 | 0, 306 | 2, 307 | 0, 308 | 0, 309 | 2 310 | ], 311 | [ 312 | 2, 313 | 2, 314 | 2, 315 | 2, 316 | 2, 317 | 2, 318 | 2, 319 | 2, 320 | 2, 321 | 2, 322 | 2, 323 | 2 324 | ] 325 | ], 326 | "rule_severities": { 327 | "bus_definition_conflict": "error", 328 | "bus_entry_needed": "error", 329 | "bus_label_syntax": "error", 330 | "bus_to_bus_conflict": "error", 331 | "bus_to_net_conflict": "error", 332 | "different_unit_footprint": "error", 333 | "different_unit_net": "error", 334 | "duplicate_reference": "error", 335 | "duplicate_sheet_names": "error", 336 | "extra_units": "error", 337 | "global_label_dangling": "warning", 338 | "hier_label_mismatch": "error", 339 | "label_dangling": "error", 340 | "lib_symbol_issues": "warning", 341 | "multiple_net_names": "warning", 342 | "net_not_bus_member": "warning", 343 | "no_connect_connected": "warning", 344 | "no_connect_dangling": "warning", 345 | "pin_not_connected": "error", 346 | "pin_not_driven": "error", 347 | "pin_to_pin": "warning", 348 | "power_pin_not_driven": "error", 349 | "similar_labels": "warning", 350 | "unannotated": "error", 351 | "unit_value_mismatch": "error", 352 | "unresolved_variable": "error", 353 | "wire_dangling": "error" 354 | } 355 | }, 356 | "libraries": { 357 | "pinned_footprint_libs": [], 358 | "pinned_symbol_libs": [] 359 | }, 360 | "meta": { 361 | "filename": "fc980c-controller.kicad_pro", 362 | "version": 1 363 | }, 364 | "net_settings": { 365 | "classes": [ 366 | { 367 | "bus_width": 12.0, 368 | "clearance": 0.2, 369 | "diff_pair_gap": 0.25, 370 | "diff_pair_via_gap": 0.25, 371 | "diff_pair_width": 0.2, 372 | "line_style": 0, 373 | "microvia_diameter": 0.3, 374 | "microvia_drill": 0.1, 375 | "name": "Default", 376 | "pcb_color": "rgba(0, 0, 0, 0.000)", 377 | "schematic_color": "rgba(0, 0, 0, 0.000)", 378 | "track_width": 0.2, 379 | "via_diameter": 0.5, 380 | "via_drill": 0.25, 381 | "wire_width": 6.0 382 | }, 383 | { 384 | "bus_width": 12.0, 385 | "clearance": 0.2, 386 | "diff_pair_gap": 0.25, 387 | "diff_pair_via_gap": 0.25, 388 | "diff_pair_width": 0.2, 389 | "line_style": 0, 390 | "microvia_diameter": 0.3, 391 | "microvia_drill": 0.1, 392 | "name": "Power", 393 | "nets": [ 394 | "+5V", 395 | "GND", 396 | "VBUS" 397 | ], 398 | "pcb_color": "rgba(0, 0, 0, 0.000)", 399 | "schematic_color": "rgba(0, 0, 0, 0.000)", 400 | "track_width": 0.6, 401 | "via_diameter": 0.8, 402 | "via_drill": 0.4, 403 | "wire_width": 6.0 404 | }, 405 | { 406 | "bus_width": 12.0, 407 | "clearance": 0.127, 408 | "diff_pair_gap": 0.127, 409 | "diff_pair_via_gap": 0.25, 410 | "diff_pair_width": 0.65, 411 | "line_style": 0, 412 | "microvia_diameter": 0.3, 413 | "microvia_drill": 0.1, 414 | "name": "USB Data", 415 | "nets": [ 416 | "D_N", 417 | "D_P" 418 | ], 419 | "pcb_color": "rgba(0, 0, 0, 0.000)", 420 | "schematic_color": "rgba(0, 0, 0, 0.000)", 421 | "track_width": 0.2, 422 | "via_diameter": 0.5, 423 | "via_drill": 0.25, 424 | "wire_width": 6.0 425 | } 426 | ], 427 | "meta": { 428 | "version": 2 429 | }, 430 | "net_colors": null 431 | }, 432 | "pcbnew": { 433 | "last_paths": { 434 | "gencad": "", 435 | "idf": "", 436 | "netlist": "", 437 | "specctra_dsn": "", 438 | "step": "", 439 | "vrml": "" 440 | }, 441 | "page_layout_descr_file": "" 442 | }, 443 | "schematic": { 444 | "annotate_start_num": 0, 445 | "drawing": { 446 | "default_line_thickness": 6.0, 447 | "default_text_size": 50.0, 448 | "field_names": [], 449 | "intersheets_ref_own_page": false, 450 | "intersheets_ref_prefix": "", 451 | "intersheets_ref_short": false, 452 | "intersheets_ref_show": false, 453 | "intersheets_ref_suffix": "", 454 | "junction_size_choice": 3, 455 | "label_size_ratio": 0.375, 456 | "pin_symbol_size": 25.0, 457 | "text_offset_ratio": 0.15 458 | }, 459 | "legacy_lib_dir": "", 460 | "legacy_lib_list": [], 461 | "meta": { 462 | "version": 1 463 | }, 464 | "net_format_name": "", 465 | "ngspice": { 466 | "fix_include_paths": true, 467 | "fix_passive_vals": false, 468 | "meta": { 469 | "version": 0 470 | }, 471 | "model_mode": 0, 472 | "workbook_filename": "" 473 | }, 474 | "page_layout_descr_file": "", 475 | "plot_directory": "./", 476 | "spice_adjust_passive_values": false, 477 | "spice_external_command": "spice \"%I\"", 478 | "subpart_first_id": 65, 479 | "subpart_id_separator": 0 480 | }, 481 | "sheets": [ 482 | [ 483 | "3c7f716a-ef14-43e1-9875-4495ece27a97", 484 | "" 485 | ] 486 | ], 487 | "text_variables": {} 488 | } 489 | -------------------------------------------------------------------------------- /rev0/fc980c-controller.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "design_settings": { 4 | "defaults": { 5 | "board_outline_line_width": 0.09999999999999999, 6 | "copper_line_width": 0.19999999999999998, 7 | "copper_text_italic": false, 8 | "copper_text_size_h": 1.5, 9 | "copper_text_size_v": 1.5, 10 | "copper_text_thickness": 0.3, 11 | "copper_text_upright": false, 12 | "courtyard_line_width": 0.049999999999999996, 13 | "dimension_precision": 4, 14 | "dimension_units": 3, 15 | "dimensions": { 16 | "arrow_length": 1270000, 17 | "extension_offset": 500000, 18 | "keep_text_aligned": true, 19 | "suppress_zeroes": false, 20 | "text_position": 0, 21 | "units_format": 1 22 | }, 23 | "fab_line_width": 0.09999999999999999, 24 | "fab_text_italic": false, 25 | "fab_text_size_h": 1.0, 26 | "fab_text_size_v": 1.0, 27 | "fab_text_thickness": 0.15, 28 | "fab_text_upright": false, 29 | "other_line_width": 0.15, 30 | "other_text_italic": false, 31 | "other_text_size_h": 1.0, 32 | "other_text_size_v": 1.0, 33 | "other_text_thickness": 0.15, 34 | "other_text_upright": false, 35 | "pads": { 36 | "drill": 0.762, 37 | "height": 1.524, 38 | "width": 1.524 39 | }, 40 | "silk_line_width": 0.15, 41 | "silk_text_italic": false, 42 | "silk_text_size_h": 1.0, 43 | "silk_text_size_v": 1.0, 44 | "silk_text_thickness": 0.15, 45 | "silk_text_upright": false, 46 | "zones": { 47 | "45_degree_only": false, 48 | "min_clearance": 0.15 49 | } 50 | }, 51 | "diff_pair_dimensions": [ 52 | { 53 | "gap": 0.0, 54 | "via_gap": 0.0, 55 | "width": 0.0 56 | } 57 | ], 58 | "drc_exclusions": [], 59 | "meta": { 60 | "version": 2 61 | }, 62 | "rule_severities": { 63 | "annular_width": "error", 64 | "clearance": "error", 65 | "copper_edge_clearance": "error", 66 | "courtyards_overlap": "error", 67 | "diff_pair_gap_out_of_range": "error", 68 | "diff_pair_uncoupled_length_too_long": "error", 69 | "drill_out_of_range": "error", 70 | "duplicate_footprints": "warning", 71 | "extra_footprint": "warning", 72 | "footprint_type_mismatch": "error", 73 | "hole_clearance": "error", 74 | "hole_near_hole": "error", 75 | "invalid_outline": "error", 76 | "item_on_disabled_layer": "error", 77 | "items_not_allowed": "error", 78 | "length_out_of_range": "error", 79 | "malformed_courtyard": "error", 80 | "microvia_drill_out_of_range": "error", 81 | "missing_courtyard": "ignore", 82 | "missing_footprint": "warning", 83 | "net_conflict": "warning", 84 | "npth_inside_courtyard": "ignore", 85 | "padstack": "error", 86 | "pth_inside_courtyard": "ignore", 87 | "shorting_items": "error", 88 | "silk_over_copper": "warning", 89 | "silk_overlap": "warning", 90 | "skew_out_of_range": "error", 91 | "through_hole_pad_without_hole": "error", 92 | "too_many_vias": "error", 93 | "track_dangling": "warning", 94 | "track_width": "error", 95 | "tracks_crossing": "error", 96 | "unconnected_items": "error", 97 | "unresolved_variable": "error", 98 | "via_dangling": "warning", 99 | "zone_has_empty_net": "error", 100 | "zones_intersect": "error" 101 | }, 102 | "rules": { 103 | "allow_blind_buried_vias": false, 104 | "allow_microvias": false, 105 | "max_error": 0.005, 106 | "min_clearance": 0.19999999999999998, 107 | "min_copper_edge_clearance": 0.39999999999999997, 108 | "min_hole_clearance": 0.254, 109 | "min_hole_to_hole": 0.5, 110 | "min_microvia_diameter": 0.19999999999999998, 111 | "min_microvia_drill": 0.09999999999999999, 112 | "min_silk_clearance": 0.0, 113 | "min_through_hole_diameter": 0.3, 114 | "min_track_width": 0.19999999999999998, 115 | "min_via_annular_width": 0.049999999999999996, 116 | "min_via_diameter": 0.39999999999999997, 117 | "solder_mask_clearance": 0.0, 118 | "solder_mask_min_width": 0.0, 119 | "use_height_for_length_calcs": true 120 | }, 121 | "track_widths": [ 122 | 0.0, 123 | 0.2, 124 | 0.25, 125 | 0.6, 126 | 1.0 127 | ], 128 | "via_dimensions": [ 129 | { 130 | "diameter": 0.0, 131 | "drill": 0.0 132 | }, 133 | { 134 | "diameter": 0.6, 135 | "drill": 0.3 136 | }, 137 | { 138 | "diameter": 0.7, 139 | "drill": 0.3 140 | } 141 | ], 142 | "zones_allow_external_fillets": false, 143 | "zones_use_no_outline": true 144 | }, 145 | "layer_presets": [] 146 | }, 147 | "boards": [], 148 | "cvpcb": { 149 | "equivalence_files": [] 150 | }, 151 | "erc": { 152 | "erc_exclusions": [], 153 | "meta": { 154 | "version": 0 155 | }, 156 | "pin_map": [ 157 | [ 158 | 0, 159 | 0, 160 | 0, 161 | 0, 162 | 0, 163 | 0, 164 | 1, 165 | 0, 166 | 0, 167 | 0, 168 | 0, 169 | 2 170 | ], 171 | [ 172 | 0, 173 | 2, 174 | 0, 175 | 1, 176 | 0, 177 | 0, 178 | 1, 179 | 0, 180 | 2, 181 | 2, 182 | 2, 183 | 2 184 | ], 185 | [ 186 | 0, 187 | 0, 188 | 0, 189 | 0, 190 | 0, 191 | 0, 192 | 1, 193 | 0, 194 | 1, 195 | 0, 196 | 1, 197 | 2 198 | ], 199 | [ 200 | 0, 201 | 1, 202 | 0, 203 | 0, 204 | 0, 205 | 0, 206 | 1, 207 | 1, 208 | 2, 209 | 1, 210 | 1, 211 | 2 212 | ], 213 | [ 214 | 0, 215 | 0, 216 | 0, 217 | 0, 218 | 0, 219 | 0, 220 | 1, 221 | 0, 222 | 0, 223 | 0, 224 | 0, 225 | 2 226 | ], 227 | [ 228 | 0, 229 | 0, 230 | 0, 231 | 0, 232 | 0, 233 | 0, 234 | 0, 235 | 0, 236 | 0, 237 | 0, 238 | 0, 239 | 2 240 | ], 241 | [ 242 | 1, 243 | 1, 244 | 1, 245 | 1, 246 | 1, 247 | 0, 248 | 1, 249 | 1, 250 | 1, 251 | 1, 252 | 1, 253 | 2 254 | ], 255 | [ 256 | 0, 257 | 0, 258 | 0, 259 | 1, 260 | 0, 261 | 0, 262 | 1, 263 | 0, 264 | 0, 265 | 0, 266 | 0, 267 | 2 268 | ], 269 | [ 270 | 0, 271 | 2, 272 | 1, 273 | 2, 274 | 0, 275 | 0, 276 | 1, 277 | 0, 278 | 2, 279 | 2, 280 | 2, 281 | 2 282 | ], 283 | [ 284 | 0, 285 | 2, 286 | 0, 287 | 1, 288 | 0, 289 | 0, 290 | 1, 291 | 0, 292 | 2, 293 | 0, 294 | 0, 295 | 2 296 | ], 297 | [ 298 | 0, 299 | 2, 300 | 1, 301 | 1, 302 | 0, 303 | 0, 304 | 1, 305 | 0, 306 | 2, 307 | 0, 308 | 0, 309 | 2 310 | ], 311 | [ 312 | 2, 313 | 2, 314 | 2, 315 | 2, 316 | 2, 317 | 2, 318 | 2, 319 | 2, 320 | 2, 321 | 2, 322 | 2, 323 | 2 324 | ] 325 | ], 326 | "rule_severities": { 327 | "bus_definition_conflict": "error", 328 | "bus_entry_needed": "error", 329 | "bus_label_syntax": "error", 330 | "bus_to_bus_conflict": "error", 331 | "bus_to_net_conflict": "error", 332 | "different_unit_footprint": "error", 333 | "different_unit_net": "error", 334 | "duplicate_reference": "error", 335 | "duplicate_sheet_names": "error", 336 | "extra_units": "error", 337 | "global_label_dangling": "warning", 338 | "hier_label_mismatch": "error", 339 | "label_dangling": "error", 340 | "lib_symbol_issues": "warning", 341 | "multiple_net_names": "warning", 342 | "net_not_bus_member": "warning", 343 | "no_connect_connected": "warning", 344 | "no_connect_dangling": "warning", 345 | "pin_not_connected": "error", 346 | "pin_not_driven": "error", 347 | "pin_to_pin": "warning", 348 | "power_pin_not_driven": "error", 349 | "similar_labels": "warning", 350 | "unannotated": "error", 351 | "unit_value_mismatch": "error", 352 | "unresolved_variable": "error", 353 | "wire_dangling": "error" 354 | } 355 | }, 356 | "libraries": { 357 | "pinned_footprint_libs": [], 358 | "pinned_symbol_libs": [] 359 | }, 360 | "meta": { 361 | "filename": "fc980c-controller.kicad_pro", 362 | "version": 1 363 | }, 364 | "net_settings": { 365 | "classes": [ 366 | { 367 | "bus_width": 12.0, 368 | "clearance": 0.2, 369 | "diff_pair_gap": 0.25, 370 | "diff_pair_via_gap": 0.25, 371 | "diff_pair_width": 0.2, 372 | "line_style": 0, 373 | "microvia_diameter": 0.3, 374 | "microvia_drill": 0.1, 375 | "name": "Default", 376 | "pcb_color": "rgba(0, 0, 0, 0.000)", 377 | "schematic_color": "rgba(0, 0, 0, 0.000)", 378 | "track_width": 0.2, 379 | "via_diameter": 0.5, 380 | "via_drill": 0.25, 381 | "wire_width": 6.0 382 | }, 383 | { 384 | "bus_width": 12.0, 385 | "clearance": 0.2, 386 | "diff_pair_gap": 0.25, 387 | "diff_pair_via_gap": 0.25, 388 | "diff_pair_width": 0.2, 389 | "line_style": 0, 390 | "microvia_diameter": 0.3, 391 | "microvia_drill": 0.1, 392 | "name": "Power", 393 | "nets": [ 394 | "+5V", 395 | "GND", 396 | "VBUS" 397 | ], 398 | "pcb_color": "rgba(0, 0, 0, 0.000)", 399 | "schematic_color": "rgba(0, 0, 0, 0.000)", 400 | "track_width": 0.6, 401 | "via_diameter": 0.8, 402 | "via_drill": 0.4, 403 | "wire_width": 6.0 404 | }, 405 | { 406 | "bus_width": 12.0, 407 | "clearance": 0.127, 408 | "diff_pair_gap": 0.127, 409 | "diff_pair_via_gap": 0.25, 410 | "diff_pair_width": 0.65, 411 | "line_style": 0, 412 | "microvia_diameter": 0.3, 413 | "microvia_drill": 0.1, 414 | "name": "USB Data", 415 | "nets": [ 416 | "D_N", 417 | "D_P" 418 | ], 419 | "pcb_color": "rgba(0, 0, 0, 0.000)", 420 | "schematic_color": "rgba(0, 0, 0, 0.000)", 421 | "track_width": 0.2, 422 | "via_diameter": 0.5, 423 | "via_drill": 0.25, 424 | "wire_width": 6.0 425 | } 426 | ], 427 | "meta": { 428 | "version": 2 429 | }, 430 | "net_colors": null 431 | }, 432 | "pcbnew": { 433 | "last_paths": { 434 | "gencad": "", 435 | "idf": "", 436 | "netlist": "", 437 | "specctra_dsn": "", 438 | "step": "", 439 | "vrml": "" 440 | }, 441 | "page_layout_descr_file": "" 442 | }, 443 | "schematic": { 444 | "annotate_start_num": 0, 445 | "drawing": { 446 | "default_line_thickness": 6.0, 447 | "default_text_size": 50.0, 448 | "field_names": [], 449 | "intersheets_ref_own_page": false, 450 | "intersheets_ref_prefix": "", 451 | "intersheets_ref_short": false, 452 | "intersheets_ref_show": false, 453 | "intersheets_ref_suffix": "", 454 | "junction_size_choice": 3, 455 | "label_size_ratio": 0.375, 456 | "pin_symbol_size": 25.0, 457 | "text_offset_ratio": 0.15 458 | }, 459 | "legacy_lib_dir": "", 460 | "legacy_lib_list": [], 461 | "meta": { 462 | "version": 1 463 | }, 464 | "net_format_name": "", 465 | "ngspice": { 466 | "fix_include_paths": true, 467 | "fix_passive_vals": false, 468 | "meta": { 469 | "version": 0 470 | }, 471 | "model_mode": 0, 472 | "workbook_filename": "" 473 | }, 474 | "page_layout_descr_file": "", 475 | "plot_directory": "./", 476 | "spice_adjust_passive_values": false, 477 | "spice_external_command": "spice \"%I\"", 478 | "subpart_first_id": 65, 479 | "subpart_id_separator": 0 480 | }, 481 | "sheets": [ 482 | [ 483 | "3c7f716a-ef14-43e1-9875-4495ece27a97", 484 | "" 485 | ] 486 | ], 487 | "text_variables": {} 488 | } 489 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Leopold FC980C Replacement Controller 2 | ===================================== 3 | 4 | This PCB replaces the controller of the Leopold FC980C keyboard to allow running 5 | alternate firmware, especially open source firmware such as [QMK][QMK]. This 6 | project relies heavily on the prior reverse engineering work done by hasu (aka 7 | tmk) and collaborators. 8 | 9 | This is the first PCB I have designed and as such I suspect this will have many 10 | areas that can be improved. I am very much looking forward to hearing feedback 11 | about this design, if you think something can be improved please open an issue 12 | and let me know. I will list my reasons for various design choices below, as 13 | well as an errata section to list shortcomings of the current design that I am 14 | aware of. 15 | 16 | ![FC980C controller photo](img/main-board-photo.jpg) 17 | (the resistor hand-soldered to the connector is due to a flaw of the revision 1 18 | design, which has been fixed in revision 2) 19 | 20 | **Specs:** 21 | - STM32F401 MCU as found on the Blackpill boards 22 | - Open Hardware licensed under CERN OHL-S v2 23 | - designed to be assembled by [JLCPCB][JLC] (can of course be manufactured 24 | elsewhere, but board component selection has been optimized for JLC's 25 | component library) 26 | 27 | **Why would anyone want a replacement keyboard controller for the FC980C?** In 28 | case the original controller gets fried, the lack of controller replacement from 29 | the manufacturer would otherwise mean tossing the whole (expensive) keyboard. 30 | This board enables the usage of Free and Open Source firmware to replace the 31 | proprietary stock firmware. Running alternate firmware allows enabling hardware 32 | features not accessible through the original controller such as actuation point 33 | adjustments, not to mention the plethora of software features enabled by QMK for 34 | example. 35 | 36 | [QMK]: https://qmk.fm/ 37 | [JLC]: https://jlcpcb.com/ 38 | 39 | Getting started 40 | --------------- 41 | 42 | If you have received this controller fully assembled, your next step will be 43 | firmware setup. Check the `firmware/` directory in this repository. 44 | 45 | In case you still have to solder on the connectors, see the assembly section 46 | below. 47 | 48 | Assembly 49 | -------- 50 | 51 | This PCB is intended to be manufactured and assembled by JLCPCB, **except** for 52 | the connectors and a button on the back of the board, which most likely have to 53 | be soldered on the PCB by hand. 54 | 55 | The button (labled BOOT0) is through-hole and easily soldered by hand. Make sure 56 | to place it on the bottom side, i.e. opposite side of the MCU, where the DIP 57 | switches are on the original controller board. 58 | 59 | The connector for the USB board (USB) is though-hole and can be hand-soldered. 60 | 61 | The SWD header is optional and can be left unsoldered. 62 | 63 | The connector labeled KEYBOARD is only available for surface mounting and 64 | unfortunately not available at JLC for assembly (at least at the time of 65 | design). Hand-soldering is a bit more challenging for this connector. Make sure 66 | to use a healthy dose of flux and fine gauge solder wire. 67 | 68 | Production 69 | ---------- 70 | 71 | While the PCB itself can be manufactured by a number of PCB houses, component 72 | selection and SMD assembly is made with [JLCPCB][JLC] in mind. The 73 | `jlcpcb/production_files` folder for each revision should include the necessary 74 | BOM and CPL files in addition to the Gerbers. The board parameters are specified 75 | in the PCB design file (the main parameters being a board thickness of 1.6mm and 76 | 2 copper layers). For the option "Remove Order Number", you can select "Specify 77 | a location". 78 | 79 | This board is compatible with JLC's "Economic PCBA" option. For option "Assembly 80 | Side", choose "Top Side" and under "Tooling holes" you can specify "Added by 81 | Customer". 82 | 83 | The EEPROM (U4) and accompanying decoupling capacitor (C6) are optional. The 84 | board should work without those populated. 85 | 86 | [JLC]: https://jlcpcb.com/ 87 | 88 | Design review 89 | ------------- 90 | 91 | The specific component selection is tailored to what was available at JLCPCB at 92 | the time of design. While things like the capacitors and resistors can be easily 93 | substituted, Larger ICs such as the USB protection, fuse, 3.3V regulator, and 94 | MCU have not been evaluated for alternative parts. 95 | 96 | The USB and KEYBOARD connectors interface with the existing connectors used in 97 | the FC980C and cannot be substituted. 98 | 99 | I don't intend to sell this controller PCB by myself and as such everyone who is 100 | interested in the design is meant to order this directly from JLC for 101 | themselves. As such, I've tried to minimize cost for low quantity production 102 | runs. JLC has the concept of extended and basic parts where the former incurs a 103 | one-time setup fee per production rund per component as those components require 104 | additional labor for setting up the pick and place machines with the respective 105 | components. I've tried to keep the number of extended components as low as 106 | possible. 107 | 108 | ### MCU 109 | 110 | The main requirements for the microcontroller were 5V tolerance and good 111 | compatibility with QMK. I also tried to take pricing and availability for the 112 | foreseeable future into account. My choice fell on the STM32F401 that is used in 113 | the cheap "Blackpill" development boards. It is well supported by QMK and is 114 | also used in [another Topre controller board project][RFR1Replacement] that 115 | replaces the PCB of the Realforce R1 TKL keyboards. 116 | 117 | [RFR1Replacement]: https://github.com/Cipulot/RF_R1_8-9Xu 118 | 119 | ### Protection circuitry 120 | 121 | The 5V fuse and USB protection components have been carried forward from the 122 | original RP2040-based design (revision 1) and have been taken from 123 | [this][RP2040DesignGuide] RP2040 design guide. 124 | 125 | [RP2040DesignGuide]: https://github.com/Sleepdealr/RP2040-designguide 126 | 127 | ### USB traces 128 | 129 | USB trace width has been calculated using the KiCad built-in calculator 130 | following a [guide on the Digikey blog][DigikeyUSBTraceGuide]. The wide traces 131 | are caused by the board design having two layers and a thickness of 1.6mm. This 132 | is most likely overkill as the bandwidth requirements are very low for a 133 | keyboard. Reviewing a number of other boards, none were using USB-specific trace 134 | widths. 135 | 136 | [DigikeyUSBTraceGuide]: https://www.digikey.de/en/maker/projects/how-to-route-differential-pairs-in-kicad-for-usb/45b99011f5d34879ae1831dce1f13e93 137 | 138 | Errata 139 | ------ 140 | 141 | ### Revision 2 142 | 143 | None found thus far. 144 | 145 | ### Revision 1 146 | 147 | The SWD header is unusable since SWDIO has been routed to the wrong pin on the 148 | MCU (PA15 instead of PA13). This has no impact on the actual controller 149 | functionality. Fixed in revision 2. 150 | 151 | Unfortunately, the `KEY_STATE` pin is missing a 5V pull-up resistor. A manual 152 | fix (such as soldering a 10k resistor between the `KEY_STATE` \[pin 14\] and 5V 153 | pins on the `KEYBOARD` connector) is necessary. Fixed in revision 2. 154 | 155 | Revisions 156 | --------- 157 | 158 | ### Revision 2 159 | 160 | ![rev2 PCB](img/rev2-board-render.png) 161 | 162 | Updates SWD pinout to correctly use PA13 on the MCU for SWDIO instead of PA15. 163 | 164 | Minor position adjustments to drill holes. 165 | 166 | Adds 5V pull-up resistor to `KEY_STATE` line. 167 | 168 | Removes I2C level shifter to simplify BOM. 169 | 170 | **Sample tested and working:** not yet—it is recommended to enable the options 171 | "Confirm Production file" and "Confirm Parts Placement" when ordering from 172 | JLC 173 | 174 | ### Revision 1 175 | 176 | ![rev1 PCB](img/rev1-board-photo.jpg) 177 | 178 | First design that has a chance to actually work in the FC980C. Switch to a 179 | STM32F401 microcontroller. This MCU allows saving a couple of components 180 | compared to the RP2040, such as USB termination resistors and external flash. 181 | 182 | One notable addition compared to the previous revision is an optional 64Kb 183 | EEPROM. 184 | 185 | **Sample tested and working:** tested and issues identified (see Errata 186 | section), working with the suggested manual fixes 187 | 188 | ### Revision 0 189 | 190 | ![rev0 PCB](img/rev0-board-render.png) 191 | 192 | The first version of this PCB uses a RP2040 controller. Unfortunately, the 193 | FC980C electronics rely on the MCU being 5V tolerant. I have noticed this only 194 | while triple checking the design *just* before submitting it for manufacturing. 195 | The RP2040 is *not* 5V tolerant and would require level shifters on many I/O 196 | lines. Because of that I decided to scrap the design and start anew, but since 197 | the board design was pretty much complete, I'm including it in this repository 198 | for posterity. 199 | 200 | **Sample tested and working:** no 201 | 202 | Acknowledgements 203 | ---------------- 204 | 205 | This replacement controller relies heavily on the [prior reverse engineering 206 | work][GeekhackFC980CInvestigation] of the keyboard community, including 207 | uncovering [schematics][FC660CSchematics] for the similar Leopold FC660C that 208 | were submitted to the FCC that helped me figure out the I/O voltage 209 | requirements. In particular, I want to thank hasu (aka tmk) who created a FC980C 210 | replacement controller based on the ATmega32u4 MCU, publishing schematics and an 211 | [open source firmware implementation][TMKFC980C] for tmk that has been 212 | [ported][QMKFC980C] to QMK. 213 | 214 | Thanks to Toocanzs#5098 from the QMK Discord for helping me with the crystal 215 | load capacitor calculation. 216 | 217 | The PCB has been designed using KiCad 6 and production files have been exported 218 | using [Bouni's JLCPCB tools plugin][BouniJLCPlugin]. 219 | 220 | [GeekhackFC980CInvestigation]: https://geekhack.org/index.php?topic=90681.0 221 | [FC660CSchematics]: https://fccid.io/pdf.php?id=1888185 222 | [TMKFC980C]: https://github.com/tmk/tmk_keyboard/tree/master/keyboard/fc980c 223 | [QMKFC980C]: https://github.com/qmk/qmk_firmware/tree/f21443d6a2be8e2068164f0f3646a175ffed2df4/keyboards/fc980c 224 | [BouniJLCPlugin]: https://github.com/Bouni/kicad-jlcpcb-tools 225 | 226 | Resources 227 | --------- 228 | 229 | These are various resources, that helped me designing my first PCB: 230 | 231 | - STM AN4488 - Getting started with STM32F4xxxx MCU hardware development 232 | - [I2C pullup recommendation by adafruit](https://learn.adafruit.com/working-with-i2c-devices/pull-up-resistors), 233 | [I2C pullup calculator](http://lembke.eu/arduinoablage/20201103i2cpullupcalculator/) 234 | - [I2C Design Mathematics: Capacitance and Resistance](https://www.allaboutcircuits.com/technical-articles/i2c-design-mathematics-capacitance-and-resistance/) 235 | - [Can an STM32 chip directly interface with a 5V I2C bus?](https://electronics.stackexchange.com/questions/50435/can-i-directly-interface-to-5v-i2c-devices-with-an-stm32-running-on-1-8v?r=SearchResults) 236 | - [5V to 3.3V logic level translation/conversion/shifting](https://next-hack.com/index.php/2017/09/15/how-to-interface-a-5v-output-to-a-3-3v-input/) 237 | - STM AN2867 - Oscillator design guide for STM8S, STM8A and STM32 238 | microcontrollers 239 | - [Crystal capacitor guide by adafruit](https://blog.adafruit.com/2012/01/24/choosing-the-right-crystal-and-caps-for-your-design/) 240 | - [STM32 Oscillator Calculator](https://helios.wh2.tu-dresden.de/~benni_koch/stmcalculator/) 241 | - [Crystal Oscillator Design](https://hoani.net/posts/blog/2017-01-19-oscillator-design/) 242 | - [Can the STM32-internal pull-up resistors be used with 5V lines?](http://forums.netduino.com/index.php?/topic/10401-guidance-using-5v-signals-with-pull-upspull-downs/) 243 | - [KiCad differential pair routing guide by Digikey](https://www.digikey.de/en/maker/projects/how-to-route-differential-pairs-in-kicad-for-usb/45b99011f5d34879ae1831dce1f13e93) 244 | - [RP2040 hardware design guide by Sleepdealr](https://github.com/Sleepdealr/RP2040-designguide) 245 | - [KiCad 6 STM32 tutorial by Phil's Lab](https://www.youtube.com/watch?v=aVUqaB0IMh4) 246 | - [KiCad PCB tutorial by MalphasWats](https://github.com/MalphasWats/hawk) 247 | - [Layout Design Guide by Toradex](https://docs.toradex.com/102492-layout-design-guide.pdf) 248 | - [Effective PCB Design by NXP](https://www.nxp.com/files-static/training_pdf/WBNR_PCBDESIGN.pdf) 249 | 250 | This helped with the software matrix scanning implementation: 251 | 252 | - [Using STM32 GPIO with ChibiOS PAL Driver](https://www.playembedded.org/blog/stm32-gpio-chibios-pal/) 253 | 254 | This helped me immensensly in figuring out the FC980C-specific hardware 255 | requirements for the FC980C controller: 256 | 257 | - [FC980C pinout](https://github.com/tmk/tmk_keyboard/blob/4df8a27f7220c5f801f16151d31d4db8e563c2fa/keyboard/fc980c/README.md) by tmk 258 | - FC660C [schematic](https://fccid.io/pdf.php?id=1888185) and [BOM](https://fccid.io/pdf.php?id=1888184) 259 | 260 | 261 | License 262 | ------- 263 | 264 | Copyright © 2022 Wilhelm Schuster 265 | 266 | This PCB design is licensed under the CERN-OHL-S v2. See the LICENSE file in 267 | each of the revision folders for the license text. This license is strongly 268 | reciprocal and is similar in spirit to the GPL, but specifically focuses on 269 | hardware. 270 | 271 | The firmware portion of this project is licensed under GPL-2-or-later in 272 | accordance with the QMK project. See the LICENSE file in the firmware folder for 273 | the license text. 274 | -------------------------------------------------------------------------------- /components/sleep-lib/RP2040-QFN-56.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "RP2040-QFN-56" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 5EF32B43) 4 | (descr "QFN, 56 Pin (http://www.cypress.com/file/416486/download#page=40), generated with kicad-footprint-generator ipc_dfn_qfn_generator.py") 5 | (tags "QFN DFN_QFN") 6 | (attr smd) 7 | (fp_text reference "REF**" (at 0 -4.82) (layer "F.SilkS") 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | (tstamp 94ec11cf-5c3f-4978-bba0-0d274b9e5842) 10 | ) 11 | (fp_text value "Pico2040-QFN-56" (at 0 4.82) (layer "F.Fab") 12 | (effects (font (size 1 1) (thickness 0.15))) 13 | (tstamp f812e9be-04d5-4eb4-9be7-b7193c3c3fcf) 14 | ) 15 | (fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab") 16 | (effects (font (size 1 1) (thickness 0.15))) 17 | (tstamp 671b3324-51ec-4d97-b5e9-ffce67fca928) 18 | ) 19 | (fp_line (start 3.61 3.61) (end 3.61 2.96) (layer "F.SilkS") (width 0.12) (tstamp 13d90c02-0979-4194-91db-9ca5c313c477)) 20 | (fp_line (start 2.96 -3.61) (end 3.61 -3.61) (layer "F.SilkS") (width 0.12) (tstamp 29f51482-bc4e-4f72-83f4-a7a934cb17e3)) 21 | (fp_line (start -2.96 -3.61) (end -3.61 -3.61) (layer "F.SilkS") (width 0.12) (tstamp 79f8822a-d38e-422d-9516-3d4ca05762ce)) 22 | (fp_line (start -3.61 3.61) (end -3.61 2.96) (layer "F.SilkS") (width 0.12) (tstamp 87ccece7-e444-4a57-9ab1-0500cdde9c5a)) 23 | (fp_line (start 3.61 -3.61) (end 3.61 -2.96) (layer "F.SilkS") (width 0.12) (tstamp a70a6450-c1ae-49d5-8916-85503da6e8d2)) 24 | (fp_line (start 2.96 3.61) (end 3.61 3.61) (layer "F.SilkS") (width 0.12) (tstamp caf8a340-a953-4b51-ab56-ca793c38cdab)) 25 | (fp_line (start -2.96 3.61) (end -3.61 3.61) (layer "F.SilkS") (width 0.12) (tstamp e3f9d875-edd3-4d51-b7a8-ae3a4bbebb6f)) 26 | (fp_line (start -4.12 -4.12) (end -4.12 4.12) (layer "F.CrtYd") (width 0.05) (tstamp 429b444b-9837-4aef-a851-4631ad176ec3)) 27 | (fp_line (start 4.12 -4.12) (end -4.12 -4.12) (layer "F.CrtYd") (width 0.05) (tstamp 7ba9035e-d3cb-4c53-8541-4b9ed4d5db7d)) 28 | (fp_line (start -4.12 4.12) (end 4.12 4.12) (layer "F.CrtYd") (width 0.05) (tstamp 7ed4a499-b8e5-4d9e-9b0f-bb636141f130)) 29 | (fp_line (start 4.12 4.12) (end 4.12 -4.12) (layer "F.CrtYd") (width 0.05) (tstamp bc5ba383-e992-492d-9a6b-71bf89d42723)) 30 | (fp_line (start -2.5 -3.5) (end 3.5 -3.5) (layer "F.Fab") (width 0.1) (tstamp 0c438463-e482-4670-83b6-e8e0dfd97845)) 31 | (fp_line (start -3.5 3.5) (end -3.5 -2.5) (layer "F.Fab") (width 0.1) (tstamp 68950f97-f397-4891-8791-a66f69be4f1c)) 32 | (fp_line (start 3.5 -3.5) (end 3.5 3.5) (layer "F.Fab") (width 0.1) (tstamp 723f884d-157e-427b-990b-9dcddb2eca93)) 33 | (fp_line (start 3.5 3.5) (end -3.5 3.5) (layer "F.Fab") (width 0.1) (tstamp ca668808-3e27-4fe4-ab59-23ee3ffb586f)) 34 | (fp_line (start -3.5 -2.5) (end -2.5 -3.5) (layer "F.Fab") (width 0.1) (tstamp dcfef913-9815-4343-bfb0-336465982c8f)) 35 | (pad "" smd roundrect (at 0.6375 0.6375) (size 1.084435 1.084435) (layers "F.Paste") (roundrect_rratio 0.230535) (tstamp 446859f1-7b89-4a59-98bb-150ec3eb243a)) 36 | (pad "" smd roundrect (at 0.6375 -0.6375) (size 1.084435 1.084435) (layers "F.Paste") (roundrect_rratio 0.230535) (tstamp 69adb160-87f9-467c-bfbb-d996ca850208)) 37 | (pad "" smd roundrect (at -0.6375 -0.6375) (size 1.084435 1.084435) (layers "F.Paste") (roundrect_rratio 0.230535) (tstamp a6ab6992-6165-4224-a885-60bcf08e0044)) 38 | (pad "" smd roundrect (at -0.6375 0.6375) (size 1.084435 1.084435) (layers "F.Paste") (roundrect_rratio 0.230535) (tstamp f677169f-f73e-4a24-b130-be34d402776a)) 39 | (pad "1" smd roundrect (at -3.4375 -2.6) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp b3d2b4d3-2b01-4693-af2b-417d3727b357)) 40 | (pad "2" smd roundrect (at -3.4375 -2.2) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 171e57a4-06a9-4403-83a3-1b17de018585)) 41 | (pad "3" smd roundrect (at -3.4375 -1.8) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 7425aedd-1487-43a6-bc2b-ae1ad95861ef)) 42 | (pad "4" smd roundrect (at -3.4375 -1.4) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp b3825ddf-317f-46db-b753-a6d4e9c8fc65)) 43 | (pad "5" smd roundrect (at -3.4375 -1) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 685a40d6-2673-4d4f-929b-368263d17188)) 44 | (pad "6" smd roundrect (at -3.4375 -0.6) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp a70b8d46-e505-4099-98cf-961a76cf4fe7)) 45 | (pad "7" smd roundrect (at -3.4375 -0.2) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 5e6c2e08-65d8-4147-8d0a-2b67ee693a9c)) 46 | (pad "8" smd roundrect (at -3.4375 0.2) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 9744a668-55b2-4c74-bc5a-6d52b0d98155)) 47 | (pad "9" smd roundrect (at -3.4375 0.6) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 19f55147-b6d8-4185-9800-f97f8073b922)) 48 | (pad "10" smd roundrect (at -3.4375 1) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 7be68ac1-344b-49fc-bc24-5768b27f7848)) 49 | (pad "11" smd roundrect (at -3.4375 1.4) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 004418a7-bd89-4792-9cad-7497fd975bb6)) 50 | (pad "12" smd roundrect (at -3.4375 1.8) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 34c17049-6cfc-4fb1-ac6d-210dce55dcac)) 51 | (pad "13" smd roundrect (at -3.4375 2.2) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 5e5532e9-6b81-4516-bb36-1fee969f42ae)) 52 | (pad "14" smd roundrect (at -3.4375 2.6) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp b050887d-acdf-4c1a-ab68-a569c2e7da93)) 53 | (pad "15" smd roundrect (at -2.6 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp fab799ef-0ea9-4aac-81d6-632b77c7550a)) 54 | (pad "16" smd roundrect (at -2.2 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp b81e9dfa-eac9-412b-bada-18f148a03f38)) 55 | (pad "17" smd roundrect (at -1.8 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp df1c2e15-8650-46a1-8381-b7df15521755)) 56 | (pad "18" smd roundrect (at -1.4 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 1dbc3843-4d6b-4fc8-971f-7349e21d79a8)) 57 | (pad "19" smd roundrect (at -1 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 26acd3e7-16af-4f07-bad0-21e0aa63b4c2)) 58 | (pad "20" smd roundrect (at -0.6 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 063fb44d-3d5d-44db-8875-6a2706ece7c2)) 59 | (pad "21" smd roundrect (at -0.2 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 4a06aef5-87a4-41bc-a6f9-656ad2fd929e)) 60 | (pad "22" smd roundrect (at 0.2 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 2f6730ff-0b79-4d0c-aed3-b1eebb6860dc)) 61 | (pad "23" smd roundrect (at 0.6 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp d159c08d-d506-4a23-ad2d-b67e2a3c7f48)) 62 | (pad "24" smd roundrect (at 1 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 51ca153e-59b4-405a-8eef-fd0b5505546a)) 63 | (pad "25" smd roundrect (at 1.4 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 0c007cb4-c975-4bf6-a454-3ca05cdb5a8a)) 64 | (pad "26" smd roundrect (at 1.8 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 72436c38-9132-4583-9391-f89ebefd0f1b)) 65 | (pad "27" smd roundrect (at 2.2 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 6158f631-5e98-45b8-a07d-83ddfb242ef1)) 66 | (pad "28" smd roundrect (at 2.6 3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 29b994c0-3b69-40fd-984d-8614f48afabd)) 67 | (pad "29" smd roundrect (at 3.4375 2.6) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp bfb71042-c5fb-4883-bbb0-78eb46da5320)) 68 | (pad "30" smd roundrect (at 3.4375 2.2) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 66816118-cd31-4357-88f8-593ea2bf5386)) 69 | (pad "31" smd roundrect (at 3.4375 1.8) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp f75c5f55-2d43-459d-bf12-fa36d6a79f2d)) 70 | (pad "32" smd roundrect (at 3.4375 1.4) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp ba81e1d2-5c52-41a8-8908-5dd97a7f1ee1)) 71 | (pad "33" smd roundrect (at 3.4375 1) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 6cccd078-c404-4f3e-ad0e-ac590922dde3)) 72 | (pad "34" smd roundrect (at 3.4375 0.6) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp ad74ebdc-cb66-4284-bcb6-3509df8a60fb)) 73 | (pad "35" smd roundrect (at 3.4375 0.2) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 59f5d70d-acd0-441f-b0d1-07d3c6e53071)) 74 | (pad "36" smd roundrect (at 3.4375 -0.2) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 40b4b56d-330c-478d-8fc7-b2577dab6f71)) 75 | (pad "37" smd roundrect (at 3.4375 -0.6) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 0666fda0-83e1-4774-aac6-a92fbd862f65)) 76 | (pad "38" smd roundrect (at 3.4375 -1) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 6200193b-0cb6-45f1-9d92-f8055de23933)) 77 | (pad "39" smd roundrect (at 3.4375 -1.4) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 9663723c-8c5f-456c-beda-1de7c8ebec58)) 78 | (pad "40" smd roundrect (at 3.4375 -1.8) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 42888177-dbe9-4226-a5af-8f4907ed23b3)) 79 | (pad "41" smd roundrect (at 3.4375 -2.2) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 5c38cb07-8ce8-4de2-bc1c-556499df4e66)) 80 | (pad "42" smd roundrect (at 3.4375 -2.6) (size 0.875 0.2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 5bfd7fbf-edbf-4856-9fd2-51c80ea4f30a)) 81 | (pad "43" smd roundrect (at 2.6 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 0dff0ee0-7ee1-42ce-81e9-a99bf1d2e9de)) 82 | (pad "44" smd roundrect (at 2.2 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 606d6119-ed5e-4089-b05e-55d682a811c4)) 83 | (pad "45" smd roundrect (at 1.8 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp e90e9e91-d41c-4d53-8b72-763608bd8438)) 84 | (pad "46" smd roundrect (at 1.4 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 449e2bc0-d78c-46ea-8e0d-2d12751cb8d8)) 85 | (pad "47" smd roundrect (at 1 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 45185d5d-306f-46a8-afbd-ac5f14e012a0)) 86 | (pad "48" smd roundrect (at 0.6 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 39b53b5e-2125-499c-80e4-8ec1265c818a)) 87 | (pad "49" smd roundrect (at 0.2 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp c65bde64-5c5d-4e4f-a605-b9b4f551c23e)) 88 | (pad "50" smd roundrect (at -0.2 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 2787e441-b846-4ec1-b5c8-55e11b148225)) 89 | (pad "51" smd roundrect (at -0.6 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp d75d68cc-262f-4bbb-a19d-c4474c38f9aa)) 90 | (pad "52" smd roundrect (at -1 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 0cbba4b8-0d4b-4e6d-b66c-615f65b38f6b)) 91 | (pad "53" smd roundrect (at -1.4 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp bf5e0f88-5596-4d99-ab5e-26becfa71a88)) 92 | (pad "54" smd roundrect (at -1.8 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp d0b63eb8-f128-4943-9a95-de5866a7213d)) 93 | (pad "55" smd roundrect (at -2.2 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp f1cc50c6-304d-4330-be01-929a8fa6d5be)) 94 | (pad "56" smd roundrect (at -2.6 -3.4375) (size 0.2 0.875) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 0276951b-e7e8-402f-b6fc-925de1e4cc76)) 95 | (pad "57" thru_hole circle (at -1.275 -1.275) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp 05a12fc4-dcea-4df1-800b-44923ff72709)) 96 | (pad "57" thru_hole circle (at 0 -1.275) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp 2590cc37-b5b5-4a03-a8f8-015ade801f28)) 97 | (pad "57" thru_hole circle (at 1.275 -1.275) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp 50175e31-6587-4376-9f96-6542d3964a0b)) 98 | (pad "57" smd roundrect (at 0 0) (size 3.2 3.2) (layers "F.Cu" "F.Mask") (roundrect_rratio 0.045) (tstamp 6d4c1bd7-fce8-473c-ad02-d4a0a5414180)) 99 | (pad "57" thru_hole circle (at 0 0) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp 7ef582e4-bc20-4fd7-8ade-85c68ecd8976)) 100 | (pad "57" thru_hole circle (at -1.275 0) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp a0e181d5-9dbc-4ad7-a6c1-e15319412e36)) 101 | (pad "57" thru_hole circle (at 0 1.275) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp ab7c768e-0733-4c73-994e-c0ff1ee9adfe)) 102 | (pad "57" thru_hole circle (at -1.275 1.275) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp adfa17fb-ecf3-4fc9-894b-0249683327ae)) 103 | (pad "57" thru_hole circle (at 1.275 1.275) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp c279ce41-85f8-48f6-8196-24f9b38cbf28)) 104 | (pad "57" thru_hole circle (at 1.275 0) (size 0.6 0.6) (drill 0.35) (layers *.Cu) (tstamp f28683ad-132c-41e2-8b69-45cf73d1c3f1)) 105 | (model "${KIPRJMOD}/../components/sleep-lib/RP2040_QFN_PACKAGE.step" 106 | (offset (xyz 0 0 0)) 107 | (scale (xyz 1 1 1)) 108 | (rotate (xyz 0 0 0)) 109 | ) 110 | ) 111 | -------------------------------------------------------------------------------- /rev0/LICENSE.txt: -------------------------------------------------------------------------------- 1 | CERN Open Hardware Licence Version 2 - Strongly Reciprocal 2 | 3 | 4 | Preamble 5 | 6 | CERN has developed this licence to promote collaboration among 7 | hardware designers and to provide a legal tool which supports the 8 | freedom to use, study, modify, share and distribute hardware designs 9 | and products based on those designs. Version 2 of the CERN Open 10 | Hardware Licence comes in three variants: CERN-OHL-P (permissive); and 11 | two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this 12 | licence, CERN-OHL-S (strongly reciprocal). 13 | 14 | The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in 15 | unmodified form only. 16 | 17 | Use of this Licence does not imply any endorsement by CERN of any 18 | Licensor or their designs nor does it imply any involvement by CERN in 19 | their development. 20 | 21 | 22 | 1 Definitions 23 | 24 | 1.1 'Licence' means this CERN-OHL-S. 25 | 26 | 1.2 'Compatible Licence' means 27 | 28 | a) any earlier version of the CERN Open Hardware licence, or 29 | 30 | b) any version of the CERN-OHL-S, or 31 | 32 | c) any licence which permits You to treat the Source to which 33 | it applies as licensed under CERN-OHL-S provided that on 34 | Conveyance of any such Source, or any associated Product You 35 | treat the Source in question as being licensed under 36 | CERN-OHL-S. 37 | 38 | 1.3 'Source' means information such as design materials or digital 39 | code which can be applied to Make or test a Product or to 40 | prepare a Product for use, Conveyance or sale, regardless of its 41 | medium or how it is expressed. It may include Notices. 42 | 43 | 1.4 'Covered Source' means Source that is explicitly made available 44 | under this Licence. 45 | 46 | 1.5 'Product' means any device, component, work or physical object, 47 | whether in finished or intermediate form, arising from the use, 48 | application or processing of Covered Source. 49 | 50 | 1.6 'Make' means to create or configure something, whether by 51 | manufacture, assembly, compiling, loading or applying Covered 52 | Source or another Product or otherwise. 53 | 54 | 1.7 'Available Component' means any part, sub-assembly, library or 55 | code which: 56 | 57 | a) is licensed to You as Complete Source under a Compatible 58 | Licence; or 59 | 60 | b) is available, at the time a Product or the Source containing 61 | it is first Conveyed, to You and any other prospective 62 | licensees 63 | 64 | i) as a physical part with sufficient rights and 65 | information (including any configuration and 66 | programming files and information about its 67 | characteristics and interfaces) to enable it either to 68 | be Made itself, or to be sourced and used to Make the 69 | Product; or 70 | ii) as part of the normal distribution of a tool used to 71 | design or Make the Product. 72 | 73 | 1.8 'Complete Source' means the set of all Source necessary to Make 74 | a Product, in the preferred form for making modifications, 75 | including necessary installation and interfacing information 76 | both for the Product, and for any included Available Components. 77 | If the format is proprietary, it must also be made available in 78 | a format (if the proprietary tool can create it) which is 79 | viewable with a tool available to potential licensees and 80 | licensed under a licence approved by the Free Software 81 | Foundation or the Open Source Initiative. Complete Source need 82 | not include the Source of any Available Component, provided that 83 | You include in the Complete Source sufficient information to 84 | enable a recipient to Make or source and use the Available 85 | Component to Make the Product. 86 | 87 | 1.9 'Source Location' means a location where a Licensor has placed 88 | Covered Source, and which that Licensor reasonably believes will 89 | remain easily accessible for at least three years for anyone to 90 | obtain a digital copy. 91 | 92 | 1.10 'Notice' means copyright, acknowledgement and trademark notices, 93 | Source Location references, modification notices (subsection 94 | 3.3(b)) and all notices that refer to this Licence and to the 95 | disclaimer of warranties that are included in the Covered 96 | Source. 97 | 98 | 1.11 'Licensee' or 'You' means any person exercising rights under 99 | this Licence. 100 | 101 | 1.12 'Licensor' means a natural or legal person who creates or 102 | modifies Covered Source. A person may be a Licensee and a 103 | Licensor at the same time. 104 | 105 | 1.13 'Convey' means to communicate to the public or distribute. 106 | 107 | 108 | 2 Applicability 109 | 110 | 2.1 This Licence governs the use, copying, modification, Conveying 111 | of Covered Source and Products, and the Making of Products. By 112 | exercising any right granted under this Licence, You irrevocably 113 | accept these terms and conditions. 114 | 115 | 2.2 This Licence is granted by the Licensor directly to You, and 116 | shall apply worldwide and without limitation in time. 117 | 118 | 2.3 You shall not attempt to restrict by contract or otherwise the 119 | rights granted under this Licence to other Licensees. 120 | 121 | 2.4 This Licence is not intended to restrict fair use, fair dealing, 122 | or any other similar right. 123 | 124 | 125 | 3 Copying, Modifying and Conveying Covered Source 126 | 127 | 3.1 You may copy and Convey verbatim copies of Covered Source, in 128 | any medium, provided You retain all Notices. 129 | 130 | 3.2 You may modify Covered Source, other than Notices, provided that 131 | You irrevocably undertake to make that modified Covered Source 132 | available from a Source Location should You Convey a Product in 133 | circumstances where the recipient does not otherwise receive a 134 | copy of the modified Covered Source. In each case subsection 3.3 135 | shall apply. 136 | 137 | You may only delete Notices if they are no longer applicable to 138 | the corresponding Covered Source as modified by You and You may 139 | add additional Notices applicable to Your modifications. 140 | Including Covered Source in a larger work is modifying the 141 | Covered Source, and the larger work becomes modified Covered 142 | Source. 143 | 144 | 3.3 You may Convey modified Covered Source (with the effect that You 145 | shall also become a Licensor) provided that You: 146 | 147 | a) retain Notices as required in subsection 3.2; 148 | 149 | b) add a Notice to the modified Covered Source stating that You 150 | have modified it, with the date and brief description of how 151 | You have modified it; 152 | 153 | c) add a Source Location Notice for the modified Covered Source 154 | if You Convey in circumstances where the recipient does not 155 | otherwise receive a copy of the modified Covered Source; and 156 | 157 | d) license the modified Covered Source under the terms and 158 | conditions of this Licence (or, as set out in subsection 159 | 8.3, a later version, if permitted by the licence of the 160 | original Covered Source). Such modified Covered Source must 161 | be licensed as a whole, but excluding Available Components 162 | contained in it, which remain licensed under their own 163 | applicable licences. 164 | 165 | 166 | 4 Making and Conveying Products 167 | 168 | You may Make Products, and/or Convey them, provided that You either 169 | provide each recipient with a copy of the Complete Source or ensure 170 | that each recipient is notified of the Source Location of the Complete 171 | Source. That Complete Source is Covered Source, and You must 172 | accordingly satisfy Your obligations set out in subsection 3.3. If 173 | specified in a Notice, the Product must visibly and securely display 174 | the Source Location on it or its packaging or documentation in the 175 | manner specified in that Notice. 176 | 177 | 178 | 5 Research and Development 179 | 180 | You may Convey Covered Source, modified Covered Source or Products to 181 | a legal entity carrying out development, testing or quality assurance 182 | work on Your behalf provided that the work is performed on terms which 183 | prevent the entity from both using the Source or Products for its own 184 | internal purposes and Conveying the Source or Products or any 185 | modifications to them to any person other than You. Any modifications 186 | made by the entity shall be deemed to be made by You pursuant to 187 | subsection 3.2. 188 | 189 | 190 | 6 DISCLAIMER AND LIABILITY 191 | 192 | 6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products 193 | are provided 'as is' and any express or implied warranties, 194 | including, but not limited to, implied warranties of 195 | merchantability, of satisfactory quality, non-infringement of 196 | third party rights, and fitness for a particular purpose or use 197 | are disclaimed in respect of any Source or Product to the 198 | maximum extent permitted by law. The Licensor makes no 199 | representation that any Source or Product does not or will not 200 | infringe any patent, copyright, trade secret or other 201 | proprietary right. The entire risk as to the use, quality, and 202 | performance of any Source or Product shall be with You and not 203 | the Licensor. This disclaimer of warranty is an essential part 204 | of this Licence and a condition for the grant of any rights 205 | granted under this Licence. 206 | 207 | 6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to 208 | the maximum extent permitted by law, have no liability for 209 | direct, indirect, special, incidental, consequential, exemplary, 210 | punitive or other damages of any character including, without 211 | limitation, procurement of substitute goods or services, loss of 212 | use, data or profits, or business interruption, however caused 213 | and on any theory of contract, warranty, tort (including 214 | negligence), product liability or otherwise, arising in any way 215 | in relation to the Covered Source, modified Covered Source 216 | and/or the Making or Conveyance of a Product, even if advised of 217 | the possibility of such damages, and You shall hold the 218 | Licensor(s) free and harmless from any liability, costs, 219 | damages, fees and expenses, including claims by third parties, 220 | in relation to such use. 221 | 222 | 223 | 7 Patents 224 | 225 | 7.1 Subject to the terms and conditions of this Licence, each 226 | Licensor hereby grants to You a perpetual, worldwide, 227 | non-exclusive, no-charge, royalty-free, irrevocable (except as 228 | stated in subsections 7.2 and 8.4) patent licence to Make, have 229 | Made, use, offer to sell, sell, import, and otherwise transfer 230 | the Covered Source and Products, where such licence applies only 231 | to those patent claims licensable by such Licensor that are 232 | necessarily infringed by exercising rights under the Covered 233 | Source as Conveyed by that Licensor. 234 | 235 | 7.2 If You institute patent litigation against any entity (including 236 | a cross-claim or counterclaim in a lawsuit) alleging that the 237 | Covered Source or a Product constitutes direct or contributory 238 | patent infringement, or You seek any declaration that a patent 239 | licensed to You under this Licence is invalid or unenforceable 240 | then any rights granted to You under this Licence shall 241 | terminate as of the date such process is initiated. 242 | 243 | 244 | 8 General 245 | 246 | 8.1 If any provisions of this Licence are or subsequently become 247 | invalid or unenforceable for any reason, the remaining 248 | provisions shall remain effective. 249 | 250 | 8.2 You shall not use any of the name (including acronyms and 251 | abbreviations), image, or logo by which the Licensor or CERN is 252 | known, except where needed to comply with section 3, or where 253 | the use is otherwise allowed by law. Any such permitted use 254 | shall be factual and shall not be made so as to suggest any kind 255 | of endorsement or implication of involvement by the Licensor or 256 | its personnel. 257 | 258 | 8.3 CERN may publish updated versions and variants of this Licence 259 | which it considers to be in the spirit of this version, but may 260 | differ in detail to address new problems or concerns. New 261 | versions will be published with a unique version number and a 262 | variant identifier specifying the variant. If the Licensor has 263 | specified that a given variant applies to the Covered Source 264 | without specifying a version, You may treat that Covered Source 265 | as being released under any version of the CERN-OHL with that 266 | variant. If no variant is specified, the Covered Source shall be 267 | treated as being released under CERN-OHL-S. The Licensor may 268 | also specify that the Covered Source is subject to a specific 269 | version of the CERN-OHL or any later version in which case You 270 | may apply this or any later version of CERN-OHL with the same 271 | variant identifier published by CERN. 272 | 273 | 8.4 This Licence shall terminate with immediate effect if You fail 274 | to comply with any of its terms and conditions. 275 | 276 | 8.5 However, if You cease all breaches of this Licence, then Your 277 | Licence from any Licensor is reinstated unless such Licensor has 278 | terminated this Licence by giving You, while You remain in 279 | breach, a notice specifying the breach and requiring You to cure 280 | it within 30 days, and You have failed to come into compliance 281 | in all material respects by the end of the 30 day period. Should 282 | You repeat the breach after receipt of a cure notice and 283 | subsequent reinstatement, this Licence will terminate 284 | immediately and permanently. Section 6 shall continue to apply 285 | after any termination. 286 | 287 | 8.6 This Licence shall not be enforceable except by a Licensor 288 | acting as such, and third party beneficiary rights are 289 | specifically excluded. 290 | -------------------------------------------------------------------------------- /rev1/LICENSE.txt: -------------------------------------------------------------------------------- 1 | CERN Open Hardware Licence Version 2 - Strongly Reciprocal 2 | 3 | 4 | Preamble 5 | 6 | CERN has developed this licence to promote collaboration among 7 | hardware designers and to provide a legal tool which supports the 8 | freedom to use, study, modify, share and distribute hardware designs 9 | and products based on those designs. Version 2 of the CERN Open 10 | Hardware Licence comes in three variants: CERN-OHL-P (permissive); and 11 | two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this 12 | licence, CERN-OHL-S (strongly reciprocal). 13 | 14 | The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in 15 | unmodified form only. 16 | 17 | Use of this Licence does not imply any endorsement by CERN of any 18 | Licensor or their designs nor does it imply any involvement by CERN in 19 | their development. 20 | 21 | 22 | 1 Definitions 23 | 24 | 1.1 'Licence' means this CERN-OHL-S. 25 | 26 | 1.2 'Compatible Licence' means 27 | 28 | a) any earlier version of the CERN Open Hardware licence, or 29 | 30 | b) any version of the CERN-OHL-S, or 31 | 32 | c) any licence which permits You to treat the Source to which 33 | it applies as licensed under CERN-OHL-S provided that on 34 | Conveyance of any such Source, or any associated Product You 35 | treat the Source in question as being licensed under 36 | CERN-OHL-S. 37 | 38 | 1.3 'Source' means information such as design materials or digital 39 | code which can be applied to Make or test a Product or to 40 | prepare a Product for use, Conveyance or sale, regardless of its 41 | medium or how it is expressed. It may include Notices. 42 | 43 | 1.4 'Covered Source' means Source that is explicitly made available 44 | under this Licence. 45 | 46 | 1.5 'Product' means any device, component, work or physical object, 47 | whether in finished or intermediate form, arising from the use, 48 | application or processing of Covered Source. 49 | 50 | 1.6 'Make' means to create or configure something, whether by 51 | manufacture, assembly, compiling, loading or applying Covered 52 | Source or another Product or otherwise. 53 | 54 | 1.7 'Available Component' means any part, sub-assembly, library or 55 | code which: 56 | 57 | a) is licensed to You as Complete Source under a Compatible 58 | Licence; or 59 | 60 | b) is available, at the time a Product or the Source containing 61 | it is first Conveyed, to You and any other prospective 62 | licensees 63 | 64 | i) as a physical part with sufficient rights and 65 | information (including any configuration and 66 | programming files and information about its 67 | characteristics and interfaces) to enable it either to 68 | be Made itself, or to be sourced and used to Make the 69 | Product; or 70 | ii) as part of the normal distribution of a tool used to 71 | design or Make the Product. 72 | 73 | 1.8 'Complete Source' means the set of all Source necessary to Make 74 | a Product, in the preferred form for making modifications, 75 | including necessary installation and interfacing information 76 | both for the Product, and for any included Available Components. 77 | If the format is proprietary, it must also be made available in 78 | a format (if the proprietary tool can create it) which is 79 | viewable with a tool available to potential licensees and 80 | licensed under a licence approved by the Free Software 81 | Foundation or the Open Source Initiative. Complete Source need 82 | not include the Source of any Available Component, provided that 83 | You include in the Complete Source sufficient information to 84 | enable a recipient to Make or source and use the Available 85 | Component to Make the Product. 86 | 87 | 1.9 'Source Location' means a location where a Licensor has placed 88 | Covered Source, and which that Licensor reasonably believes will 89 | remain easily accessible for at least three years for anyone to 90 | obtain a digital copy. 91 | 92 | 1.10 'Notice' means copyright, acknowledgement and trademark notices, 93 | Source Location references, modification notices (subsection 94 | 3.3(b)) and all notices that refer to this Licence and to the 95 | disclaimer of warranties that are included in the Covered 96 | Source. 97 | 98 | 1.11 'Licensee' or 'You' means any person exercising rights under 99 | this Licence. 100 | 101 | 1.12 'Licensor' means a natural or legal person who creates or 102 | modifies Covered Source. A person may be a Licensee and a 103 | Licensor at the same time. 104 | 105 | 1.13 'Convey' means to communicate to the public or distribute. 106 | 107 | 108 | 2 Applicability 109 | 110 | 2.1 This Licence governs the use, copying, modification, Conveying 111 | of Covered Source and Products, and the Making of Products. By 112 | exercising any right granted under this Licence, You irrevocably 113 | accept these terms and conditions. 114 | 115 | 2.2 This Licence is granted by the Licensor directly to You, and 116 | shall apply worldwide and without limitation in time. 117 | 118 | 2.3 You shall not attempt to restrict by contract or otherwise the 119 | rights granted under this Licence to other Licensees. 120 | 121 | 2.4 This Licence is not intended to restrict fair use, fair dealing, 122 | or any other similar right. 123 | 124 | 125 | 3 Copying, Modifying and Conveying Covered Source 126 | 127 | 3.1 You may copy and Convey verbatim copies of Covered Source, in 128 | any medium, provided You retain all Notices. 129 | 130 | 3.2 You may modify Covered Source, other than Notices, provided that 131 | You irrevocably undertake to make that modified Covered Source 132 | available from a Source Location should You Convey a Product in 133 | circumstances where the recipient does not otherwise receive a 134 | copy of the modified Covered Source. In each case subsection 3.3 135 | shall apply. 136 | 137 | You may only delete Notices if they are no longer applicable to 138 | the corresponding Covered Source as modified by You and You may 139 | add additional Notices applicable to Your modifications. 140 | Including Covered Source in a larger work is modifying the 141 | Covered Source, and the larger work becomes modified Covered 142 | Source. 143 | 144 | 3.3 You may Convey modified Covered Source (with the effect that You 145 | shall also become a Licensor) provided that You: 146 | 147 | a) retain Notices as required in subsection 3.2; 148 | 149 | b) add a Notice to the modified Covered Source stating that You 150 | have modified it, with the date and brief description of how 151 | You have modified it; 152 | 153 | c) add a Source Location Notice for the modified Covered Source 154 | if You Convey in circumstances where the recipient does not 155 | otherwise receive a copy of the modified Covered Source; and 156 | 157 | d) license the modified Covered Source under the terms and 158 | conditions of this Licence (or, as set out in subsection 159 | 8.3, a later version, if permitted by the licence of the 160 | original Covered Source). Such modified Covered Source must 161 | be licensed as a whole, but excluding Available Components 162 | contained in it, which remain licensed under their own 163 | applicable licences. 164 | 165 | 166 | 4 Making and Conveying Products 167 | 168 | You may Make Products, and/or Convey them, provided that You either 169 | provide each recipient with a copy of the Complete Source or ensure 170 | that each recipient is notified of the Source Location of the Complete 171 | Source. That Complete Source is Covered Source, and You must 172 | accordingly satisfy Your obligations set out in subsection 3.3. If 173 | specified in a Notice, the Product must visibly and securely display 174 | the Source Location on it or its packaging or documentation in the 175 | manner specified in that Notice. 176 | 177 | 178 | 5 Research and Development 179 | 180 | You may Convey Covered Source, modified Covered Source or Products to 181 | a legal entity carrying out development, testing or quality assurance 182 | work on Your behalf provided that the work is performed on terms which 183 | prevent the entity from both using the Source or Products for its own 184 | internal purposes and Conveying the Source or Products or any 185 | modifications to them to any person other than You. Any modifications 186 | made by the entity shall be deemed to be made by You pursuant to 187 | subsection 3.2. 188 | 189 | 190 | 6 DISCLAIMER AND LIABILITY 191 | 192 | 6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products 193 | are provided 'as is' and any express or implied warranties, 194 | including, but not limited to, implied warranties of 195 | merchantability, of satisfactory quality, non-infringement of 196 | third party rights, and fitness for a particular purpose or use 197 | are disclaimed in respect of any Source or Product to the 198 | maximum extent permitted by law. The Licensor makes no 199 | representation that any Source or Product does not or will not 200 | infringe any patent, copyright, trade secret or other 201 | proprietary right. The entire risk as to the use, quality, and 202 | performance of any Source or Product shall be with You and not 203 | the Licensor. This disclaimer of warranty is an essential part 204 | of this Licence and a condition for the grant of any rights 205 | granted under this Licence. 206 | 207 | 6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to 208 | the maximum extent permitted by law, have no liability for 209 | direct, indirect, special, incidental, consequential, exemplary, 210 | punitive or other damages of any character including, without 211 | limitation, procurement of substitute goods or services, loss of 212 | use, data or profits, or business interruption, however caused 213 | and on any theory of contract, warranty, tort (including 214 | negligence), product liability or otherwise, arising in any way 215 | in relation to the Covered Source, modified Covered Source 216 | and/or the Making or Conveyance of a Product, even if advised of 217 | the possibility of such damages, and You shall hold the 218 | Licensor(s) free and harmless from any liability, costs, 219 | damages, fees and expenses, including claims by third parties, 220 | in relation to such use. 221 | 222 | 223 | 7 Patents 224 | 225 | 7.1 Subject to the terms and conditions of this Licence, each 226 | Licensor hereby grants to You a perpetual, worldwide, 227 | non-exclusive, no-charge, royalty-free, irrevocable (except as 228 | stated in subsections 7.2 and 8.4) patent licence to Make, have 229 | Made, use, offer to sell, sell, import, and otherwise transfer 230 | the Covered Source and Products, where such licence applies only 231 | to those patent claims licensable by such Licensor that are 232 | necessarily infringed by exercising rights under the Covered 233 | Source as Conveyed by that Licensor. 234 | 235 | 7.2 If You institute patent litigation against any entity (including 236 | a cross-claim or counterclaim in a lawsuit) alleging that the 237 | Covered Source or a Product constitutes direct or contributory 238 | patent infringement, or You seek any declaration that a patent 239 | licensed to You under this Licence is invalid or unenforceable 240 | then any rights granted to You under this Licence shall 241 | terminate as of the date such process is initiated. 242 | 243 | 244 | 8 General 245 | 246 | 8.1 If any provisions of this Licence are or subsequently become 247 | invalid or unenforceable for any reason, the remaining 248 | provisions shall remain effective. 249 | 250 | 8.2 You shall not use any of the name (including acronyms and 251 | abbreviations), image, or logo by which the Licensor or CERN is 252 | known, except where needed to comply with section 3, or where 253 | the use is otherwise allowed by law. Any such permitted use 254 | shall be factual and shall not be made so as to suggest any kind 255 | of endorsement or implication of involvement by the Licensor or 256 | its personnel. 257 | 258 | 8.3 CERN may publish updated versions and variants of this Licence 259 | which it considers to be in the spirit of this version, but may 260 | differ in detail to address new problems or concerns. New 261 | versions will be published with a unique version number and a 262 | variant identifier specifying the variant. If the Licensor has 263 | specified that a given variant applies to the Covered Source 264 | without specifying a version, You may treat that Covered Source 265 | as being released under any version of the CERN-OHL with that 266 | variant. If no variant is specified, the Covered Source shall be 267 | treated as being released under CERN-OHL-S. The Licensor may 268 | also specify that the Covered Source is subject to a specific 269 | version of the CERN-OHL or any later version in which case You 270 | may apply this or any later version of CERN-OHL with the same 271 | variant identifier published by CERN. 272 | 273 | 8.4 This Licence shall terminate with immediate effect if You fail 274 | to comply with any of its terms and conditions. 275 | 276 | 8.5 However, if You cease all breaches of this Licence, then Your 277 | Licence from any Licensor is reinstated unless such Licensor has 278 | terminated this Licence by giving You, while You remain in 279 | breach, a notice specifying the breach and requiring You to cure 280 | it within 30 days, and You have failed to come into compliance 281 | in all material respects by the end of the 30 day period. Should 282 | You repeat the breach after receipt of a cure notice and 283 | subsequent reinstatement, this Licence will terminate 284 | immediately and permanently. Section 6 shall continue to apply 285 | after any termination. 286 | 287 | 8.6 This Licence shall not be enforceable except by a Licensor 288 | acting as such, and third party beneficiary rights are 289 | specifically excluded. 290 | -------------------------------------------------------------------------------- /rev2/LICENSE.txt: -------------------------------------------------------------------------------- 1 | CERN Open Hardware Licence Version 2 - Strongly Reciprocal 2 | 3 | 4 | Preamble 5 | 6 | CERN has developed this licence to promote collaboration among 7 | hardware designers and to provide a legal tool which supports the 8 | freedom to use, study, modify, share and distribute hardware designs 9 | and products based on those designs. Version 2 of the CERN Open 10 | Hardware Licence comes in three variants: CERN-OHL-P (permissive); and 11 | two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this 12 | licence, CERN-OHL-S (strongly reciprocal). 13 | 14 | The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in 15 | unmodified form only. 16 | 17 | Use of this Licence does not imply any endorsement by CERN of any 18 | Licensor or their designs nor does it imply any involvement by CERN in 19 | their development. 20 | 21 | 22 | 1 Definitions 23 | 24 | 1.1 'Licence' means this CERN-OHL-S. 25 | 26 | 1.2 'Compatible Licence' means 27 | 28 | a) any earlier version of the CERN Open Hardware licence, or 29 | 30 | b) any version of the CERN-OHL-S, or 31 | 32 | c) any licence which permits You to treat the Source to which 33 | it applies as licensed under CERN-OHL-S provided that on 34 | Conveyance of any such Source, or any associated Product You 35 | treat the Source in question as being licensed under 36 | CERN-OHL-S. 37 | 38 | 1.3 'Source' means information such as design materials or digital 39 | code which can be applied to Make or test a Product or to 40 | prepare a Product for use, Conveyance or sale, regardless of its 41 | medium or how it is expressed. It may include Notices. 42 | 43 | 1.4 'Covered Source' means Source that is explicitly made available 44 | under this Licence. 45 | 46 | 1.5 'Product' means any device, component, work or physical object, 47 | whether in finished or intermediate form, arising from the use, 48 | application or processing of Covered Source. 49 | 50 | 1.6 'Make' means to create or configure something, whether by 51 | manufacture, assembly, compiling, loading or applying Covered 52 | Source or another Product or otherwise. 53 | 54 | 1.7 'Available Component' means any part, sub-assembly, library or 55 | code which: 56 | 57 | a) is licensed to You as Complete Source under a Compatible 58 | Licence; or 59 | 60 | b) is available, at the time a Product or the Source containing 61 | it is first Conveyed, to You and any other prospective 62 | licensees 63 | 64 | i) as a physical part with sufficient rights and 65 | information (including any configuration and 66 | programming files and information about its 67 | characteristics and interfaces) to enable it either to 68 | be Made itself, or to be sourced and used to Make the 69 | Product; or 70 | ii) as part of the normal distribution of a tool used to 71 | design or Make the Product. 72 | 73 | 1.8 'Complete Source' means the set of all Source necessary to Make 74 | a Product, in the preferred form for making modifications, 75 | including necessary installation and interfacing information 76 | both for the Product, and for any included Available Components. 77 | If the format is proprietary, it must also be made available in 78 | a format (if the proprietary tool can create it) which is 79 | viewable with a tool available to potential licensees and 80 | licensed under a licence approved by the Free Software 81 | Foundation or the Open Source Initiative. Complete Source need 82 | not include the Source of any Available Component, provided that 83 | You include in the Complete Source sufficient information to 84 | enable a recipient to Make or source and use the Available 85 | Component to Make the Product. 86 | 87 | 1.9 'Source Location' means a location where a Licensor has placed 88 | Covered Source, and which that Licensor reasonably believes will 89 | remain easily accessible for at least three years for anyone to 90 | obtain a digital copy. 91 | 92 | 1.10 'Notice' means copyright, acknowledgement and trademark notices, 93 | Source Location references, modification notices (subsection 94 | 3.3(b)) and all notices that refer to this Licence and to the 95 | disclaimer of warranties that are included in the Covered 96 | Source. 97 | 98 | 1.11 'Licensee' or 'You' means any person exercising rights under 99 | this Licence. 100 | 101 | 1.12 'Licensor' means a natural or legal person who creates or 102 | modifies Covered Source. A person may be a Licensee and a 103 | Licensor at the same time. 104 | 105 | 1.13 'Convey' means to communicate to the public or distribute. 106 | 107 | 108 | 2 Applicability 109 | 110 | 2.1 This Licence governs the use, copying, modification, Conveying 111 | of Covered Source and Products, and the Making of Products. By 112 | exercising any right granted under this Licence, You irrevocably 113 | accept these terms and conditions. 114 | 115 | 2.2 This Licence is granted by the Licensor directly to You, and 116 | shall apply worldwide and without limitation in time. 117 | 118 | 2.3 You shall not attempt to restrict by contract or otherwise the 119 | rights granted under this Licence to other Licensees. 120 | 121 | 2.4 This Licence is not intended to restrict fair use, fair dealing, 122 | or any other similar right. 123 | 124 | 125 | 3 Copying, Modifying and Conveying Covered Source 126 | 127 | 3.1 You may copy and Convey verbatim copies of Covered Source, in 128 | any medium, provided You retain all Notices. 129 | 130 | 3.2 You may modify Covered Source, other than Notices, provided that 131 | You irrevocably undertake to make that modified Covered Source 132 | available from a Source Location should You Convey a Product in 133 | circumstances where the recipient does not otherwise receive a 134 | copy of the modified Covered Source. In each case subsection 3.3 135 | shall apply. 136 | 137 | You may only delete Notices if they are no longer applicable to 138 | the corresponding Covered Source as modified by You and You may 139 | add additional Notices applicable to Your modifications. 140 | Including Covered Source in a larger work is modifying the 141 | Covered Source, and the larger work becomes modified Covered 142 | Source. 143 | 144 | 3.3 You may Convey modified Covered Source (with the effect that You 145 | shall also become a Licensor) provided that You: 146 | 147 | a) retain Notices as required in subsection 3.2; 148 | 149 | b) add a Notice to the modified Covered Source stating that You 150 | have modified it, with the date and brief description of how 151 | You have modified it; 152 | 153 | c) add a Source Location Notice for the modified Covered Source 154 | if You Convey in circumstances where the recipient does not 155 | otherwise receive a copy of the modified Covered Source; and 156 | 157 | d) license the modified Covered Source under the terms and 158 | conditions of this Licence (or, as set out in subsection 159 | 8.3, a later version, if permitted by the licence of the 160 | original Covered Source). Such modified Covered Source must 161 | be licensed as a whole, but excluding Available Components 162 | contained in it, which remain licensed under their own 163 | applicable licences. 164 | 165 | 166 | 4 Making and Conveying Products 167 | 168 | You may Make Products, and/or Convey them, provided that You either 169 | provide each recipient with a copy of the Complete Source or ensure 170 | that each recipient is notified of the Source Location of the Complete 171 | Source. That Complete Source is Covered Source, and You must 172 | accordingly satisfy Your obligations set out in subsection 3.3. If 173 | specified in a Notice, the Product must visibly and securely display 174 | the Source Location on it or its packaging or documentation in the 175 | manner specified in that Notice. 176 | 177 | 178 | 5 Research and Development 179 | 180 | You may Convey Covered Source, modified Covered Source or Products to 181 | a legal entity carrying out development, testing or quality assurance 182 | work on Your behalf provided that the work is performed on terms which 183 | prevent the entity from both using the Source or Products for its own 184 | internal purposes and Conveying the Source or Products or any 185 | modifications to them to any person other than You. Any modifications 186 | made by the entity shall be deemed to be made by You pursuant to 187 | subsection 3.2. 188 | 189 | 190 | 6 DISCLAIMER AND LIABILITY 191 | 192 | 6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products 193 | are provided 'as is' and any express or implied warranties, 194 | including, but not limited to, implied warranties of 195 | merchantability, of satisfactory quality, non-infringement of 196 | third party rights, and fitness for a particular purpose or use 197 | are disclaimed in respect of any Source or Product to the 198 | maximum extent permitted by law. The Licensor makes no 199 | representation that any Source or Product does not or will not 200 | infringe any patent, copyright, trade secret or other 201 | proprietary right. The entire risk as to the use, quality, and 202 | performance of any Source or Product shall be with You and not 203 | the Licensor. This disclaimer of warranty is an essential part 204 | of this Licence and a condition for the grant of any rights 205 | granted under this Licence. 206 | 207 | 6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to 208 | the maximum extent permitted by law, have no liability for 209 | direct, indirect, special, incidental, consequential, exemplary, 210 | punitive or other damages of any character including, without 211 | limitation, procurement of substitute goods or services, loss of 212 | use, data or profits, or business interruption, however caused 213 | and on any theory of contract, warranty, tort (including 214 | negligence), product liability or otherwise, arising in any way 215 | in relation to the Covered Source, modified Covered Source 216 | and/or the Making or Conveyance of a Product, even if advised of 217 | the possibility of such damages, and You shall hold the 218 | Licensor(s) free and harmless from any liability, costs, 219 | damages, fees and expenses, including claims by third parties, 220 | in relation to such use. 221 | 222 | 223 | 7 Patents 224 | 225 | 7.1 Subject to the terms and conditions of this Licence, each 226 | Licensor hereby grants to You a perpetual, worldwide, 227 | non-exclusive, no-charge, royalty-free, irrevocable (except as 228 | stated in subsections 7.2 and 8.4) patent licence to Make, have 229 | Made, use, offer to sell, sell, import, and otherwise transfer 230 | the Covered Source and Products, where such licence applies only 231 | to those patent claims licensable by such Licensor that are 232 | necessarily infringed by exercising rights under the Covered 233 | Source as Conveyed by that Licensor. 234 | 235 | 7.2 If You institute patent litigation against any entity (including 236 | a cross-claim or counterclaim in a lawsuit) alleging that the 237 | Covered Source or a Product constitutes direct or contributory 238 | patent infringement, or You seek any declaration that a patent 239 | licensed to You under this Licence is invalid or unenforceable 240 | then any rights granted to You under this Licence shall 241 | terminate as of the date such process is initiated. 242 | 243 | 244 | 8 General 245 | 246 | 8.1 If any provisions of this Licence are or subsequently become 247 | invalid or unenforceable for any reason, the remaining 248 | provisions shall remain effective. 249 | 250 | 8.2 You shall not use any of the name (including acronyms and 251 | abbreviations), image, or logo by which the Licensor or CERN is 252 | known, except where needed to comply with section 3, or where 253 | the use is otherwise allowed by law. Any such permitted use 254 | shall be factual and shall not be made so as to suggest any kind 255 | of endorsement or implication of involvement by the Licensor or 256 | its personnel. 257 | 258 | 8.3 CERN may publish updated versions and variants of this Licence 259 | which it considers to be in the spirit of this version, but may 260 | differ in detail to address new problems or concerns. New 261 | versions will be published with a unique version number and a 262 | variant identifier specifying the variant. If the Licensor has 263 | specified that a given variant applies to the Covered Source 264 | without specifying a version, You may treat that Covered Source 265 | as being released under any version of the CERN-OHL with that 266 | variant. If no variant is specified, the Covered Source shall be 267 | treated as being released under CERN-OHL-S. The Licensor may 268 | also specify that the Covered Source is subject to a specific 269 | version of the CERN-OHL or any later version in which case You 270 | may apply this or any later version of CERN-OHL with the same 271 | variant identifier published by CERN. 272 | 273 | 8.4 This Licence shall terminate with immediate effect if You fail 274 | to comply with any of its terms and conditions. 275 | 276 | 8.5 However, if You cease all breaches of this Licence, then Your 277 | Licence from any Licensor is reinstated unless such Licensor has 278 | terminated this Licence by giving You, while You remain in 279 | breach, a notice specifying the breach and requiring You to cure 280 | it within 30 days, and You have failed to come into compliance 281 | in all material respects by the end of the 30 day period. Should 282 | You repeat the breach after receipt of a cure notice and 283 | subsequent reinstatement, this Licence will terminate 284 | immediately and permanently. Section 6 shall continue to apply 285 | after any termination. 286 | 287 | 8.6 This Licence shall not be enforceable except by a Licensor 288 | acting as such, and third party beneficiary rights are 289 | specifically excluded. 290 | -------------------------------------------------------------------------------- /firmware/LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | --------------------------------------------------------------------------------