Copy disabled (too large)
Download .txt
Showing preview only (11,214K chars total). Download the full file to get everything.
Repository: zsa/qmk_firmware
Branch: firmware25
Commit: f4a95d85c83c
Files: 2378
Total size: 9.8 MB
Directory structure:
gitextract_f7a0y425/
├── .clang-format
├── .clangd
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── feature_request.yml
│ │ ├── other_issues.yml
│ │ └── zzz_blank.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ ├── labeler.yml
│ └── workflows/
│ ├── build.yml
│ ├── format.yml
│ ├── lint.yml
│ ├── regen.yml
│ └── unit_test.yml
├── .gitignore
├── .gitmodules
├── Doxyfile
├── LICENSE
├── Makefile
├── builddefs/
│ ├── build_full_test.mk
│ ├── build_json.mk
│ ├── build_keyboard.mk
│ ├── build_layout.mk
│ ├── build_test.mk
│ ├── common_features.mk
│ ├── common_rules.mk
│ ├── converters.mk
│ ├── disable_features.mk
│ ├── docsgen/
│ │ ├── .gitignore
│ │ ├── .vitepress/
│ │ │ ├── config.mts
│ │ │ └── theme/
│ │ │ ├── QMKLayout.vue
│ │ │ ├── custom.css
│ │ │ └── index.ts
│ │ ├── build-docs.sh
│ │ ├── package.json
│ │ └── start-docs.sh
│ ├── generic_features.mk
│ ├── message.mk
│ ├── show_options.mk
│ ├── support.mk
│ └── testlist.mk
├── data/
│ ├── constants/
│ │ ├── keycodes/
│ │ │ ├── extras/
│ │ │ │ ├── keycodes_belgian_0.0.1.hjson
│ │ │ │ ├── keycodes_bepo_0.0.1.hjson
│ │ │ │ ├── keycodes_brazilian_abnt2_0.0.1.hjson
│ │ │ │ ├── keycodes_canadian_french_0.0.1.hjson
│ │ │ │ ├── keycodes_canadian_multilingual_0.0.1.hjson
│ │ │ │ ├── keycodes_colemak_0.0.1.hjson
│ │ │ │ ├── keycodes_croatian_0.0.1.hjson
│ │ │ │ ├── keycodes_czech_0.0.1.hjson
│ │ │ │ ├── keycodes_czech_mac_ansi_0.0.1.hjson
│ │ │ │ ├── keycodes_czech_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_danish_0.0.1.hjson
│ │ │ │ ├── keycodes_dvorak_0.0.1.hjson
│ │ │ │ ├── keycodes_dvorak_fr_0.0.1.hjson
│ │ │ │ ├── keycodes_dvorak_programmer_0.0.1.hjson
│ │ │ │ ├── keycodes_estonian_0.0.1.hjson
│ │ │ │ ├── keycodes_eurkey_0.0.1.hjson
│ │ │ │ ├── keycodes_farsi_0.0.1.hjson
│ │ │ │ ├── keycodes_finnish_0.0.1.hjson
│ │ │ │ ├── keycodes_french_0.0.1.hjson
│ │ │ │ ├── keycodes_french_afnor_0.0.1.hjson
│ │ │ │ ├── keycodes_french_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_german_0.0.1.hjson
│ │ │ │ ├── keycodes_german_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_greek_0.0.1.hjson
│ │ │ │ ├── keycodes_hebrew_0.0.1.hjson
│ │ │ │ ├── keycodes_hungarian_0.0.1.hjson
│ │ │ │ ├── keycodes_icelandic_0.0.1.hjson
│ │ │ │ ├── keycodes_irish_0.0.1.hjson
│ │ │ │ ├── keycodes_italian_0.0.1.hjson
│ │ │ │ ├── keycodes_italian_mac_ansi_0.0.1.hjson
│ │ │ │ ├── keycodes_italian_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_japanese_0.0.1.hjson
│ │ │ │ ├── keycodes_korean_0.0.1.hjson
│ │ │ │ ├── keycodes_latvian_0.0.1.hjson
│ │ │ │ ├── keycodes_lithuanian_azerty_0.0.1.hjson
│ │ │ │ ├── keycodes_lithuanian_qwerty_0.0.1.hjson
│ │ │ │ ├── keycodes_neo2_0.0.1.hjson
│ │ │ │ ├── keycodes_nordic_0.0.1.hjson
│ │ │ │ ├── keycodes_norman_0.0.1.hjson
│ │ │ │ ├── keycodes_norwegian_0.0.1.hjson
│ │ │ │ ├── keycodes_plover_0.0.1.hjson
│ │ │ │ ├── keycodes_plover_dvorak_0.0.1.hjson
│ │ │ │ ├── keycodes_polish_0.0.1.hjson
│ │ │ │ ├── keycodes_portuguese_0.0.1.hjson
│ │ │ │ ├── keycodes_portuguese_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_romanian_0.0.1.hjson
│ │ │ │ ├── keycodes_russian_0.0.1.hjson
│ │ │ │ ├── keycodes_russian_typewriter_0.0.1.hjson
│ │ │ │ ├── keycodes_serbian_0.0.1.hjson
│ │ │ │ ├── keycodes_serbian_latin_0.0.1.hjson
│ │ │ │ ├── keycodes_slovak_0.0.1.hjson
│ │ │ │ ├── keycodes_slovenian_0.0.1.hjson
│ │ │ │ ├── keycodes_spanish_0.0.1.hjson
│ │ │ │ ├── keycodes_spanish_dvorak_0.0.1.hjson
│ │ │ │ ├── keycodes_spanish_latin_america_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_mac_ansi_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_pro_mac_ansi_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_pro_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_swiss_de_0.0.1.hjson
│ │ │ │ ├── keycodes_swiss_fr_0.0.1.hjson
│ │ │ │ ├── keycodes_turkish_f_0.0.1.hjson
│ │ │ │ ├── keycodes_turkish_q_0.0.1.hjson
│ │ │ │ ├── keycodes_uk_0.0.1.hjson
│ │ │ │ ├── keycodes_ukrainian_0.0.1.hjson
│ │ │ │ ├── keycodes_us_0.0.1.hjson
│ │ │ │ ├── keycodes_us_extended_0.0.1.hjson
│ │ │ │ ├── keycodes_us_international_0.0.1.hjson
│ │ │ │ ├── keycodes_us_international_linux_0.0.1.hjson
│ │ │ │ ├── keycodes_workman_0.0.1.hjson
│ │ │ │ └── keycodes_workman_zxcvm_0.0.1.hjson
│ │ │ ├── keycodes_0.0.1.hjson
│ │ │ ├── keycodes_0.0.1_audio.hjson
│ │ │ ├── keycodes_0.0.1_basic.hjson
│ │ │ ├── keycodes_0.0.1_joystick.hjson
│ │ │ ├── keycodes_0.0.1_lighting.hjson
│ │ │ ├── keycodes_0.0.1_macro.hjson
│ │ │ ├── keycodes_0.0.1_magic.hjson
│ │ │ ├── keycodes_0.0.1_midi.hjson
│ │ │ ├── keycodes_0.0.1_programmable_button.hjson
│ │ │ ├── keycodes_0.0.1_quantum.hjson
│ │ │ ├── keycodes_0.0.1_sequencer.hjson
│ │ │ ├── keycodes_0.0.1_steno.hjson
│ │ │ ├── keycodes_0.0.1_swap_hands.hjson
│ │ │ ├── keycodes_0.0.2.hjson
│ │ │ ├── keycodes_0.0.2_basic.hjson
│ │ │ ├── keycodes_0.0.2_kb.hjson
│ │ │ ├── keycodes_0.0.2_magic.hjson
│ │ │ ├── keycodes_0.0.2_midi.hjson
│ │ │ ├── keycodes_0.0.2_quantum.hjson
│ │ │ ├── keycodes_0.0.2_sequencer.hjson
│ │ │ ├── keycodes_0.0.2_swap_hands.hjson
│ │ │ ├── keycodes_0.0.2_user.hjson
│ │ │ ├── keycodes_0.0.3.hjson
│ │ │ ├── keycodes_0.0.3_quantum.hjson
│ │ │ ├── keycodes_0.0.4.hjson
│ │ │ ├── keycodes_0.0.4_lighting.hjson
│ │ │ ├── keycodes_0.0.4_quantum.hjson
│ │ │ ├── keycodes_0.0.5.hjson
│ │ │ ├── keycodes_0.0.5_basic.hjson
│ │ │ ├── keycodes_0.0.6.hjson
│ │ │ ├── keycodes_0.0.6_connection.hjson
│ │ │ ├── keycodes_0.0.6_quantum.hjson
│ │ │ └── keycodes_0.0.7.hjson
│ │ └── module_hooks/
│ │ ├── 0.1.0.hjson
│ │ ├── 1.0.0.hjson
│ │ ├── 1.1.0.hjson
│ │ └── 1.1.1.hjson
│ ├── mappings/
│ │ ├── defaults.hjson
│ │ ├── info_config.hjson
│ │ ├── info_defaults.hjson
│ │ ├── info_rules.hjson
│ │ └── keyboard_aliases.hjson
│ ├── schemas/
│ │ ├── api_keyboard.jsonschema
│ │ ├── community_module.jsonschema
│ │ ├── definitions.jsonschema
│ │ ├── keyboard.jsonschema
│ │ ├── keycodes.jsonschema
│ │ ├── keymap.jsonschema
│ │ ├── user_repo_v0.jsonschema
│ │ ├── user_repo_v1.jsonschema
│ │ └── user_repo_v1_1.jsonschema
│ └── templates/
│ ├── api/
│ │ └── readme.md
│ ├── config-overrides/
│ │ ├── chibios/
│ │ │ ├── board.h
│ │ │ ├── chconf.h
│ │ │ ├── halconf.h
│ │ │ └── mcuconf.h
│ │ └── common/
│ │ └── lv_conf.h
│ └── keyboard/
│ ├── keyboard.json
│ └── readme.md
├── doxygen-todo
├── drivers/
│ ├── backlight/
│ │ └── backlight_software.c
│ ├── battery/
│ │ ├── battery.c
│ │ ├── battery.h
│ │ ├── battery_adc.c
│ │ └── battery_driver.h
│ ├── bluetooth/
│ │ ├── bluefruit_le.cpp
│ │ ├── bluefruit_le.h
│ │ ├── bluetooth.c
│ │ ├── bluetooth.h
│ │ ├── bluetooth_drivers.c
│ │ ├── outputselect.h
│ │ ├── ringbuffer.hpp
│ │ ├── rn42.c
│ │ └── rn42.h
│ ├── eeprom/
│ │ ├── eeprom_custom.c-template
│ │ ├── eeprom_driver.c
│ │ ├── eeprom_driver.h
│ │ ├── eeprom_i2c.c
│ │ ├── eeprom_i2c.h
│ │ ├── eeprom_spi.c
│ │ ├── eeprom_spi.h
│ │ ├── eeprom_transient.c
│ │ ├── eeprom_transient.h
│ │ └── eeprom_wear_leveling.c
│ ├── encoder/
│ │ └── encoder_quadrature.c
│ ├── flash/
│ │ ├── flash.h
│ │ ├── flash_spi.c
│ │ └── flash_spi.h
│ ├── gpio/
│ │ ├── mcp23018.c
│ │ ├── mcp23018.h
│ │ ├── pca9505.c
│ │ ├── pca9505.h
│ │ ├── pca9555.c
│ │ ├── pca9555.h
│ │ ├── sn74x138.c
│ │ ├── sn74x138.h
│ │ ├── sn74x154.c
│ │ └── sn74x154.h
│ ├── haptic/
│ │ ├── drv2605l.c
│ │ ├── drv2605l.h
│ │ ├── solenoid.c
│ │ └── solenoid.h
│ ├── i2c_master.h
│ ├── lcd/
│ │ ├── hd44780.c
│ │ ├── hd44780.h
│ │ ├── st7565.c
│ │ └── st7565.h
│ ├── led/
│ │ ├── apa102.c
│ │ ├── apa102.h
│ │ ├── aw20216s.c
│ │ ├── aw20216s.h
│ │ ├── issi/
│ │ │ ├── is31fl3218-mono.c
│ │ │ ├── is31fl3218-mono.h
│ │ │ ├── is31fl3218.c
│ │ │ ├── is31fl3218.h
│ │ │ ├── is31fl3236-mono.c
│ │ │ ├── is31fl3236-mono.h
│ │ │ ├── is31fl3236.c
│ │ │ ├── is31fl3236.h
│ │ │ ├── is31fl3729-mono.c
│ │ │ ├── is31fl3729-mono.h
│ │ │ ├── is31fl3729.c
│ │ │ ├── is31fl3729.h
│ │ │ ├── is31fl3731-mono.c
│ │ │ ├── is31fl3731-mono.h
│ │ │ ├── is31fl3731.c
│ │ │ ├── is31fl3731.h
│ │ │ ├── is31fl3733-mono.c
│ │ │ ├── is31fl3733-mono.h
│ │ │ ├── is31fl3733.c
│ │ │ ├── is31fl3733.h
│ │ │ ├── is31fl3736-mono.c
│ │ │ ├── is31fl3736-mono.h
│ │ │ ├── is31fl3736.c
│ │ │ ├── is31fl3736.h
│ │ │ ├── is31fl3737-mono.c
│ │ │ ├── is31fl3737-mono.h
│ │ │ ├── is31fl3737.c
│ │ │ ├── is31fl3737.h
│ │ │ ├── is31fl3741-mono.c
│ │ │ ├── is31fl3741-mono.h
│ │ │ ├── is31fl3741.c
│ │ │ ├── is31fl3741.h
│ │ │ ├── is31fl3742a-mono.c
│ │ │ ├── is31fl3742a-mono.h
│ │ │ ├── is31fl3742a.c
│ │ │ ├── is31fl3742a.h
│ │ │ ├── is31fl3743a-mono.c
│ │ │ ├── is31fl3743a-mono.h
│ │ │ ├── is31fl3743a.c
│ │ │ ├── is31fl3743a.h
│ │ │ ├── is31fl3745-mono.c
│ │ │ ├── is31fl3745-mono.h
│ │ │ ├── is31fl3745.c
│ │ │ ├── is31fl3745.h
│ │ │ ├── is31fl3746a-mono.c
│ │ │ ├── is31fl3746a-mono.h
│ │ │ ├── is31fl3746a.c
│ │ │ └── is31fl3746a.h
│ │ ├── snled27351-mono.c
│ │ ├── snled27351-mono.h
│ │ ├── snled27351.c
│ │ ├── snled27351.h
│ │ ├── ws2812.c
│ │ └── ws2812.h
│ ├── oled/
│ │ ├── glcdfont.c
│ │ ├── licenses.txt
│ │ ├── oled_driver.c
│ │ └── oled_driver.h
│ ├── painter/
│ │ ├── comms/
│ │ │ ├── qp_comms_dummy.c
│ │ │ ├── qp_comms_dummy.h
│ │ │ ├── qp_comms_i2c.c
│ │ │ ├── qp_comms_i2c.h
│ │ │ ├── qp_comms_spi.c
│ │ │ └── qp_comms_spi.h
│ │ ├── gc9xxx/
│ │ │ ├── qp_gc9107.c
│ │ │ ├── qp_gc9107.h
│ │ │ ├── qp_gc9107_opcodes.h
│ │ │ ├── qp_gc9a01.c
│ │ │ ├── qp_gc9a01.h
│ │ │ ├── qp_gc9a01_opcodes.h
│ │ │ └── qp_gc9xxx_opcodes.h
│ │ ├── generic/
│ │ │ ├── qp_surface.h
│ │ │ ├── qp_surface_common.c
│ │ │ ├── qp_surface_internal.h
│ │ │ ├── qp_surface_mono1bpp.c
│ │ │ └── qp_surface_rgb565.c
│ │ ├── ili9xxx/
│ │ │ ├── qp_ili9163.c
│ │ │ ├── qp_ili9163.h
│ │ │ ├── qp_ili9341.c
│ │ │ ├── qp_ili9341.h
│ │ │ ├── qp_ili9486.c
│ │ │ ├── qp_ili9486.h
│ │ │ ├── qp_ili9488.c
│ │ │ ├── qp_ili9488.h
│ │ │ └── qp_ili9xxx_opcodes.h
│ │ ├── ld7032/
│ │ │ ├── qp_ld7032.c
│ │ │ ├── qp_ld7032.h
│ │ │ └── qp_ld7032_opcodes.h
│ │ ├── oled_panel/
│ │ │ ├── qp_oled_panel.c
│ │ │ └── qp_oled_panel.h
│ │ ├── sh1106/
│ │ │ ├── qp_sh1106.c
│ │ │ ├── qp_sh1106.h
│ │ │ └── qp_sh1106_opcodes.h
│ │ ├── sh1107/
│ │ │ ├── qp_sh1107.c
│ │ │ ├── qp_sh1107.h
│ │ │ └── qp_sh1107_opcodes.h
│ │ ├── ssd1351/
│ │ │ ├── qp_ssd1351.c
│ │ │ ├── qp_ssd1351.h
│ │ │ └── qp_ssd1351_opcodes.h
│ │ ├── st77xx/
│ │ │ ├── qp_st7735.c
│ │ │ ├── qp_st7735.h
│ │ │ ├── qp_st7735_opcodes.h
│ │ │ ├── qp_st7789.c
│ │ │ ├── qp_st7789.h
│ │ │ ├── qp_st7789_opcodes.h
│ │ │ └── qp_st77xx_opcodes.h
│ │ └── tft_panel/
│ │ ├── qp_tft_panel.c
│ │ └── qp_tft_panel.h
│ ├── ps2/
│ │ ├── ps2.h
│ │ ├── ps2_busywait.c
│ │ ├── ps2_interrupt.c
│ │ ├── ps2_io.h
│ │ ├── ps2_mouse.c
│ │ └── ps2_mouse.h
│ ├── sensors/
│ │ ├── adns5050.c
│ │ ├── adns5050.h
│ │ ├── adns9800.c
│ │ ├── adns9800.h
│ │ ├── analog_joystick.c
│ │ ├── analog_joystick.h
│ │ ├── azoteq_iqs5xx.c
│ │ ├── azoteq_iqs5xx.h
│ │ ├── cirque_pinnacle.c
│ │ ├── cirque_pinnacle.h
│ │ ├── cirque_pinnacle_gestures.c
│ │ ├── cirque_pinnacle_gestures.h
│ │ ├── cirque_pinnacle_i2c.c
│ │ ├── cirque_pinnacle_regdefs.h
│ │ ├── cirque_pinnacle_spi.c
│ │ ├── navigator.c
│ │ ├── navigator.h
│ │ ├── navigator_trackpad.c
│ │ ├── navigator_trackpad.h
│ │ ├── paw3204.c
│ │ ├── paw3204.h
│ │ ├── pimoroni_trackball.c
│ │ ├── pimoroni_trackball.h
│ │ ├── pmw3320.c
│ │ ├── pmw3320.h
│ │ ├── pmw3360.c
│ │ ├── pmw3360.h
│ │ ├── pmw3389.c
│ │ ├── pmw3389.h
│ │ ├── pmw33xx_common.c
│ │ └── pmw33xx_common.h
│ ├── serial.h
│ ├── spi_master.h
│ ├── uart.h
│ ├── usb2422.c
│ ├── usb2422.h
│ ├── usbpd.h
│ └── wear_leveling/
│ ├── wear_leveling_flash_spi.c
│ └── wear_leveling_flash_spi_config.h
├── layouts/
│ └── default/
│ ├── 60_abnt2/
│ │ ├── default_60_abnt2/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi/
│ │ ├── default_60_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_arrow/
│ │ ├── default_60_ansi_arrow/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_arrow_split_bs/
│ │ ├── default_60_ansi_arrow_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_split_bs_rshift/
│ │ ├── default_60_ansi_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_tsangan/
│ │ ├── default_60_ansi_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_tsangan_split_bs_rshift/
│ │ ├── default_60_ansi_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_wkl/
│ │ ├── default_60_ansi_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_wkl_split_bs_rshift/
│ │ ├── default_60_ansi_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_hhkb/
│ │ ├── default_60_hhkb/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso/
│ │ ├── default_60_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_arrow/
│ │ ├── default_60_iso_arrow/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_arrow_split_bs/
│ │ ├── default_60_iso_arrow_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_split_bs_rshift/
│ │ ├── default_60_iso_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_tsangan/
│ │ ├── default_60_iso_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_tsangan_split_bs_rshift/
│ │ ├── default_60_iso_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_wkl/
│ │ ├── default_60_iso_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_wkl_split_bs_rshift/
│ │ ├── default_60_iso_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_jis/
│ │ ├── default_60_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 64_ansi/
│ │ ├── default_64_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 64_iso/
│ │ ├── default_64_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi/
│ │ ├── default_65_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_blocker/
│ │ ├── default_65_ansi_blocker/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_blocker_split_bs/
│ │ ├── default_65_ansi_blocker_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_blocker_tsangan/
│ │ ├── default_65_ansi_blocker_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_blocker_tsangan_split_bs/
│ │ ├── default_65_ansi_blocker_tsangan_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_split_bs/
│ │ ├── default_65_ansi_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso/
│ │ ├── default_65_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_blocker/
│ │ ├── default_65_iso_blocker/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_blocker_split_bs/
│ │ ├── default_65_iso_blocker_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_blocker_tsangan/
│ │ ├── default_65_iso_blocker_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_blocker_tsangan_split_bs/
│ │ ├── default_65_iso_blocker_tsangan_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_split_bs/
│ │ ├── default_65_iso_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 66_ansi/
│ │ ├── default_66_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 66_iso/
│ │ ├── default_66_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 68_ansi/
│ │ ├── default_68_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 68_iso/
│ │ ├── default_68_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 75_ansi/
│ │ ├── default_75_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 75_iso/
│ │ ├── default_75_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 96_ansi/
│ │ ├── default_96_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 96_iso/
│ │ ├── default_96_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── alice/
│ │ ├── default_alice/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── alice_split_bs/
│ │ ├── default_alice_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ergodox/
│ │ ├── default_ergodox/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_ansi/
│ │ ├── default_fullsize_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_extended_ansi/
│ │ ├── default_fullsize_extended_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_extended_iso/
│ │ ├── default_fullsize_extended_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_extended_jis/
│ │ ├── default_fullsize_extended_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_iso/
│ │ ├── default_fullsize_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_jis/
│ │ ├── default_fullsize_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_4x4/
│ │ ├── default_numpad_4x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_5x4/
│ │ ├── default_numpad_5x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_5x6/
│ │ ├── default_numpad_5x6/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_6x4/
│ │ ├── default_numpad_6x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_6x5/
│ │ ├── default_numpad_6x5/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_1x1/
│ │ ├── default_ortho_1x1/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_2x3/
│ │ ├── default_ortho_2x3/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_2x6/
│ │ ├── default_ortho_2x6/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_3x10/
│ │ ├── default_ortho_3x10/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_3x3/
│ │ ├── default_ortho_3x3/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x10/
│ │ ├── default_ortho_4x10/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x12/
│ │ ├── default_ortho_4x12/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x16/
│ │ ├── default_ortho_4x16/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x4/
│ │ ├── default_ortho_4x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x6/
│ │ ├── default_ortho_4x6/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x10/
│ │ ├── default_ortho_5x10/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x12/
│ │ ├── default_ortho_5x12/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x13/
│ │ ├── default_ortho_5x13/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x14/
│ │ ├── default_ortho_5x14/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x15/
│ │ ├── default_ortho_5x15/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x4/
│ │ ├── default_ortho_5x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x5/
│ │ ├── default_ortho_5x5/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_6x13/
│ │ ├── default_ortho_6x13/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_6x4/
│ │ ├── default_ortho_6x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── planck_mit/
│ │ ├── default_planck_mit/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── readme.md
│ ├── split_3x5_2/
│ │ ├── default_split_3x5_2/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── split_3x5_3/
│ │ ├── default_split_3x5_3/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── split_3x6_3/
│ │ ├── default_split_3x6_3/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi/
│ │ ├── default_tkl_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_split_bs_rshift/
│ │ ├── default_tkl_ansi_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_tsangan/
│ │ ├── default_tkl_ansi_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_tsangan_split_bs_rshift/
│ │ ├── default_tkl_ansi_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_wkl/
│ │ ├── default_tkl_ansi_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_wkl_split_bs_rshift/
│ │ ├── default_tkl_ansi_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi/
│ │ ├── default_tkl_f13_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_split_bs_rshift/
│ │ ├── default_tkl_f13_ansi_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_tsangan/
│ │ ├── default_tkl_f13_ansi_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_tsangan_split_bs_rshift/
│ │ ├── default_tkl_f13_ansi_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_wkl/
│ │ ├── default_tkl_f13_ansi_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_wkl_split_bs_rshift/
│ │ ├── default_tkl_f13_ansi_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso/
│ │ ├── default_tkl_f13_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_split_bs_rshift/
│ │ ├── default_tkl_f13_iso_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_tsangan/
│ │ ├── default_tkl_f13_iso_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_tsangan_split_bs_rshift/
│ │ ├── default_tkl_f13_iso_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_wkl/
│ │ ├── default_tkl_f13_iso_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_wkl_split_bs_rshift/
│ │ ├── default_tkl_f13_iso_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_jis/
│ │ ├── default_tkl_f13_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso/
│ │ ├── default_tkl_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_split_bs_rshift/
│ │ ├── default_tkl_iso_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_tsangan/
│ │ ├── default_tkl_iso_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_tsangan_split_bs_rshift/
│ │ ├── default_tkl_iso_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_wkl/
│ │ ├── default_tkl_iso_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_wkl_split_bs_rshift/
│ │ ├── default_tkl_iso_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_jis/
│ │ ├── default_tkl_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_nofrow_ansi/
│ │ ├── default_tkl_nofrow_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ └── tkl_nofrow_iso/
│ ├── default_tkl_nofrow_iso/
│ │ └── keymap.c
│ ├── info.json
│ ├── layout.json
│ └── readme.md
├── lib/
│ ├── fnv/
│ │ ├── Makefile
│ │ ├── README
│ │ ├── fnv.h
│ │ ├── fnv32.c
│ │ ├── fnv64.c
│ │ ├── hash_32.c
│ │ ├── hash_32a.c
│ │ ├── hash_64.c
│ │ ├── hash_64a.c
│ │ ├── have_ulong64.c
│ │ ├── longlong.h
│ │ ├── qmk_fnv_type_validation.c
│ │ └── test_fnv.c
│ ├── lib8tion/
│ │ ├── LICENSE
│ │ ├── lib8tion.c
│ │ ├── lib8tion.h
│ │ ├── math8.h
│ │ ├── random8.h
│ │ ├── scale8.h
│ │ └── trig8.h
│ ├── python/
│ │ ├── kle2xy.py
│ │ └── qmk/
│ │ ├── __init__.py
│ │ ├── build_targets.py
│ │ ├── c_parse.py
│ │ ├── cli/
│ │ │ ├── __init__.py
│ │ │ ├── bux.py
│ │ │ ├── c2json.py
│ │ │ ├── cd.py
│ │ │ ├── chibios/
│ │ │ │ ├── __init__.py
│ │ │ │ └── confmigrate.py
│ │ │ ├── ci/
│ │ │ │ ├── __init__.py
│ │ │ │ └── validate_aliases.py
│ │ │ ├── clean.py
│ │ │ ├── compile.py
│ │ │ ├── docs.py
│ │ │ ├── doctor/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── check.py
│ │ │ │ ├── linux.py
│ │ │ │ ├── macos.py
│ │ │ │ ├── main.py
│ │ │ │ └── windows.py
│ │ │ ├── find.py
│ │ │ ├── flash.py
│ │ │ ├── format/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── c.py
│ │ │ │ ├── json.py
│ │ │ │ ├── python.py
│ │ │ │ └── text.py
│ │ │ ├── generate/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── api.py
│ │ │ │ ├── autocorrect_data.py
│ │ │ │ ├── community_modules.py
│ │ │ │ ├── compilation_database.py
│ │ │ │ ├── config_h.py
│ │ │ │ ├── develop_pr_list.py
│ │ │ │ ├── dfu_header.py
│ │ │ │ ├── docs.py
│ │ │ │ ├── info_json.py
│ │ │ │ ├── keyboard_c.py
│ │ │ │ ├── keyboard_h.py
│ │ │ │ ├── keycodes.py
│ │ │ │ ├── keymap_h.py
│ │ │ │ ├── make_dependencies.py
│ │ │ │ ├── rgb_breathe_table.py
│ │ │ │ ├── rules_mk.py
│ │ │ │ └── version_h.py
│ │ │ ├── git/
│ │ │ │ ├── __init__.py
│ │ │ │ └── submodule.py
│ │ │ ├── hello.py
│ │ │ ├── import/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── kbfirmware.py
│ │ │ │ ├── keyboard.py
│ │ │ │ └── keymap.py
│ │ │ ├── info.py
│ │ │ ├── json2c.py
│ │ │ ├── kle2json.py
│ │ │ ├── license_check.py
│ │ │ ├── lint.py
│ │ │ ├── list/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── keyboards.py
│ │ │ │ ├── keymaps.py
│ │ │ │ └── layouts.py
│ │ │ ├── mass_compile.py
│ │ │ ├── migrate.py
│ │ │ ├── new/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── keyboard.py
│ │ │ │ └── keymap.py
│ │ │ ├── painter/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── convert_graphics.py
│ │ │ │ └── make_font.py
│ │ │ ├── pytest.py
│ │ │ ├── resolve_alias.py
│ │ │ ├── test/
│ │ │ │ ├── __init__.py
│ │ │ │ └── c.py
│ │ │ ├── userspace/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── add.py
│ │ │ │ ├── compile.py
│ │ │ │ ├── doctor.py
│ │ │ │ ├── list.py
│ │ │ │ ├── path.py
│ │ │ │ └── remove.py
│ │ │ └── via2json.py
│ │ ├── commands.py
│ │ ├── comment_remover.py
│ │ ├── community_modules.py
│ │ ├── compilation_database.py
│ │ ├── constants.py
│ │ ├── converter.py
│ │ ├── datetime.py
│ │ ├── decorators.py
│ │ ├── docs.py
│ │ ├── errors.py
│ │ ├── flashers.py
│ │ ├── git.py
│ │ ├── importers.py
│ │ ├── info.py
│ │ ├── json_encoders.py
│ │ ├── json_schema.py
│ │ ├── keyboard.py
│ │ ├── keycodes.py
│ │ ├── keymap.py
│ │ ├── makefile.py
│ │ ├── math.py
│ │ ├── math_ops.py
│ │ ├── painter.py
│ │ ├── painter_qff.py
│ │ ├── painter_qgf.py
│ │ ├── path.py
│ │ ├── search.py
│ │ ├── submodules.py
│ │ ├── tests/
│ │ │ ├── .gitignore
│ │ │ ├── __init__.py
│ │ │ ├── attrdict.py
│ │ │ ├── kle.txt
│ │ │ ├── minimal_info.json
│ │ │ ├── minimal_keymap.json
│ │ │ ├── test_cli_commands.py
│ │ │ ├── test_qmk_errors.py
│ │ │ ├── test_qmk_keymap.py
│ │ │ └── test_qmk_path.py
│ │ ├── userspace.py
│ │ └── util.py
│ └── usbhost/
│ ├── USB_Host_Shield_2.0/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .gitmodules
│ │ ├── BTD.cpp
│ │ ├── BTD.h
│ │ ├── BTHID.cpp
│ │ ├── BTHID.h
│ │ ├── PS3BT.cpp
│ │ ├── PS3BT.h
│ │ ├── PS3Enums.h
│ │ ├── PS3USB.cpp
│ │ ├── PS3USB.h
│ │ ├── PS4BT.h
│ │ ├── PS4Parser.cpp
│ │ ├── PS4Parser.h
│ │ ├── PS4USB.h
│ │ ├── PSBuzz.cpp
│ │ ├── PSBuzz.h
│ │ ├── README.md
│ │ ├── SPP.cpp
│ │ ├── SPP.h
│ │ ├── Usb.cpp
│ │ ├── Usb.h
│ │ ├── UsbCore.h
│ │ ├── Wii.cpp
│ │ ├── Wii.h
│ │ ├── WiiCameraReadme.md
│ │ ├── XBOXOLD.cpp
│ │ ├── XBOXOLD.h
│ │ ├── XBOXONE.cpp
│ │ ├── XBOXONE.h
│ │ ├── XBOXRECV.cpp
│ │ ├── XBOXRECV.h
│ │ ├── XBOXUSB.cpp
│ │ ├── XBOXUSB.h
│ │ ├── address.h
│ │ ├── adk.cpp
│ │ ├── adk.h
│ │ ├── avrpins.h
│ │ ├── cdc_XR21B1411.cpp
│ │ ├── cdc_XR21B1411.h
│ │ ├── cdcacm.cpp
│ │ ├── cdcacm.h
│ │ ├── cdcftdi.cpp
│ │ ├── cdcftdi.h
│ │ ├── cdcprolific.cpp
│ │ ├── cdcprolific.h
│ │ ├── confdescparser.h
│ │ ├── controllerEnums.h
│ │ ├── examples/
│ │ │ ├── Bluetooth/
│ │ │ │ ├── BTHID/
│ │ │ │ │ ├── BTHID.ino
│ │ │ │ │ ├── KeyboardParser.h
│ │ │ │ │ └── MouseParser.h
│ │ │ │ ├── PS3BT/
│ │ │ │ │ └── PS3BT.ino
│ │ │ │ ├── PS3Multi/
│ │ │ │ │ └── PS3Multi.ino
│ │ │ │ ├── PS3SPP/
│ │ │ │ │ └── PS3SPP.ino
│ │ │ │ ├── PS4BT/
│ │ │ │ │ └── PS4BT.ino
│ │ │ │ ├── SPP/
│ │ │ │ │ └── SPP.ino
│ │ │ │ ├── SPPMulti/
│ │ │ │ │ └── SPPMulti.ino
│ │ │ │ ├── Wii/
│ │ │ │ │ └── Wii.ino
│ │ │ │ ├── WiiBalanceBoard/
│ │ │ │ │ └── WiiBalanceBoard.ino
│ │ │ │ ├── WiiIRCamera/
│ │ │ │ │ └── WiiIRCamera.ino
│ │ │ │ ├── WiiMulti/
│ │ │ │ │ └── WiiMulti.ino
│ │ │ │ └── WiiUProController/
│ │ │ │ └── WiiUProController.ino
│ │ │ ├── HID/
│ │ │ │ ├── USBHIDBootKbd/
│ │ │ │ │ └── USBHIDBootKbd.ino
│ │ │ │ ├── USBHIDBootKbdAndMouse/
│ │ │ │ │ └── USBHIDBootKbdAndMouse.ino
│ │ │ │ ├── USBHIDBootMouse/
│ │ │ │ │ └── USBHIDBootMouse.ino
│ │ │ │ ├── USBHIDJoystick/
│ │ │ │ │ ├── USBHIDJoystick.ino
│ │ │ │ │ ├── hidjoystickrptparser.cpp
│ │ │ │ │ └── hidjoystickrptparser.h
│ │ │ │ ├── USBHID_desc/
│ │ │ │ │ ├── USBHID_desc.ino
│ │ │ │ │ └── pgmstrings.h
│ │ │ │ ├── le3dp/
│ │ │ │ │ ├── le3dp.ino
│ │ │ │ │ ├── le3dp_rptparser.cpp
│ │ │ │ │ └── le3dp_rptparser.h
│ │ │ │ └── scale/
│ │ │ │ ├── scale.ino
│ │ │ │ ├── scale_rptparser.cpp
│ │ │ │ └── scale_rptparser.h
│ │ │ ├── PS3USB/
│ │ │ │ └── PS3USB.ino
│ │ │ ├── PS4USB/
│ │ │ │ └── PS4USB.ino
│ │ │ ├── PSBuzz/
│ │ │ │ └── PSBuzz.ino
│ │ │ ├── USB_desc/
│ │ │ │ ├── USB_desc.ino
│ │ │ │ └── pgmstrings.h
│ │ │ ├── Xbox/
│ │ │ │ ├── XBOXOLD/
│ │ │ │ │ └── XBOXOLD.ino
│ │ │ │ ├── XBOXONE/
│ │ │ │ │ └── XBOXONE.ino
│ │ │ │ ├── XBOXRECV/
│ │ │ │ │ └── XBOXRECV.ino
│ │ │ │ └── XBOXUSB/
│ │ │ │ └── XBOXUSB.ino
│ │ │ ├── acm/
│ │ │ │ └── acm_terminal/
│ │ │ │ ├── acm_terminal.ino
│ │ │ │ └── pgmstrings.h
│ │ │ ├── adk/
│ │ │ │ ├── ArduinoBlinkLED/
│ │ │ │ │ └── ArduinoBlinkLED.ino
│ │ │ │ ├── adk_barcode/
│ │ │ │ │ └── adk_barcode.ino
│ │ │ │ ├── demokit_20/
│ │ │ │ │ └── demokit_20.ino
│ │ │ │ ├── term_test/
│ │ │ │ │ └── term_test.ino
│ │ │ │ └── term_time/
│ │ │ │ └── term_time.ino
│ │ │ ├── board_qc/
│ │ │ │ └── board_qc.ino
│ │ │ ├── cdc_XR21B1411/
│ │ │ │ └── XR_terminal/
│ │ │ │ └── XR_terminal.ino
│ │ │ ├── ftdi/
│ │ │ │ └── USBFTDILoopback/
│ │ │ │ ├── USBFTDILoopback.ino
│ │ │ │ └── pgmstrings.h
│ │ │ ├── hub_demo/
│ │ │ │ ├── hub_demo.ino
│ │ │ │ └── pgmstrings.h
│ │ │ ├── max_LCD/
│ │ │ │ └── max_LCD.ino
│ │ │ ├── pl2303/
│ │ │ │ ├── pl2303_gprs_terminal/
│ │ │ │ │ └── pl2303_gprs_terminal.ino
│ │ │ │ ├── pl2303_gps/
│ │ │ │ │ └── pl2303_gps.ino
│ │ │ │ ├── pl2303_tinygps/
│ │ │ │ │ └── pl2303_tinygps.ino
│ │ │ │ └── pl2303_xbee_terminal/
│ │ │ │ └── pl2303_xbee_terminal.ino
│ │ │ └── testusbhostFAT/
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ └── testusbhostFAT.ino
│ │ ├── gpl2.txt
│ │ ├── hexdump.h
│ │ ├── hid.cpp
│ │ ├── hid.h
│ │ ├── hidboot.cpp
│ │ ├── hidboot.h
│ │ ├── hidescriptorparser.cpp
│ │ ├── hidescriptorparser.h
│ │ ├── hiduniversal.cpp
│ │ ├── hiduniversal.h
│ │ ├── hidusagestr.h
│ │ ├── hidusagetitlearrays.cpp
│ │ ├── keywords.txt
│ │ ├── library.json
│ │ ├── library.properties
│ │ ├── macros.h
│ │ ├── masstorage.cpp
│ │ ├── masstorage.h
│ │ ├── max3421e.h
│ │ ├── max_LCD.cpp
│ │ ├── max_LCD.h
│ │ ├── message.cpp
│ │ ├── message.h
│ │ ├── parsetools.cpp
│ │ ├── parsetools.h
│ │ ├── printhex.h
│ │ ├── settings.h
│ │ ├── sink_parser.h
│ │ ├── usb_ch9.h
│ │ ├── usbhost.h
│ │ ├── usbhub.cpp
│ │ ├── usbhub.h
│ │ ├── version_helper.h
│ │ └── xboxEnums.h
│ └── arduino-1.0.1/
│ ├── cores/
│ │ └── arduino/
│ │ ├── Arduino.h
│ │ ├── CDC.cpp
│ │ ├── Client.h
│ │ ├── HID.cpp
│ │ ├── HardwareSerial.cpp
│ │ ├── HardwareSerial.h
│ │ ├── IPAddress.cpp
│ │ ├── IPAddress.h
│ │ ├── Platform.h
│ │ ├── Print.cpp
│ │ ├── Print.h
│ │ ├── Printable.h
│ │ ├── Server.h
│ │ ├── Stream.cpp
│ │ ├── Stream.h
│ │ ├── Tone.cpp
│ │ ├── USBAPI.h
│ │ ├── USBCore.cpp
│ │ ├── USBCore.h
│ │ ├── USBDesc.h
│ │ ├── Udp.h
│ │ ├── WCharacter.h
│ │ ├── WInterrupts.c
│ │ ├── WMath.cpp
│ │ ├── WString.cpp
│ │ ├── WString.h
│ │ ├── binary.h
│ │ ├── main.cpp
│ │ ├── new.cpp
│ │ ├── new.h
│ │ ├── wiring.c
│ │ ├── wiring_analog.c
│ │ ├── wiring_digital.c
│ │ ├── wiring_private.h
│ │ ├── wiring_pulse.c
│ │ └── wiring_shift.c
│ └── variants/
│ ├── eightanaloginputs/
│ │ └── pins_arduino.h
│ ├── leonardo/
│ │ └── pins_arduino.h
│ ├── mega/
│ │ └── pins_arduino.h
│ └── standard/
│ └── pins_arduino.h
├── license_GPLv2.md
├── license_GPLv3.md
├── license_Modified_BSD.md
├── modules/
│ └── qmk/
│ ├── flow_led_matrix_effect/
│ │ ├── led_matrix_module.inc
│ │ └── qmk_module.json
│ ├── flow_rgb_matrix_effect/
│ │ ├── qmk_module.json
│ │ └── rgb_matrix_module.inc
│ ├── hello_world/
│ │ ├── hello_world.c
│ │ ├── introspection.c
│ │ ├── introspection.h
│ │ ├── qmk_module.json
│ │ └── rules.mk
│ └── super_alt_tab/
│ ├── qmk_module.json
│ └── super_alt_tab.c
├── nose2.cfg
├── paths.mk
├── platforms/
│ ├── atomic_util.h
│ ├── avr/
│ │ ├── _pin_defs.h
│ │ ├── _print.h
│ │ ├── _timer.h
│ │ ├── _util.h
│ │ ├── _wait.h
│ │ ├── atomic_util.h
│ │ ├── bootloader.mk
│ │ ├── bootloader_size.c
│ │ ├── bootloaders/
│ │ │ ├── bootloadhid.c
│ │ │ ├── caterina.c
│ │ │ ├── custom.c
│ │ │ ├── dfu.c
│ │ │ ├── halfkay.c
│ │ │ └── usbasploader.c
│ │ ├── drivers/
│ │ │ ├── analog.c
│ │ │ ├── analog.h
│ │ │ ├── audio_pwm.h
│ │ │ ├── audio_pwm_hardware.c
│ │ │ ├── backlight_pwm.c
│ │ │ ├── backlight_timer.c
│ │ │ ├── glcdfont.c
│ │ │ ├── i2c_master.c
│ │ │ ├── i2c_slave.c
│ │ │ ├── i2c_slave.h
│ │ │ ├── ps2/
│ │ │ │ ├── ps2_io.c
│ │ │ │ └── ps2_usart.c
│ │ │ ├── serial.c
│ │ │ ├── spi_master.c
│ │ │ ├── uart.c
│ │ │ ├── ws2812_bitbang.c
│ │ │ └── ws2812_i2c.c
│ │ ├── flash.mk
│ │ ├── gpio.h
│ │ ├── hardware_id.c
│ │ ├── mcu_selection.mk
│ │ ├── platform.c
│ │ ├── platform.mk
│ │ ├── platform_deps.h
│ │ ├── printf.c
│ │ ├── printf.mk
│ │ ├── sleep_led.c
│ │ ├── suspend.c
│ │ ├── timer.c
│ │ ├── timer_avr.h
│ │ ├── xprintf.S
│ │ └── xprintf.h
│ ├── bootloader.h
│ ├── chibios/
│ │ ├── _pin_defs.h
│ │ ├── _timer.h
│ │ ├── _util.h
│ │ ├── _wait.c
│ │ ├── _wait.h
│ │ ├── atomic_util.h
│ │ ├── boards/
│ │ │ ├── BLACKPILL_STM32_F401/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── BLACKPILL_STM32_F411/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── BONSAI_C4/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_AT32_F415XX/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_PROMICRO_RP2040/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_RP_RP2040/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F042X6/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F072XB/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F303XC/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F401XC/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F405XG/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F407XE/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F411XE/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F446XE/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_G0B1XB/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.mk
│ │ │ │ │ └── extra.c
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_G431XB/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ ├── hal_lld.h
│ │ │ │ ├── mcuconf.h
│ │ │ │ └── stm32_registry.h
│ │ │ ├── GENERIC_STM32_G474XE/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_H723XG/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.mk
│ │ │ │ │ └── extra.c
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_L412XB/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_L432XC/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_L433XC/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_WB32_F3G71XX/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_WB32_FQ95XX/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── IC_TEENSY_3_1/
│ │ │ │ └── board/
│ │ │ │ ├── board.c
│ │ │ │ ├── board.h
│ │ │ │ └── board.mk
│ │ │ ├── IC_TEENSY_4_1/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── rules.mk
│ │ │ ├── PJRC_TEENSY_3_5/
│ │ │ │ └── board/
│ │ │ │ ├── board.mk
│ │ │ │ └── extra.c
│ │ │ ├── PJRC_TEENSY_3_6/
│ │ │ │ └── board/
│ │ │ │ ├── board.mk
│ │ │ │ └── extra.c
│ │ │ ├── QMK_BLOK/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── QMK_PM2040/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── QMK_PROTON_C/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── SIPEED_LONGAN_NANO/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── chconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── STEMCELL/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── STM32_F103_STM32DUINO/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ ├── configs/
│ │ │ │ │ ├── chconf.h
│ │ │ │ │ ├── config.h
│ │ │ │ │ └── mcuconf.h
│ │ │ │ └── ld/
│ │ │ │ ├── STM32F103x6_stm32duino.ld
│ │ │ │ ├── STM32F103x8_stm32duino.ld
│ │ │ │ ├── STM32F103xB_stm32duino.ld
│ │ │ │ └── stm32duino_bootloader_common.ld
│ │ │ └── common/
│ │ │ ├── configs/
│ │ │ │ ├── chconf.h
│ │ │ │ └── halconf.h
│ │ │ └── ld/
│ │ │ ├── MKL26Z64.ld
│ │ │ ├── RP2040_FLASH_TIMECRIT.ld
│ │ │ ├── RP2040_rules_data_with_timecrit.ld
│ │ │ ├── STM32F103x8_uf2boot.ld
│ │ │ ├── STM32F103xB_uf2boot.ld
│ │ │ ├── STM32F303xC_tinyuf2.ld
│ │ │ ├── STM32F401xC.ld
│ │ │ ├── STM32F401xC_tinyuf2.ld
│ │ │ ├── STM32F401xE.ld
│ │ │ ├── STM32F401xE_tinyuf2.ld
│ │ │ ├── STM32F405xG.ld
│ │ │ ├── STM32F405xG_tinyuf2.ld
│ │ │ ├── STM32F407xE.ld
│ │ │ ├── STM32F407xE_tinyuf2.ld
│ │ │ ├── STM32F411xC.ld
│ │ │ ├── STM32F411xC_tinyuf2.ld
│ │ │ ├── STM32F411xE.ld
│ │ │ ├── STM32F411xE_tinyuf2.ld
│ │ │ ├── STM32F446xE.ld
│ │ │ ├── STM32F446xE_tinyuf2.ld
│ │ │ ├── STM32G0B1xB.ld
│ │ │ ├── STM32L412xB.ld
│ │ │ ├── stm32f4xx_common.ld
│ │ │ └── stm32f4xx_tinyuf2_common.ld
│ │ ├── bootloader.mk
│ │ ├── bootloaders/
│ │ │ ├── at32_dfu.c
│ │ │ ├── custom.c
│ │ │ ├── gd32v_dfu.c
│ │ │ ├── halfkay.c
│ │ │ ├── kiibohd.c
│ │ │ ├── rp2040.c
│ │ │ ├── stm32_dfu.c
│ │ │ ├── stm32duino.c
│ │ │ ├── tinyuf2.c
│ │ │ ├── uf2boot.c
│ │ │ └── wb32_dfu.c
│ │ ├── chibios_config.h
│ │ ├── config.h
│ │ ├── converters/
│ │ │ ├── elite_c_to_elite_pi/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── elite_c_to_helios/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── elite_c_to_liatris/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── elite_c_to_rp2040_ce/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── elite_c_to_stemcell/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_bit_c_pro/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_blok/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_bonsai_c3/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_bonsai_c4/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ ├── converter.mk
│ │ │ │ └── post_converter.mk
│ │ │ ├── promicro_to_elite_pi/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_helios/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_imera/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_kb2040/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_liatris/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_michi/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_promicro_rp2040/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_proton_c/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ ├── converter.mk
│ │ │ │ └── post_converter.mk
│ │ │ ├── promicro_to_rp2040_ce/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_sparkfun_pm2040/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_stemcell/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ └── promicro_to_svlinky/
│ │ │ ├── _pin_defs.h
│ │ │ └── converter.mk
│ │ ├── drivers/
│ │ │ ├── analog.c
│ │ │ ├── analog.h
│ │ │ ├── audio_dac.h
│ │ │ ├── audio_dac_additive.c
│ │ │ ├── audio_dac_basic.c
│ │ │ ├── audio_pwm.h
│ │ │ ├── audio_pwm_hardware.c
│ │ │ ├── audio_pwm_software.c
│ │ │ ├── backlight_pwm.c
│ │ │ ├── backlight_timer.c
│ │ │ ├── eeprom/
│ │ │ │ ├── eeprom_kinetis_flexram.c
│ │ │ │ ├── eeprom_kinetis_flexram.h
│ │ │ │ ├── eeprom_legacy_emulated_flash.c
│ │ │ │ ├── eeprom_legacy_emulated_flash.h
│ │ │ │ ├── eeprom_legacy_emulated_flash_defs.h
│ │ │ │ ├── eeprom_stm32_L0_L1.c
│ │ │ │ └── eeprom_stm32_L0_L1.h
│ │ │ ├── flash/
│ │ │ │ ├── legacy_flash_ops.c
│ │ │ │ └── legacy_flash_ops.h
│ │ │ ├── i2c_master.c
│ │ │ ├── ps2/
│ │ │ │ └── ps2_io.c
│ │ │ ├── serial.c
│ │ │ ├── serial_protocol.c
│ │ │ ├── serial_protocol.h
│ │ │ ├── serial_usart.c
│ │ │ ├── serial_usart.h
│ │ │ ├── spi_master.c
│ │ │ ├── uart_serial.c
│ │ │ ├── uart_sio.c
│ │ │ ├── usbpd_stm32g4.c
│ │ │ ├── vendor/
│ │ │ │ └── RP/
│ │ │ │ └── RP2040/
│ │ │ │ ├── ps2_vendor.c
│ │ │ │ ├── serial_vendor.c
│ │ │ │ └── ws2812_vendor.c
│ │ │ ├── wear_leveling/
│ │ │ │ ├── wear_leveling_efl.c
│ │ │ │ ├── wear_leveling_efl_config.h
│ │ │ │ ├── wear_leveling_legacy.c
│ │ │ │ ├── wear_leveling_legacy_config.h
│ │ │ │ ├── wear_leveling_rp2040_flash.c
│ │ │ │ └── wear_leveling_rp2040_flash_config.h
│ │ │ ├── ws2812_bitbang.c
│ │ │ ├── ws2812_pwm.c
│ │ │ └── ws2812_spi.c
│ │ ├── errno.h
│ │ ├── flash.mk
│ │ ├── gd32v_compatibility.h
│ │ ├── gpio.h
│ │ ├── hardware_id.c
│ │ ├── interrupt_handlers.c
│ │ ├── mcu_selection.mk
│ │ ├── platform.c
│ │ ├── platform.mk
│ │ ├── platform_deps.h
│ │ ├── sleep_led.c
│ │ ├── suspend.c
│ │ ├── synchronization_util.c
│ │ ├── syscall-fallbacks.c
│ │ ├── timer.c
│ │ ├── vendors/
│ │ │ └── RP/
│ │ │ ├── RP2040.mk
│ │ │ ├── _pin_defs.h
│ │ │ ├── pico_sdk_shims.c
│ │ │ └── stage2_bootloaders.c
│ │ └── wait.c
│ ├── common.mk
│ ├── eeprom.h
│ ├── gpio.h
│ ├── hardware_id.h
│ ├── lv_conf.h
│ ├── pin_defs.h
│ ├── progmem.h
│ ├── sleep_led.h
│ ├── suspend.c
│ ├── suspend.h
│ ├── synchronization_util.c
│ ├── synchronization_util.h
│ ├── test/
│ │ ├── _wait.h
│ │ ├── bootloaders/
│ │ │ └── none.c
│ │ ├── drivers/
│ │ │ ├── audio_pwm.h
│ │ │ └── audio_pwm_hardware.c
│ │ ├── eeprom.c
│ │ ├── eeprom_legacy_emulated_flash_tests.cpp
│ │ ├── eeprom_legacy_emulated_flash_tests.h
│ │ ├── hal.h
│ │ ├── hardware_id.c
│ │ ├── legacy_flash_ops_mock.c
│ │ ├── platform.c
│ │ ├── platform.h
│ │ ├── platform.mk
│ │ ├── platform_deps.h
│ │ ├── rules.mk
│ │ ├── suspend.c
│ │ ├── testlist.mk
│ │ └── timer.c
│ ├── timer.c
│ ├── timer.h
│ └── wait.h
├── quantum/
│ ├── action.c
│ ├── action.h
│ ├── action_code.h
│ ├── action_layer.c
│ ├── action_layer.h
│ ├── action_tapping.c
│ ├── action_tapping.h
│ ├── action_util.c
│ ├── action_util.h
│ ├── audio/
│ │ ├── audio.c
│ │ ├── audio.h
│ │ ├── luts.c
│ │ ├── luts.h
│ │ ├── muse.c
│ │ ├── muse.h
│ │ ├── musical_notes.h
│ │ ├── song_list.h
│ │ ├── voices.c
│ │ └── voices.h
│ ├── backlight/
│ │ ├── backlight.c
│ │ ├── backlight.h
│ │ ├── backlight_driver_common.c
│ │ └── backlight_driver_common.h
│ ├── basic_profiling.h
│ ├── bits.h
│ ├── bitwise.c
│ ├── bitwise.h
│ ├── bootmagic/
│ │ ├── bootmagic.c
│ │ └── bootmagic.h
│ ├── caps_word.c
│ ├── caps_word.h
│ ├── color.c
│ ├── color.h
│ ├── command.c
│ ├── command.h
│ ├── compiler_support.h
│ ├── connection/
│ │ ├── connection.c
│ │ └── connection.h
│ ├── crc.c
│ ├── crc.h
│ ├── debounce/
│ │ ├── asym_eager_defer_pk.c
│ │ ├── none.c
│ │ ├── sym_defer_g.c
│ │ ├── sym_defer_pk.c
│ │ ├── sym_defer_pr.c
│ │ ├── sym_eager_pk.c
│ │ ├── sym_eager_pr.c
│ │ └── tests/
│ │ ├── asym_eager_defer_pk_tests.cpp
│ │ ├── debounce_test_common.cpp
│ │ ├── debounce_test_common.h
│ │ ├── none_tests.cpp
│ │ ├── rules.mk
│ │ ├── sym_defer_g_tests.cpp
│ │ ├── sym_defer_pk_tests.cpp
│ │ ├── sym_defer_pr_tests.cpp
│ │ ├── sym_eager_pk_tests.cpp
│ │ ├── sym_eager_pr_tests.cpp
│ │ └── testlist.mk
│ ├── debounce.h
│ ├── deferred_exec.c
│ ├── deferred_exec.h
│ ├── digitizer.c
│ ├── digitizer.h
│ ├── dip_switch.c
│ ├── dip_switch.h
│ ├── dynamic_keymap.c
│ ├── dynamic_keymap.h
│ ├── eeconfig.c
│ ├── eeconfig.h
│ ├── encoder/
│ │ └── tests/
│ │ ├── config_encoder_common.h
│ │ ├── config_mock.h
│ │ ├── config_mock_split_left_eq_right.h
│ │ ├── config_mock_split_left_gt_right.h
│ │ ├── config_mock_split_left_lt_right.h
│ │ ├── config_mock_split_no_left.h
│ │ ├── config_mock_split_no_right.h
│ │ ├── config_mock_split_role.h
│ │ ├── encoder_tests.cpp
│ │ ├── encoder_tests_split_left_eq_right.cpp
│ │ ├── encoder_tests_split_left_gt_right.cpp
│ │ ├── encoder_tests_split_left_lt_right.cpp
│ │ ├── encoder_tests_split_no_left.cpp
│ │ ├── encoder_tests_split_no_right.cpp
│ │ ├── encoder_tests_split_role.cpp
│ │ ├── mock.c
│ │ ├── mock.h
│ │ ├── mock_split.c
│ │ ├── mock_split.h
│ │ ├── rules.mk
│ │ └── testlist.mk
│ ├── encoder.c
│ ├── encoder.h
│ ├── haptic.c
│ ├── haptic.h
│ ├── joystick.c
│ ├── joystick.h
│ ├── keyboard.c
│ ├── keyboard.h
│ ├── keycode.h
│ ├── keycode_config.c
│ ├── keycode_config.h
│ ├── keycode_string.c
│ ├── keycode_string.h
│ ├── keycodes.h
│ ├── keymap_common.c
│ ├── keymap_common.h
│ ├── keymap_extras/
│ │ ├── keymap_belgian.h
│ │ ├── keymap_bepo.h
│ │ ├── keymap_brazilian_abnt2.h
│ │ ├── keymap_canadian_french.h
│ │ ├── keymap_canadian_multilingual.h
│ │ ├── keymap_colemak.h
│ │ ├── keymap_croatian.h
│ │ ├── keymap_czech.h
│ │ ├── keymap_czech_mac_ansi.h
│ │ ├── keymap_czech_mac_iso.h
│ │ ├── keymap_danish.h
│ │ ├── keymap_dvorak.h
│ │ ├── keymap_dvorak_fr.h
│ │ ├── keymap_dvorak_programmer.h
│ │ ├── keymap_estonian.h
│ │ ├── keymap_eurkey.h
│ │ ├── keymap_farsi.h
│ │ ├── keymap_finnish.h
│ │ ├── keymap_french.h
│ │ ├── keymap_french_afnor.h
│ │ ├── keymap_french_mac_iso.h
│ │ ├── keymap_german.h
│ │ ├── keymap_german_mac_iso.h
│ │ ├── keymap_greek.h
│ │ ├── keymap_hebrew.h
│ │ ├── keymap_hungarian.h
│ │ ├── keymap_icelandic.h
│ │ ├── keymap_irish.h
│ │ ├── keymap_italian.h
│ │ ├── keymap_italian_mac_ansi.h
│ │ ├── keymap_italian_mac_iso.h
│ │ ├── keymap_japanese.h
│ │ ├── keymap_korean.h
│ │ ├── keymap_latvian.h
│ │ ├── keymap_lithuanian_azerty.h
│ │ ├── keymap_lithuanian_qwerty.h
│ │ ├── keymap_neo2.h
│ │ ├── keymap_nordic.h
│ │ ├── keymap_norman.h
│ │ ├── keymap_norwegian.h
│ │ ├── keymap_plover.h
│ │ ├── keymap_plover_dvorak.h
│ │ ├── keymap_polish.h
│ │ ├── keymap_portuguese.h
│ │ ├── keymap_portuguese_mac_iso.h
│ │ ├── keymap_romanian.h
│ │ ├── keymap_russian.h
│ │ ├── keymap_russian_typewriter.h
│ │ ├── keymap_serbian.h
│ │ ├── keymap_serbian_latin.h
│ │ ├── keymap_slovak.h
│ │ ├── keymap_slovenian.h
│ │ ├── keymap_spanish.h
│ │ ├── keymap_spanish_dvorak.h
│ │ ├── keymap_spanish_latin_america.h
│ │ ├── keymap_steno.h
│ │ ├── keymap_swedish.h
│ │ ├── keymap_swedish_mac_ansi.h
│ │ ├── keymap_swedish_mac_iso.h
│ │ ├── keymap_swedish_pro_mac_ansi.h
│ │ ├── keymap_swedish_pro_mac_iso.h
│ │ ├── keymap_swiss_de.h
│ │ ├── keymap_swiss_fr.h
│ │ ├── keymap_turkish_f.h
│ │ ├── keymap_turkish_q.h
│ │ ├── keymap_uk.h
│ │ ├── keymap_ukrainian.h
│ │ ├── keymap_us.h
│ │ ├── keymap_us_extended.h
│ │ ├── keymap_us_international.h
│ │ ├── keymap_us_international_linux.h
│ │ ├── keymap_workman.h
│ │ ├── keymap_workman_zxcvm.h
│ │ ├── sendstring_belgian.h
│ │ ├── sendstring_bepo.h
│ │ ├── sendstring_brazilian_abnt2.h
│ │ ├── sendstring_canadian_french.h
│ │ ├── sendstring_canadian_multilingual.h
│ │ ├── sendstring_colemak.h
│ │ ├── sendstring_croatian.h
│ │ ├── sendstring_czech.h
│ │ ├── sendstring_czech_mac_ansi.h
│ │ ├── sendstring_czech_mac_iso.h
│ │ ├── sendstring_danish.h
│ │ ├── sendstring_dvorak.h
│ │ ├── sendstring_dvorak_fr.h
│ │ ├── sendstring_dvorak_programmer.h
│ │ ├── sendstring_estonian.h
│ │ ├── sendstring_finnish.h
│ │ ├── sendstring_french.h
│ │ ├── sendstring_french_afnor.h
│ │ ├── sendstring_french_mac_iso.h
│ │ ├── sendstring_german.h
│ │ ├── sendstring_german_mac_iso.h
│ │ ├── sendstring_hungarian.h
│ │ ├── sendstring_icelandic.h
│ │ ├── sendstring_italian.h
│ │ ├── sendstring_italian_mac_ansi.h
│ │ ├── sendstring_italian_mac_iso.h
│ │ ├── sendstring_japanese.h
│ │ ├── sendstring_latvian.h
│ │ ├── sendstring_lithuanian_azerty.h
│ │ ├── sendstring_lithuanian_qwerty.h
│ │ ├── sendstring_norman.h
│ │ ├── sendstring_norwegian.h
│ │ ├── sendstring_portuguese.h
│ │ ├── sendstring_portuguese_mac_iso.h
│ │ ├── sendstring_romanian.h
│ │ ├── sendstring_serbian_latin.h
│ │ ├── sendstring_slovak.h
│ │ ├── sendstring_slovenian.h
│ │ ├── sendstring_spanish.h
│ │ ├── sendstring_spanish_dvorak.h
│ │ ├── sendstring_spanish_latin_america.h
│ │ ├── sendstring_swedish.h
│ │ ├── sendstring_swiss_de.h
│ │ ├── sendstring_swiss_fr.h
│ │ ├── sendstring_turkish_f.h
│ │ ├── sendstring_turkish_q.h
│ │ ├── sendstring_uk.h
│ │ ├── sendstring_us_international.h
│ │ ├── sendstring_workman.h
│ │ └── sendstring_workman_zxcvm.h
│ ├── keymap_introspection.c
│ ├── keymap_introspection.h
│ ├── layer_lock.c
│ ├── layer_lock.h
│ ├── leader.c
│ ├── leader.h
│ ├── led.c
│ ├── led.h
│ ├── led_matrix/
│ │ ├── animations/
│ │ │ ├── alpha_mods_anim.h
│ │ │ ├── band_anim.h
│ │ │ ├── band_pinwheel_anim.h
│ │ │ ├── band_spiral_anim.h
│ │ │ ├── breathing_anim.h
│ │ │ ├── cycle_left_right_anim.h
│ │ │ ├── cycle_out_in_anim.h
│ │ │ ├── cycle_up_down_anim.h
│ │ │ ├── dual_beacon_anim.h
│ │ │ ├── led_matrix_effects.inc
│ │ │ ├── runners/
│ │ │ │ ├── effect_runner_dx_dy.h
│ │ │ │ ├── effect_runner_dx_dy_dist.h
│ │ │ │ ├── effect_runner_i.h
│ │ │ │ ├── effect_runner_reactive.h
│ │ │ │ ├── effect_runner_reactive_splash.h
│ │ │ │ ├── effect_runner_sin_cos_i.h
│ │ │ │ └── led_matrix_runners.inc
│ │ │ ├── solid_anim.h
│ │ │ ├── solid_reactive_cross.h
│ │ │ ├── solid_reactive_nexus.h
│ │ │ ├── solid_reactive_simple_anim.h
│ │ │ ├── solid_reactive_wide.h
│ │ │ ├── solid_splash_anim.h
│ │ │ ├── wave_left_right_anim.h
│ │ │ └── wave_up_down_anim.h
│ │ ├── led_matrix.c
│ │ ├── led_matrix.h
│ │ ├── led_matrix_drivers.c
│ │ ├── led_matrix_drivers.h
│ │ ├── led_matrix_types.h
│ │ └── post_config.h
│ ├── led_tables.c
│ ├── led_tables.h
│ ├── logging/
│ │ ├── debug.c
│ │ ├── debug.h
│ │ ├── print.c
│ │ ├── print.h
│ │ ├── print.mk
│ │ ├── sendchar.c
│ │ └── sendchar.h
│ ├── main.c
│ ├── matrix.c
│ ├── matrix.h
│ ├── matrix_common.c
│ ├── midi/
│ │ ├── Config/
│ │ │ └── LUFAConfig.h
│ │ ├── bytequeue/
│ │ │ ├── COPYING
│ │ │ ├── bytequeue.c
│ │ │ ├── bytequeue.h
│ │ │ ├── interrupt_setting.c
│ │ │ └── interrupt_setting.h
│ │ ├── midi.c
│ │ ├── midi.h
│ │ ├── midi_device.c
│ │ ├── midi_device.h
│ │ ├── midi_function_types.h
│ │ ├── qmk_midi.c
│ │ ├── qmk_midi.h
│ │ ├── sysex_tools.c
│ │ └── sysex_tools.h
│ ├── modifiers.h
│ ├── mousekey.c
│ ├── mousekey.h
│ ├── nvm/
│ │ ├── eeprom/
│ │ │ ├── nvm_dynamic_keymap.c
│ │ │ ├── nvm_eeconfig.c
│ │ │ ├── nvm_eeprom_eeconfig_internal.h
│ │ │ ├── nvm_eeprom_via_internal.h
│ │ │ └── nvm_via.c
│ │ ├── nvm_dynamic_keymap.h
│ │ ├── nvm_eeconfig.h
│ │ ├── nvm_via.h
│ │ ├── readme.md
│ │ └── rules.mk
│ ├── os_detection/
│ │ └── tests/
│ │ ├── os_detection.cpp
│ │ ├── rules.mk
│ │ └── testlist.mk
│ ├── os_detection.c
│ ├── os_detection.h
│ ├── painter/
│ │ ├── lvgl/
│ │ │ ├── qp_lvgl.c
│ │ │ ├── qp_lvgl.h
│ │ │ └── rules.mk
│ │ ├── qff.c
│ │ ├── qff.h
│ │ ├── qgf.c
│ │ ├── qgf.h
│ │ ├── qp.c
│ │ ├── qp.h
│ │ ├── qp_comms.c
│ │ ├── qp_comms.h
│ │ ├── qp_draw.h
│ │ ├── qp_draw_circle.c
│ │ ├── qp_draw_codec.c
│ │ ├── qp_draw_core.c
│ │ ├── qp_draw_ellipse.c
│ │ ├── qp_draw_image.c
│ │ ├── qp_draw_text.c
│ │ ├── qp_internal.c
│ │ ├── qp_internal.h
│ │ ├── qp_internal_driver.h
│ │ ├── qp_internal_formats.h
│ │ ├── qp_stream.c
│ │ ├── qp_stream.h
│ │ └── rules.mk
│ ├── pointing_device/
│ │ ├── pointing_device.c
│ │ ├── pointing_device.h
│ │ ├── pointing_device_auto_mouse.c
│ │ ├── pointing_device_auto_mouse.h
│ │ ├── pointing_device_gestures.c
│ │ └── pointing_device_gestures.h
│ ├── pointing_device_internal.h
│ ├── process_keycode/
│ │ ├── autocorrect_data_default.h
│ │ ├── process_achordion.c
│ │ ├── process_achordion.h
│ │ ├── process_audio.c
│ │ ├── process_audio.h
│ │ ├── process_auto_shift.c
│ │ ├── process_auto_shift.h
│ │ ├── process_autocorrect.c
│ │ ├── process_autocorrect.h
│ │ ├── process_backlight.c
│ │ ├── process_backlight.h
│ │ ├── process_caps_word.c
│ │ ├── process_caps_word.h
│ │ ├── process_clicky.c
│ │ ├── process_clicky.h
│ │ ├── process_combo.c
│ │ ├── process_combo.h
│ │ ├── process_connection.c
│ │ ├── process_connection.h
│ │ ├── process_default_layer.c
│ │ ├── process_default_layer.h
│ │ ├── process_dynamic_macro.c
│ │ ├── process_dynamic_macro.h
│ │ ├── process_dynamic_tapping_term.c
│ │ ├── process_dynamic_tapping_term.h
│ │ ├── process_grave_esc.c
│ │ ├── process_grave_esc.h
│ │ ├── process_haptic.c
│ │ ├── process_haptic.h
│ │ ├── process_joystick.c
│ │ ├── process_joystick.h
│ │ ├── process_key_lock.c
│ │ ├── process_key_lock.h
│ │ ├── process_key_override.c
│ │ ├── process_key_override.h
│ │ ├── process_layer_lock.c
│ │ ├── process_layer_lock.h
│ │ ├── process_leader.c
│ │ ├── process_leader.h
│ │ ├── process_led_matrix.c
│ │ ├── process_led_matrix.h
│ │ ├── process_magic.c
│ │ ├── process_magic.h
│ │ ├── process_midi.c
│ │ ├── process_midi.h
│ │ ├── process_music.c
│ │ ├── process_music.h
│ │ ├── process_programmable_button.c
│ │ ├── process_programmable_button.h
│ │ ├── process_repeat_key.c
│ │ ├── process_repeat_key.h
│ │ ├── process_rgb_matrix.c
│ │ ├── process_rgb_matrix.h
│ │ ├── process_secure.c
│ │ ├── process_secure.h
│ │ ├── process_sequencer.c
│ │ ├── process_sequencer.h
│ │ ├── process_space_cadet.c
│ │ ├── process_space_cadet.h
│ │ ├── process_steno.c
│ │ ├── process_steno.h
│ │ ├── process_tap_dance.c
│ │ ├── process_tap_dance.h
│ │ ├── process_tri_layer.c
│ │ ├── process_tri_layer.h
│ │ ├── process_ucis.c
│ │ ├── process_ucis.h
│ │ ├── process_underglow.c
│ │ ├── process_underglow.h
│ │ ├── process_unicode.c
│ │ ├── process_unicode.h
│ │ ├── process_unicode_common.c
│ │ ├── process_unicode_common.h
│ │ ├── process_unicodemap.c
│ │ └── process_unicodemap.h
│ ├── programmable_button.c
│ ├── programmable_button.h
│ ├── quantum.c
│ ├── quantum.h
│ ├── quantum_keycodes.h
│ ├── quantum_keycodes_legacy.h
│ ├── raw_hid.c
│ ├── raw_hid.h
│ ├── repeat_key.c
│ ├── repeat_key.h
│ ├── rgb_matrix/
│ │ ├── animations/
│ │ │ ├── alpha_mods_anim.h
│ │ │ ├── breathing_anim.h
│ │ │ ├── colorband_pinwheel_sat_anim.h
│ │ │ ├── colorband_pinwheel_val_anim.h
│ │ │ ├── colorband_sat_anim.h
│ │ │ ├── colorband_spiral_sat_anim.h
│ │ │ ├── colorband_spiral_val_anim.h
│ │ │ ├── colorband_val_anim.h
│ │ │ ├── cycle_all_anim.h
│ │ │ ├── cycle_left_right_anim.h
│ │ │ ├── cycle_out_in_anim.h
│ │ │ ├── cycle_out_in_dual_anim.h
│ │ │ ├── cycle_pinwheel_anim.h
│ │ │ ├── cycle_spiral_anim.h
│ │ │ ├── cycle_up_down_anim.h
│ │ │ ├── digital_rain_anim.h
│ │ │ ├── dual_beacon_anim.h
│ │ │ ├── flower_blooming_anim.h
│ │ │ ├── gradient_left_right_anim.h
│ │ │ ├── gradient_up_down_anim.h
│ │ │ ├── hue_breathing_anim.h
│ │ │ ├── hue_pendulum_anim.h
│ │ │ ├── hue_wave_anim.h
│ │ │ ├── jellybean_raindrops_anim.h
│ │ │ ├── pixel_flow_anim.h
│ │ │ ├── pixel_fractal_anim.h
│ │ │ ├── pixel_rain_anim.h
│ │ │ ├── rainbow_beacon_anim.h
│ │ │ ├── rainbow_moving_chevron_anim.h
│ │ │ ├── rainbow_pinwheels_anim.h
│ │ │ ├── raindrops_anim.h
│ │ │ ├── rgb_matrix_effects.inc
│ │ │ ├── riverflow_anim.h
│ │ │ ├── runners/
│ │ │ │ ├── effect_runner_dx_dy.h
│ │ │ │ ├── effect_runner_dx_dy_dist.h
│ │ │ │ ├── effect_runner_i.h
│ │ │ │ ├── effect_runner_reactive.h
│ │ │ │ ├── effect_runner_reactive_splash.h
│ │ │ │ ├── effect_runner_sin_cos_i.h
│ │ │ │ └── rgb_matrix_runners.inc
│ │ │ ├── solid_color_anim.h
│ │ │ ├── solid_reactive_anim.h
│ │ │ ├── solid_reactive_cross.h
│ │ │ ├── solid_reactive_nexus.h
│ │ │ ├── solid_reactive_simple_anim.h
│ │ │ ├── solid_reactive_wide.h
│ │ │ ├── solid_splash_anim.h
│ │ │ ├── splash_anim.h
│ │ │ ├── starlight_anim.h
│ │ │ ├── starlight_dual_hue_anim.h
│ │ │ ├── starlight_dual_sat_anim.h
│ │ │ ├── starlight_smooth_anim.h
│ │ │ └── typing_heatmap_anim.h
│ │ ├── post_config.h
│ │ ├── rgb_matrix.c
│ │ ├── rgb_matrix.h
│ │ ├── rgb_matrix_drivers.c
│ │ ├── rgb_matrix_drivers.h
│ │ └── rgb_matrix_types.h
│ ├── rgblight/
│ │ ├── rgblight.c
│ │ ├── rgblight.h
│ │ ├── rgblight_breathe_table.h
│ │ ├── rgblight_drivers.c
│ │ ├── rgblight_drivers.h
│ │ ├── rgblight_modes.h
│ │ └── rgblight_post_config.h
│ ├── ring_buffer.h
│ ├── secure.c
│ ├── secure.h
│ ├── send_string/
│ │ ├── send_string.c
│ │ ├── send_string.h
│ │ └── send_string_keycodes.h
│ ├── sequencer/
│ │ ├── sequencer.c
│ │ ├── sequencer.h
│ │ └── tests/
│ │ ├── midi_mock.c
│ │ ├── midi_mock.h
│ │ ├── rules.mk
│ │ ├── sequencer_tests.cpp
│ │ └── testlist.mk
│ ├── split_common/
│ │ ├── post_config.h
│ │ ├── split_util.c
│ │ ├── split_util.h
│ │ ├── transaction_id_define.h
│ │ ├── transactions.c
│ │ ├── transactions.h
│ │ ├── transport.c
│ │ └── transport.h
│ ├── steno_keycodes.h
│ ├── sync_timer.c
│ ├── sync_timer.h
│ ├── tri_layer.c
│ ├── tri_layer.h
│ ├── unicode/
│ │ ├── ucis.c
│ │ ├── ucis.h
│ │ ├── unicode.c
│ │ ├── unicode.h
│ │ ├── unicode_keycodes.h
│ │ ├── unicodemap.c
│ │ ├── unicodemap.h
│ │ ├── utf8.c
│ │ └── utf8.h
│ ├── util.h
│ ├── variable_trace.c
│ ├── variable_trace.h
│ ├── via.c
│ ├── via.h
│ ├── virtser.h
│ ├── wear_leveling/
│ │ ├── tests/
│ │ │ ├── backing_mocks.cpp
│ │ │ ├── backing_mocks.hpp
│ │ │ ├── rules.mk
│ │ │ ├── testlist.mk
│ │ │ ├── wear_leveling_2byte.cpp
│ │ │ ├── wear_leveling_2byte_optimized_writes.cpp
│ │ │ ├── wear_leveling_4byte.cpp
│ │ │ ├── wear_leveling_8byte.cpp
│ │ │ └── wear_leveling_general.cpp
│ │ ├── wear_leveling.c
│ │ ├── wear_leveling.h
│ │ ├── wear_leveling_drivers.h
│ │ └── wear_leveling_internal.h
│ ├── wpm.c
│ └── wpm.h
├── readme.md
├── requirements-dev.txt
├── requirements.txt
├── setup.cfg
├── tests/
│ ├── audio/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_audio.cpp
│ ├── auto_shift/
│ │ ├── auto_shift_repeat/
│ │ │ ├── auto_shift_no_auto_repeat/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ └── test_auto_shift.cpp
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_auto_shift.cpp
│ │ ├── config.h
│ │ ├── retro_shift/
│ │ │ └── tap_hold_configurations/
│ │ │ ├── default_mod_tap/
│ │ │ │ ├── config.h
│ │ │ │ ├── no_timeout/
│ │ │ │ │ ├── config.h
│ │ │ │ │ ├── test.mk
│ │ │ │ │ └── test_retro_shift.cpp
│ │ │ │ ├── test.mk
│ │ │ │ └── test_retro_shift.cpp
│ │ │ ├── hold_on_other_key_press/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ └── test_retro_shift.cpp
│ │ │ ├── permissive_hold/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ └── test_retro_shift.cpp
│ │ │ └── permissive_hold_hold_on_other_key_press/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_retro_shift.cpp
│ │ ├── test.mk
│ │ └── test_auto_shift.cpp
│ ├── autocorrect/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_autocorrect.cpp
│ ├── basic/
│ │ ├── config.h
│ │ ├── test.mk
│ │ ├── test_action_layer.cpp
│ │ ├── test_keypress.cpp
│ │ ├── test_one_shot_keys.cpp
│ │ └── test_tapping.cpp
│ ├── caps_word/
│ │ ├── auto_shift/
│ │ │ ├── config.h
│ │ │ ├── retro_shift/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ └── test_caps_word_retroshift.cpp
│ │ │ ├── test.mk
│ │ │ └── test_caps_word_autoshift.cpp
│ │ ├── caps_word_combo/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_caps_word_combo.cpp
│ │ │ └── test_combos.c
│ │ ├── caps_word_invert_on_shift/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_caps_word_invert_on_shift.cpp
│ │ ├── config.h
│ │ ├── test.mk
│ │ ├── test_caps_word.cpp
│ │ └── unicodemap/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_caps_word_unicodemap.cpp
│ ├── combo/
│ │ ├── combo_repress/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_combo.cpp
│ │ │ └── test_combos_repress.c
│ │ ├── config.h
│ │ ├── test.mk
│ │ ├── test_combo.cpp
│ │ └── test_combos.c
│ ├── housekeeping/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_housekeeping.cpp
│ ├── keycode_string/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_keycode_string.cpp
│ ├── layer_lock/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_layer_lock.cpp
│ ├── leader/
│ │ ├── config.h
│ │ ├── leader_no_initial_timeout/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_leader_no_initial_timeout.cpp
│ │ ├── leader_per_key_timeout/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_leader_per_key_timeout.cpp
│ │ ├── leader_sequences.c
│ │ ├── leader_strict_key_processing/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_leader_strict_key_processing.cpp
│ │ ├── test.mk
│ │ └── test_leader.cpp
│ ├── mousekeys/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_mousekeys.cpp
│ ├── no_tapping/
│ │ ├── no_action_tapping/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_layer_tap.cpp
│ │ │ ├── test_mod_tap.cpp
│ │ │ └── test_one_shot_keys.cpp
│ │ └── no_mod_tap_mods/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_tapping.cpp
│ ├── pointing/
│ │ ├── config.h
│ │ ├── invertandrotate/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_invertandrotate.cpp
│ │ ├── invertxy/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_invertxy.cpp
│ │ ├── rotate180/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_rotate180.cpp
│ │ ├── rotate270/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_rotate270.cpp
│ │ ├── rotate90/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_rotate90.cpp
│ │ ├── test.mk
│ │ └── test_pointing.cpp
│ ├── repeat_key/
│ │ ├── alt_repeat_key/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_alt_repeat_key.cpp
│ │ ├── config.h
│ │ ├── repeat_key_combo/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_combos.c
│ │ │ └── test_repeat_key_combo.cpp
│ │ ├── test.mk
│ │ └── test_repeat_key.cpp
│ ├── secure/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_secure.cpp
│ ├── tap_dance/
│ │ ├── config.h
│ │ ├── examples.c
│ │ ├── examples.h
│ │ ├── tap_dance_layers/
│ │ │ ├── config.h
│ │ │ ├── tap_dance_defs.c
│ │ │ ├── tap_dance_defs.h
│ │ │ ├── test.mk
│ │ │ └── test_tap_dance_layers.cpp
│ │ ├── test.mk
│ │ └── test_examples.cpp
│ ├── tap_hold_configurations/
│ │ ├── chordal_hold/
│ │ │ ├── default/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ ├── test_keymap.c
│ │ │ │ ├── test_one_shot_keys.cpp
│ │ │ │ └── test_tap_hold.cpp
│ │ │ ├── hold_on_other_key_press/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ ├── test_keymap.c
│ │ │ │ └── test_tap_hold.cpp
│ │ │ ├── permissive_hold/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ ├── test_keymap.c
│ │ │ │ ├── test_one_shot_keys.cpp
│ │ │ │ └── test_tap_hold.cpp
│ │ │ ├── permissive_hold_flow_tap/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ ├── test_keymap.c
│ │ │ │ ├── test_one_shot_keys.cpp
│ │ │ │ └── test_tap_hold.cpp
│ │ │ └── retro_shift_permissive_hold/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_keymap.c
│ │ │ └── test_retro_shift.cpp
│ │ ├── default_mod_tap/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_one_shot_layer.cpp
│ │ │ └── test_tap_hold.cpp
│ │ ├── flow_tap/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_keymap.c
│ │ │ └── test_tap_hold.cpp
│ │ ├── hold_on_other_key_press/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_tap_hold.cpp
│ │ ├── permissive_hold/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_one_shot_keys.cpp
│ │ │ └── test_tap_hold.cpp
│ │ ├── quick_tap/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_action_layer.cpp
│ │ │ └── test_quick_tap.cpp
│ │ └── retro_tapping/
│ │ ├── config.h
│ │ ├── test.mk
│ │ ├── test_key_roll.cpp
│ │ ├── test_neutralization.cpp
│ │ ├── test_tap_hold.cpp
│ │ └── test_tapping.cpp
│ ├── test_common/
│ │ ├── build.mk
│ │ ├── keyboard_report_util.cpp
│ │ ├── keyboard_report_util.hpp
│ │ ├── keymap.c
│ │ ├── main.cpp
│ │ ├── matrix.c
│ │ ├── mouse_report_util.cpp
│ │ ├── mouse_report_util.hpp
│ │ ├── pointing_device_driver.c
│ │ ├── test_common.h
│ │ ├── test_common.hpp
│ │ ├── test_driver.cpp
│ │ ├── test_driver.hpp
│ │ ├── test_fixture.cpp
│ │ ├── test_fixture.hpp
│ │ ├── test_keymap_key.cpp
│ │ ├── test_keymap_key.hpp
│ │ ├── test_logger.cpp
│ │ ├── test_logger.hpp
│ │ ├── test_matrix.h
│ │ └── test_pointing_device_driver.h
│ ├── tri_layer/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_tri_layer.cpp
│ └── unicode/
│ ├── config.h
│ ├── test.mk
│ ├── test_unicode.cpp
│ ├── unicode_basic/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_unicode_basic.cpp
│ ├── unicode_map/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_unicode_map.cpp
│ └── unicode_ucis/
│ ├── config.h
│ ├── test.mk
│ └── test_unicode_ucis.cpp
├── tmk_core/
│ ├── protocol/
│ │ ├── chibios/
│ │ │ ├── README.md
│ │ │ ├── chibios.c
│ │ │ ├── chibios.mk
│ │ │ ├── init_hooks.h
│ │ │ ├── lufa_utils/
│ │ │ │ └── LUFA/
│ │ │ │ └── Drivers/
│ │ │ │ └── USB/
│ │ │ │ └── USB.h
│ │ │ ├── usb_driver.c
│ │ │ ├── usb_driver.h
│ │ │ ├── usb_endpoints.c
│ │ │ ├── usb_endpoints.h
│ │ │ ├── usb_main.c
│ │ │ ├── usb_main.h
│ │ │ ├── usb_report_handling.c
│ │ │ ├── usb_report_handling.h
│ │ │ └── usb_util.c
│ │ ├── host.c
│ │ ├── host.h
│ │ ├── host_driver.h
│ │ ├── lufa/
│ │ │ ├── lufa.c
│ │ │ ├── lufa.h
│ │ │ ├── lufa.mk
│ │ │ └── usb_util.c
│ │ ├── report.c
│ │ ├── report.h
│ │ ├── usb_descriptor.c
│ │ ├── usb_descriptor.h
│ │ ├── usb_descriptor_common.h
│ │ ├── usb_device_state.c
│ │ ├── usb_device_state.h
│ │ ├── usb_hid/
│ │ │ ├── README
│ │ │ ├── override_Serial.cpp
│ │ │ ├── override_wiring.c
│ │ │ ├── parser.cpp
│ │ │ ├── parser.h
│ │ │ ├── usb_hid.h
│ │ │ └── usb_hid.mk
│ │ ├── usb_types.h
│ │ ├── usb_util.c
│ │ ├── usb_util.h
│ │ └── vusb/
│ │ ├── protocol.c
│ │ ├── usb_util.c
│ │ ├── usbconfig.h
│ │ ├── vusb.c
│ │ ├── vusb.h
│ │ └── vusb.mk
│ ├── protocol.mk
│ └── readme.md
└── util/
├── audio_generate_dac_lut.py
├── chibios_conf_updater.sh
├── ci/
│ ├── discord-results.py
│ ├── firmware_list_generator.py
│ ├── generate_failure_markdown.sh
│ ├── index_generator.py
│ ├── requirements.txt
│ └── templates/
│ └── index.html.j2
├── docker_build.sh
├── docker_cmd.sh
├── drivers.txt
├── env-bootstrap.sh
├── install/
│ ├── arch.sh
│ ├── debian.sh
│ ├── fedora.sh
│ ├── freebsd.sh
│ ├── gentoo.sh
│ ├── linux_shared.sh
│ ├── macos.sh
│ ├── msys2.sh
│ ├── slackware.sh
│ ├── solus.sh
│ └── void.sh
├── list-moved-keyboards.sh
├── polling_rate.py
├── qmk_install.sh
├── qmk_tab_complete.sh
├── regen.sh
├── rules_cleaner.sh
├── sample_parser.py
├── size_regression.sh
├── stm32eeprom_parser.py
├── udev/
│ └── 50-qmk.rules
├── uf2conv.py
├── uf2families.json
├── update_chibios_mirror.sh
├── usb_detach/
│ ├── Makefile
│ ├── readme.md
│ └── usb_detach.c
└── wavetable_parser.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
---
BasedOnStyle: Google
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: 'true'
AlignConsecutiveDeclarations: 'true'
AlignOperands: 'true'
AllowAllParametersOfDeclarationOnNextLine: 'false'
AllowShortCaseLabelsOnASingleLine: 'false'
AllowShortFunctionsOnASingleLine: Empty
AllowShortLoopsOnASingleLine: 'false'
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: 'false'
BinPackArguments: 'true'
BinPackParameters: 'true'
ColumnLimit: '1000'
IndentCaseLabels: 'true'
IndentPPDirectives: AfterHash
IndentWidth: '4'
MaxEmptyLinesToKeep: '1'
PointerAlignment: Right
SortIncludes: 'false'
SpaceBeforeAssignmentOperators: 'true'
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: 'false'
SpacesBeforeTrailingComments: 1
TabWidth: '4'
UseTab: Never
...
================================================
FILE: .clangd
================================================
CompileFlags:
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]
Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues, -D__has_include*]
Compiler: clang
================================================
FILE: .editorconfig
================================================
# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
end_of_line = lf
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
# To match GitHub Actions formatting
[*.{yaml,yml}]
indent_size = 2
[*.md]
trim_trailing_whitespace = false
[{Makefile,*.mk}]
indent_style = tab
# Don't override anything in `lib/`...
[lib/**]
indent_style = unset
indent_size = unset
tab_width = unset
end_of_line = unset
charset = unset
spelling_language = unset
trim_trailing_whitespace = unset
insert_final_newline = unset
# ...except QMK's `lib/python`.
[{*.py,lib/python/**.py}]
end_of_line = lf
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 200
================================================
FILE: .gitattributes
================================================
# auto for anything unspecified
* text=auto
# sources
*.c text eol=lf
*.cc text eol=lf
*.cxx text eol=lf
*.cpp text eol=lf
*.c++ text eol=lf
*.hpp text eol=lf
*.h text eol=lf
*.h++ text eol=lf
*.hh text eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
*.coffee text eol=lf
*.css text eol=lf
*.htm text eol=lf
*.html text eol=lf
*.inc text eol=lf
*.ini text eol=crlf
*.js text eol=lf
*.jsx text eol=lf
*.json text eol=lf
*.less text eol=lf
*.php text eol=lf
*.pl text eol=lf
*.py text eol=lf
*.rb text eol=lf
*.sass text eol=lf
*.scm text eol=lf
*.scss text eol=lf
*.sh text eol=lf
*.sql text eol=lf
*.styl text eol=lf
*.ts text eol=lf
*.xml text eol=lf
*.xhtml text eol=lf
# make files (need to always use lf for compatibility with Windows 10 bash)
Makefile eol=lf
*.mk eol=lf
# make files (need to always use lf for compatibility with Windows 10 bash)
*.sh eol=lf
# documentation
*.markdown text eol=lf
*.md text eol=lf
*.mdwn text eol=lf
*.mdown text eol=lf
*.mkd text eol=lf
*.mkdn text eol=lf
*.mdtxt text eol=lf
*.mdtext text eol=lf
*.txt text eol=lf
AUTHORS text eol=lf
CHANGELOG text eol=lf
CHANGES text eol=lf
CONTRIBUTING text eol=lf
COPYING text eol=lf
INSTALL text eol=lf
license text eol=lf
LICENSE text eol=lf
NEWS text eol=lf
readme text eol=lf
*README* text eol=lf
TODO text eol=lf
GRAPHICS
*.ai binary
*.bmp binary
*.eps binary
*.gif binary
*.ico binary
*.jng binary
*.jp2 binary
*.jpg binary
*.jpeg binary
*.jpx binary
*.jxr binary
*.pdf binary
*.png binary
*.psb binary
*.psd binary
*.svg text eol=lf
*.svgz binary
*.tif binary
*.tiff binary
*.wbmp binary
*.webp binary
# hex files
*.hex binary
*.eep binary
nix/sources.nix linguist-generated=true
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug report
description: Create a report to help us improve QMK Firmware.
title: "[Bug] "
labels: ["bug", "help wanted"]
body:
- type: markdown
attributes:
value: |
Provide a general summary of the bug in the title above.
- type: textarea
attributes:
label: Describe the Bug
description: A clear and concise description of what the bug is.
- type: input
attributes:
label: Keyboard Used
description: The name of the keyboard from the `make` or `qmk compile`/`qmk flash` commands, eg. `planck/rev6`.
- type: input
attributes:
label: Link to product page (if applicable)
- type: input
attributes:
label: Operating System
- type: textarea
attributes:
label: qmk doctor Output
description: Output from running the `qmk doctor` command.
render: text
- type: checkboxes
attributes:
label: Is AutoHotKey / Karabiner installed
options:
- label: AutoHotKey (Windows)
- label: Karabiner (macOS)
- type: input
attributes:
label: Other keyboard-related software installed
- type: textarea
attributes:
label: Additional Context
description: Add any other relevant information about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: QMK Discord
url: https://discord.gg/qmk
about: Ask questions, discuss issues and features. Chill.
- name: OLKB Subreddit
url: https://www.reddit.com/r/olkb
about: All things OLKB and QMK.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature request
description: Suggest a new feature or changes to existing features.
title: "[Feature Request] "
labels: ["enhancement", "help wanted"]
body:
- type: markdown
attributes:
value: |
Provide a general summary of the changes you want in the title above.
Please refrain from asking maintainers to add support for specific keyboards -- it is unlikely they will have hardware available, and will not be able to help.
Your best bet is to take the initiative, add support, then submit a PR yourself.
- type: checkboxes
attributes:
label: Feature Request Type
options:
- label: Core functionality
- label: Add-on hardware support (eg. audio, RGB, OLED screen, etc.)
- label: Alteration (enhancement/optimization) of existing feature(s)
- label: New behavior
- type: textarea
attributes:
label: Description
description: A few sentences describing what it is that you'd like to see in QMK. Additional information (such as links to spec sheets, licensing info, other related issues or PRs, etc) would be helpful.
================================================
FILE: .github/ISSUE_TEMPLATE/other_issues.yml
================================================
name: Other issues
description: Anything else that doesn't fall into the above categories.
labels: ["help wanted", "question"]
body:
- type: markdown
attributes:
value: |
Provide a general summary of the changes you want in the title above.
- type: markdown
attributes:
value: |
Please check [https://docs.qmk.fm/#/support](https://docs.qmk.fm/#/support) for additional resources first. If that doesn't answer your question, choose the bug report template instead, as that may be more appropriate.
Please refrain from asking maintainers to add support for specific keyboards -- it is unlikely they will have hardware available, and will not be able to help.
Your best bet is to take the initiative, add support, then submit a PR yourself.
- type: textarea
attributes:
label: Issue Description
description: Describe your issue in as much detail as possible.
================================================
FILE: .github/ISSUE_TEMPLATE/zzz_blank.md
================================================
---
name: Blank issue
about: If you're 100% sure that you don't need one of the other issue templates, use
this one instead.
title: ''
labels: help wanted, question
assignees: ''
---
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--- Provide a general summary of your changes in the title above. -->
<!--- Anything on lines wrapped in comments like these will not show up in the final text. -->
## Description
<!--- Describe your changes in detail here. -->
## Types of Changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply. -->
- [ ] Core
- [ ] Bugfix
- [ ] New feature
- [ ] Enhancement/optimization
- [ ] Keyboard (addition or update)
- [ ] Keymap/layout (addition or update)
- [ ] Documentation
## Issues Fixed or Closed by This PR
*
## Checklist
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
- [ ] My code follows the code style of this project: [**C**](https://docs.qmk.fm/#/coding_conventions_c), [**Python**](https://docs.qmk.fm/#/coding_conventions_python)
- [ ] I have read the [**PR Checklist** document](https://docs.qmk.fm/#/pr_checklist) and have made the appropriate changes.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have read the [**CONTRIBUTING** document](https://docs.qmk.fm/#/contributing).
- [ ] I have added tests to cover my changes.
- [ ] I have tested the changes and verified that they work and don't break anything (as well as I can manage).
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
labels: CI
reviewers:
- "qmk/collaborators"
schedule:
interval: "daily"
================================================
FILE: .github/labeler.yml
================================================
core:
- changed-files:
- any-glob-to-any-file:
- quantum/**
- tmk_core/**
- drivers/**
- tests/**
- util/**
- platforms/**
- builddefs/*.mk
- Makefile
- '*.mk'
dependencies:
- changed-files:
- all-globs-to-any-file:
- lib/**
- '!lib/python/**'
keyboard:
- changed-files:
- all-globs-to-any-file:
- keyboards/**
- '!keyboards/**/keymaps/**'
keymap:
- changed-files:
- any-glob-to-any-file:
- users/**
- layouts/**
- keyboards/**/keymaps/**
via:
- changed-files:
- any-glob-to-any-file:
- keyboards/**/keymaps/via/*
cli:
- changed-files:
- any-glob-to-any-file:
- requirements.txt
- lib/python/**
python:
- changed-files:
- any-glob-to-any-file:
- '**/*.py'
documentation:
- changed-files:
- any-glob-to-any-file:
- docs/**
- builddefs/docsgen/**
CI:
- changed-files:
- any-glob-to-any-file:
- .github/**
dd:
- changed-files:
- any-glob-to-any-file:
- data/constants/**
- data/mappings/**
- data/schemas/**
community_module:
- changed-files:
- any-glob-to-any-file:
- modules/**
================================================
FILE: .github/workflows/build.yml
================================================
name: Build firmware
on:
push:
paths-ignore:
- '**.md'
pull_request:
paths-ignore:
- '**.md'
workflow_dispatch:
jobs:
build-firmware:
runs-on: ubuntu-latest
container: qmkfm/qmk_cli
strategy:
fail-fast: false
matrix:
keymap:
- default
- oryx
steps:
- name: Checkout QMK Firmware
uses: actions/checkout@v4
with:
fetch-depth: 1
persist-credentials: false
submodules: true
- name: Build
id: build
run: |
qmk mass-compile -f manufacturer="ZSA Technology Labs" -km ${{ matrix.keymap }} -e SKIP_GIT=1
================================================
FILE: .github/workflows/format.yml
================================================
name: PR Lint Format
permissions:
contents: read
on:
pull_request:
paths:
- 'drivers/**'
- 'lib/arm_atsam/**'
- 'lib/lib8tion/**'
- 'lib/python/**'
- 'modules/**'
- 'platforms/**'
- 'quantum/**'
- 'tests/**'
- 'tmk_core/**'
jobs:
lint:
runs-on: ubuntu-latest
container: ghcr.io/qmk/qmk_cli
steps:
- name: Disable safe.directory check
run : git config --global --add safe.directory '*'
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: |
pip3 install -r requirements-dev.txt
- name: Get changed files
id: file_changes
uses: tj-actions/changed-files@v46
with:
use_rest_api: true
- name: Run qmk formatters
shell: 'bash {0}'
run: |
echo '${{ steps.file_changes.outputs.added_files}}' '${{ steps.file_changes.outputs.modified_files}}' > ~/files_changed.txt
qmk format-c --core-only $(< ~/files_changed.txt) || true
qmk format-python $(< ~/files_changed.txt) || true
qmk format-text $(< ~/files_changed.txt) || true
- name: Fail when formatting required
run: |
git diff
for file in $(git diff --name-only); do
echo "File '${file}' Requires Formatting"
echo "::error file=${file}::Requires Formatting"
done
test -z "$(git diff --name-only)"
================================================
FILE: .github/workflows/lint.yml
================================================
name: PR Lint keyboards
permissions:
contents: read
on:
pull_request:
paths:
- 'keyboards/**'
jobs:
lint:
runs-on: ubuntu-latest
container: ghcr.io/qmk/qmk_cli
steps:
- name: Disable safe.directory check
run : git config --global --add safe.directory '*'
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: pip3 install -r requirements-dev.txt
- name: Get changed files
id: file_changes
uses: tj-actions/changed-files@v46
with:
use_rest_api: true
- name: Print info
run: |
git rev-parse --short HEAD
echo ${{ github.event.pull_request.base.sha }}
echo '${{ steps.file_changes.outputs.all_changed_files}}'
- name: Run qmk lint
if: always()
shell: 'bash {0}'
run: |
QMK_CHANGES=$(echo -e '${{ steps.file_changes.outputs.all_changed_files}}' | sed 's/ /\n/g')
QMK_KEYBOARDS=$(qmk list-keyboards)
exit_code=0
for KB in $QMK_KEYBOARDS; do
KEYBOARD_CHANGES=$(echo "$QMK_CHANGES" | grep -E '^(keyboards/'${KB}'/)')
if [[ -z "$KEYBOARD_CHANGES" ]]; then
# skip as no changes for this keyboard
continue
fi
KEYMAP_ONLY=$(echo "$KEYBOARD_CHANGES" | grep -cv /keymaps/)
if [[ $KEYMAP_ONLY -gt 0 ]]; then
echo "linting ${KB}"
qmk lint --keyboard ${KB} && qmk info -l --keyboard ${KB}
exit_code=$(($exit_code + $?))
fi
done
qmk format-text ${{ steps.file_changes.outputs.all_changed_files}} || true
for file in ${{ steps.file_changes.outputs.all_changed_files}}; do
if [[ -f $file ]]; then
if ! git diff --quiet $file; then
echo "File '${file}' Requires Formatting"
echo "::error file=${file}::Requires Formatting"
exit_code=$(($exit_code + 1))
fi
fi
done
if [[ $exit_code -gt 255 ]]; then
exit 255
fi
exit $exit_code
- name: Verify keyboard aliases
if: always()
shell: 'bash {0}'
run: |
git reset --hard
git clean -xfd
qmk ci-validate-aliases
================================================
FILE: .github/workflows/regen.yml
================================================
name: PR Regenerate Files
permissions:
contents: read
on:
pull_request:
paths:
- 'data/constants/**'
- 'lib/python/**'
jobs:
regen:
runs-on: ubuntu-latest
container: ghcr.io/qmk/qmk_cli
steps:
- name: Disable safe.directory check
run : git config --global --add safe.directory '*'
- uses: actions/checkout@v4
- name: Run qmk generators
run: |
util/regen.sh
git diff
- name: Fail when regeneration required
run: |
git diff
for file in $(git diff --name-only); do
echo "File '${file}' Requires Regeneration"
echo "::error file=${file}::Requires Regeneration"
done
test -z "$(git diff --name-only)"
================================================
FILE: .github/workflows/unit_test.yml
================================================
name: Unit Tests
permissions:
contents: read
on:
push:
branches:
- firmware[0-9]+
pull_request:
paths:
- 'builddefs/**'
- 'quantum/**'
- 'platforms/**'
- 'tmk_core/**'
- 'tests/**'
- '*.mk'
- 'Makefile'
- '.github/workflows/unit_test.yml'
jobs:
test:
runs-on: ubuntu-latest
container: ghcr.io/qmk/qmk_cli
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install dependencies
run: pip3 install -r requirements-dev.txt
- name: Run tests
run: qmk test-c
================================================
FILE: .gitignore
================================================
# Junk files
*.bak
*.swp
*~
.DS_Store
._*
# Merge files
*.orig
*.rej
# Build artifacts
.clang_complete
.build/
*.elf
*.log
*.lss
*.lst
*.map
*.o
*.a
*.so
*.dylib
*.dll
*.la
*.stackdump
*.sym
index.html
firmware_list.json
# QMK-specific
api_data/v1
quantum/version.h
*.bin
*.eep
*.hex
*.qmk
*.uf2
# DD config at wrong location
/keyboards/**/keymaps/*/info.json
/keyboards/**/keymaps/*/keyboard.json
# Old-style QMK Makefiles
/keyboards/**/Makefile
# kbfirmware....
/keyboards/**/kb.h
/keyboards/**/kb.c
# Eclipse/PyCharm/Other IDE Settings
*.iml
.browse.VC.db*
.cproject
.idea
.idea/
.project
.settings/
# ?
.dep
.history/
build/
cmake-build-debug
CMakeLists.txt
*.pdf
# Let these ones be user specific, since we have so many different configurations
*.code-workspace
.stfolder
.tags
.vscode/c_cpp_properties.json
.vscode/ipch/
.vscode/last.sql
.vscode/launch.json
.vscode/tasks.json
.vscode/temp.sql
tags
# Ignore image/font files
*.bmp
*.wbmp
*.gif
*.jpg
*.jpeg
*.png
*.apng
*.mng
*.svg
*.webp
*.webm
*.avi
*.mp4
*.mpeg
*.ttf
*.otf
# Things Travis sees
/.vs
id_rsa_*
secrets.tar
# Python things
__pycache__
.python-version
.venv
# Prerequisites for updating ChibiOS
/util/fmpp*
# Allow to exist but don't include it in the repo
user_song_list.h
# clangd
compile_commands.json
.clangd/
.cache/
# VIA(L) files that don't belong in QMK repo
via*.json
/keyboards/**/keymaps/via/*
/keyboards/**/keymaps/vial/*
# ZSA Specific ignores
/docs/**
/users/**
/layouts/community/**
/keyboards/**
!/keyboards/zsa/
!/keyboards/zsa/**
/keyboards/zsa/**/keymaps/**
!/keyboards/zsa/**/keymaps/default
!/keyboards/zsa/**/keymaps/default/**
!/keyboards/zsa/**/keymaps/oryx
!/keyboards/zsa/**/keymaps/oryx/**
================================================
FILE: .gitmodules
================================================
[submodule "lib/chibios"]
path = lib/chibios
url = https://github.com/qmk/ChibiOS
branch = master
[submodule "lib/chibios-contrib"]
path = lib/chibios-contrib
url = https://github.com/qmk/ChibiOS-Contrib
branch = master
[submodule "lib/googletest"]
path = lib/googletest
url = https://github.com/qmk/googletest
[submodule "lib/lufa"]
path = lib/lufa
url = https://github.com/qmk/lufa
[submodule "lib/vusb"]
path = lib/vusb
url = https://github.com/qmk/v-usb
[submodule "lib/printf"]
path = lib/printf
url = https://github.com/qmk/printf
[submodule "lib/pico-sdk"]
path = lib/pico-sdk
url = https://github.com/qmk/pico-sdk.git
[submodule "lib/lvgl"]
path = lib/lvgl
url = https://github.com/qmk/lvgl.git
branch = release/v8.2
[submodule "modules/zsa"]
path = modules/zsa
url = https://github.com/zsa/qmk_modules.git
================================================
FILE: Doxyfile
================================================
# Doxyfile 1.8.14
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for qmk_firmware (github.com/qmk/qmk_firmware)
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
#
# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
# TAG = value [value, ...]
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "QMK Firmware"
PROJECT_NUMBER = https://github.com/qmk/qmk_firmware
PROJECT_BRIEF = "Keyboard controller firmware for Atmel AVR and ARM USB families"
OUTPUT_DIRECTORY = .build/docs/static/doxygen
ALLOW_UNICODE_NAMES = NO
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 4
ALIASES =
TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
EXTENSION_MAPPING =
MARKDOWN_SUPPORT = YES
TOC_INCLUDE_HEADINGS = 2
AUTOLINK_SUPPORT = YES
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = NO
GROUP_NESTED_COMPOUNDS = NO
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = NO
EXTRACT_PRIVATE = NO
EXTRACT_PACKAGE = NO
EXTRACT_STATIC = NO
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = NO
HIDE_SCOPE_NAMES = YES
HIDE_COMPOUND_REFERENCE= NO
SHOW_INCLUDE_FILES = YES
SHOW_GROUPED_MEMB_INC = NO
FORCE_LOCAL_INCLUDES = NO
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_MEMBERS_CTORS_1ST = NO
SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
STRICT_PROTO_MATCHING = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_FILES = YES
SHOW_NAMESPACES = YES
FILE_VERSION_FILTER =
LAYOUT_FILE =
CITE_BIB_FILES =
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = tmk_core quantum drivers
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.cc \
*.cxx \
*.cpp \
*.c++ \
*.h \
*.hh \
*.hxx \
*.hpp \
*.h++
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXCLUDE_SYMBOLS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = NO
REFERENCES_LINK_SOURCE = YES
SOURCE_TOOLTIPS = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = YES
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to disabled outputs
#---------------------------------------------------------------------------
GENERATE_HTML = NO
GENERATE_LATEX = NO
GENERATE_RTF = NO
GENERATE_MAN = NO
GENERATE_DOCBOOK = NO
GENERATE_AUTOGEN_DEF = NO
GENERATE_PERLMOD = NO
#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = YES
XML_OUTPUT = xml
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED = __DOXYGEN__ PROGMEM
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE =
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
MSCGEN_PATH =
DIA_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
DOT_NUM_THREADS = 0
DOT_FONTNAME = Helvetica
DOT_FONTSIZE = 10
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
UML_LIMIT_NUM_FIELDS = 10
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
INTERACTIVE_SVG = NO
DOT_PATH =
DOTFILE_DIRS =
MSCFILE_DIRS =
DIAFILE_DIRS =
PLANTUML_JAR_PATH =
PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
================================================
FILE: Makefile
================================================
ifndef VERBOSE
.SILENT:
endif
# Never run this makefile in parallel, as it could screw things up
# It won't affect the submakes, so you still get the speedup from specifying -jx
.NOTPARALLEL:
# Allow the silent with lower caps to work the same way as upper caps
ifdef silent
SILENT = $(silent)
endif
ifdef SILENT
SUB_IS_SILENT := $(SILENT)
endif
# We need to make sure that silent is always turned off at the top level
# Otherwise the [OK], [ERROR] and [WARN] messages won't be displayed correctly
override SILENT := false
ifeq ($(shell git rev-parse --is-inside-work-tree 2>/dev/null),)
export SKIP_GIT := yes
export NOT_REPO := yes
endif
ifdef SKIP_VERSION
export SKIP_GIT := yes
endif
ifndef SUB_IS_SILENT
ifndef SKIP_GIT
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
endif
ifneq ($(QMK_VERSION),)
$(info QMK Firmware $(QMK_VERSION))
endif
endif
# Try to determine userspace from qmk config, if set.
ifeq ($(QMK_USERSPACE),)
QMK_USERSPACE = $(shell qmk config -ro user.overlay_dir | cut -d= -f2 | sed -e 's@^None$$@@g')
endif
# Determine which qmk cli to use
QMK_BIN := qmk
# avoid 'Entering|Leaving directory' messages
MAKEFLAGS += --no-print-directory
ON_ERROR := error_occurred=1
BREAK_ON_ERRORS = no
ROOT_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
ifeq ($(ROOT_DIR),)
ROOT_DIR := .
endif
include paths.mk
include $(BUILDDEFS_PATH)/support.mk
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
ERROR_FILE := $(BUILD_DIR)/error_occurred
.DEFAULT_GOAL := all:all
# Compare the start of the RULE variable with the first argument($1)
# If the rules equals $1 or starts with $1:, RULE_FOUND is set to true
# and $1 is removed from the RULE variable
# Otherwise the RULE_FOUND variable is set to false, and RULE left as it was
# The function is a bit tricky, since there's no built in $(startswith) function
define COMPARE_AND_REMOVE_FROM_RULE_HELPER
ifeq ($1,$$(RULE))
RULE:=
RULE_FOUND := true
else
STARTCOLON_REMOVED=$$(subst START$1:,,START$$(RULE))
ifneq ($$(STARTCOLON_REMOVED),START$$(RULE))
RULE_FOUND := true
RULE := $$(STARTCOLON_REMOVED)
else
RULE_FOUND := false
endif
endif
endef
# This makes it easier to call COMPARE_AND_REMOVE_FROM_RULE, since it makes it behave like
# a function that returns the value
COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND)
# Try to find a match for the start of the rule to be checked
# $1 The list to be checked
# If a match is found, then RULE_FOUND is set to true
# and MATCHED_ITEM to the item that was matched
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
# Split on ":", padding with empty strings to avoid indexing issues
TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE))
TOKENr:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[1])" $$(RULE))
FOUNDx:=$$(shell echo $1 | tr " " "\n" | grep -Fx $$(TOKEN1))
ifneq ($$(FOUNDx),)
RULE := $$(TOKENr)
RULE_FOUND := true
MATCHED_ITEM := $$(TOKEN1)
else
RULE_FOUND := false
MATCHED_ITEM :=
endif
endef
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
# As TRY_TO_MATCH_RULE_FROM_LIST_HELPER, but with additional
# resolution of DEFAULT_FOLDER and keyboard_aliases.hjson for provided rule
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB
# Split on ":", padding with empty strings to avoid indexing issues
TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE))
TOKENr:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[1])" $$(RULE))
TOKEN1:=$$(shell $(QMK_BIN) resolve-alias --allow-unknown $$(TOKEN1))
FOUNDx:=$$(shell echo $1 | tr " " "\n" | grep -Fx $$(TOKEN1))
ifneq ($$(FOUNDx),)
RULE := $$(TOKENr)
RULE_FOUND := true
MATCHED_ITEM := $$(TOKEN1)
else
RULE_FOUND := false
MATCHED_ITEM :=
endif
endef
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST_KB
TRY_TO_MATCH_RULE_FROM_LIST_KB = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB,$1))$(RULE_FOUND)
define ALL_IN_LIST_LOOP
OLD_RULE$1 := $$(RULE)
$$(eval $$(call $1,$$(ITEM$1)))
RULE := $$(OLD_RULE$1)
endef
define PARSE_ALL_IN_LIST
$$(foreach ITEM$1,$2,$$(eval $$(call ALL_IN_LIST_LOOP,$1)))
endef
# The entry point for rule parsing
# parses a rule in the format <keyboard>:<keymap>:<target>
# but this particular function only deals with the first <keyboard> part
define PARSE_RULE
RULE := $1
COMMANDS :=
# If the rule starts with all, then continue the parsing from
# PARSE_ALL_KEYBOARDS
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,all),true)
KEYBOARD_RULE=all
$$(eval $$(call PARSE_ALL_KEYBOARDS))
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,test),true)
$$(eval $$(call PARSE_TEST))
# If the rule starts with the name of a known keyboard, then continue
# the parsing from PARSE_KEYBOARD
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST_KB,$$(shell $(QMK_BIN) list-keyboards)),true)
KEYBOARD_RULE=$$(MATCHED_ITEM)
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
else
$$(info make: *** No rule to make target '$1'. Stop.)
$$(info |)
$$(info | QMK's make format is:)
$$(info | make keyboard_folder:keymap_folder[:target])
$$(info |)
$$(info | Where `keyboard_folder` is the path to the keyboard relative to)
$$(info | `qmk_firmware/keyboards/`, and `keymap_folder` is the name of the)
$$(info | keymap folder under that board's `keymaps/` directory.)
$$(info |)
$$(info | Examples:)
$$(info | keyboards/dz60, keyboards/dz60/keymaps/default)
$$(info | -> make dz60:default)
$$(info | -> qmk compile -kb dz60 -km default)
$$(info | keyboards/planck/rev6, keyboards/planck/keymaps/default)
$$(info | -> make planck/rev6:default:flash)
$$(info | -> qmk flash -kb planck/rev6 -km default)
$$(info |)
endif
endef
# $1 = Keyboard
# Parses a rule in the format <keymap>:<target>
# the keyboard is already known when entering this function
define PARSE_KEYBOARD
# If we want to compile the default subproject, then we need to
# include the correct makefile to determine the actual name of it
CURRENT_KB := $1
# 5/4/3/2/1
KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB)
KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1)))
KEYBOARD_FOLDER_PATH_3 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_2)))
KEYBOARD_FOLDER_PATH_4 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_3)))
KEYBOARD_FOLDER_PATH_5 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_4)))
KEYMAPS :=
# get a list of all keymaps
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_1)/keymaps/*/.)))
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_2)/keymaps/*/.)))
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_3)/keymaps/*/.)))
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_4)/keymaps/*/.)))
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_5)/keymaps/*/.)))
ifneq ($(QMK_USERSPACE),)
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_1)/keymaps/*/.)))
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_2)/keymaps/*/.)))
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_3)/keymaps/*/.)))
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_4)/keymaps/*/.)))
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_5)/keymaps/*/.)))
endif
KEYBOARD_LAYOUTS := $(shell $(QMK_BIN) list-layouts --keyboard $1)
LAYOUT_KEYMAPS :=
$$(foreach LAYOUT,$$(KEYBOARD_LAYOUTS),$$(eval LAYOUT_KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/layouts/*/$$(LAYOUT)/*/.)))))
ifneq ($(QMK_USERSPACE),)
$$(foreach LAYOUT,$$(KEYBOARD_LAYOUTS),$$(eval LAYOUT_KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/layouts/$$(LAYOUT)/*/.)))))
endif
KEYMAPS := $$(sort $$(KEYMAPS) $$(LAYOUT_KEYMAPS))
# if the rule after removing the start of it is empty (we haven't specified a kemap or target)
# compile all the keymaps
ifeq ($$(RULE),)
$$(eval $$(call PARSE_ALL_KEYMAPS))
# The same if all was specified
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,all),true)
$$(eval $$(call PARSE_ALL_KEYMAPS))
# List all keymaps for the given keyboard
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,list-keymaps),true)
$$(eval $$(call LIST_ALL_KEYMAPS))
# Try to match the specified keyamp with the list of known keymaps
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYMAPS)),true)
$$(eval $$(call PARSE_KEYMAP,$$(MATCHED_ITEM)))
# Otherwise try to match the keymap from the current folder, or arguments to the make command
else ifneq ($$(KEYMAP),)
$$(eval $$(call PARSE_KEYMAP,$$(KEYMAP)))
# Otherwise if we are running make all:<user> just skip
else ifeq ($$(KEYBOARD_RULE),all)
# $$(info Skipping: No user keymap for $$(CURRENT_KB))
# Otherwise, make all keymaps, again this is consistent with how it works without
# any arguments
else
$$(eval $$(call PARSE_ALL_KEYMAPS))
endif
endef
# if we are going to compile all keyboards, match the rest of the rule
# for each of them
define PARSE_ALL_KEYBOARDS
$$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(shell $(QMK_BIN) list-keyboards --no-resolve-defaults)))
endef
# Prints a list of all known keymaps for the given keyboard
define LIST_ALL_KEYMAPS
COMMAND_true_LIST_KEYMAPS := \
printf "$$(KEYMAPS)\n";
COMMAND_false_LIST_KEYMAPS := \
printf "$$(MSG_AVAILABLE_KEYMAPS)\n"; \
printf "$$(KEYMAPS)\n";
COMMANDS += LIST_KEYMAPS
endef
# $1 Keymap
# This is the meat of compiling a keyboard, when entering this, everything is known
# keyboard, subproject, and keymap
# Note that we are not directly calling the command here, but instead building a list,
# which will later be processed
define PARSE_KEYMAP
CURRENT_KM = $1
# The rest of the rule is the target
# Remove the leading ":" from the target, as it acts as a separator
MAKE_TARGET := $$(patsubst :%,%,$$(RULE))
# We need to generate an unique identifier to append to the COMMANDS list
CURRENT_KB_UNDER := $$(subst /,_,$$(CURRENT_KB))
COMMAND := COMMAND_KEYBOARD_$$(CURRENT_KB_UNDER)_KEYMAP_$$(CURRENT_KM)
# If we are compiling a keyboard without a subproject, we want to display just the name
# of the keyboard, otherwise keyboard/subproject
KB_SP := $$(CURRENT_KB)
# Format it in bold
KB_SP := $(BOLD)$$(KB_SP)$(NO_COLOR)
# Specify the variables that we are passing forward to submake
MAKE_VARS := KEYBOARD=$$(CURRENT_KB) KEYMAP=$$(CURRENT_KM) QMK_BIN=$$(QMK_BIN)
# And the first part of the make command
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f $(BUILDDEFS_PATH)/build_keyboard.mk $$(MAKE_TARGET)
# The message to display
MAKE_MSG := $$(MSG_MAKE_KB)
# We run the command differently, depending on if we want more output or not
# The true version for silent output and the false version otherwise
$$(eval $$(call BUILD))
endef
define BUILD
MAKE_VARS += VERBOSE=$(VERBOSE) COLOR=$(COLOR)
COMMANDS += $$(COMMAND)
COMMAND_true_$$(COMMAND) := \
printf "$$(MAKE_MSG)" | \
$$(MAKE_MSG_FORMAT); \
LOG=$$$$($$(MAKE_CMD) $$(MAKE_VARS) SILENT=true 2>&1) ; \
if [ $$$$? -gt 0 ]; \
then $$(PRINT_ERROR_PLAIN); \
elif [ "$$$$LOG" = "skipped" ] ; \
then $$(PRINT_SKIPPED_PLAIN); \
elif [ "$$$$LOG" != "" ] ; \
then $$(PRINT_WARNING_PLAIN); \
else \
$$(PRINT_OK); \
fi;
COMMAND_false_$$(COMMAND) := \
printf "$$(MAKE_MSG)\n\n"; \
$$(MAKE_CMD) $$(MAKE_VARS) SILENT=false; \
if [ $$$$? -gt 0 ]; \
then error_occurred=1; \
fi;
endef
# Just parse all the keymaps for a specific keyboard
define PARSE_ALL_KEYMAPS
$$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYMAP,$$(KEYMAPS)))
endef
define BUILD_TEST
TEST_PATH := $1
TEST_NAME := $$(notdir $$(TEST_PATH))
TEST_FULL_NAME := $$(subst /,_,$$(patsubst $$(ROOT_DIR)tests/%,%,$$(TEST_PATH)))
MAKE_TARGET := $2
COMMAND := $1
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f $(BUILDDEFS_PATH)/build_test.mk $$(MAKE_TARGET)
MAKE_VARS := TEST=$$(TEST_NAME) TEST_OUTPUT=$$(TEST_FULL_NAME) TEST_PATH=$$(TEST_PATH) FULL_TESTS="$$(FULL_TESTS)"
MAKE_MSG := $$(MSG_MAKE_TEST)
$$(eval $$(call BUILD))
ifneq ($$(MAKE_TARGET),clean)
TEST_EXECUTABLE := $$(TEST_OUTPUT_DIR)/$$(TEST_FULL_NAME).elf
TESTS += $$(TEST_FULL_NAME)
TEST_MSG := $$(MSG_TEST)
$$(TEST_FULL_NAME)_COMMAND := \
printf "$$(TEST_MSG)\n"; \
$$(TEST_EXECUTABLE); \
if [ $$$$? -gt 0 ]; \
then error_occurred=1; \
fi; \
printf "\n";
endif
endef
define LIST_TEST
include $(BUILDDEFS_PATH)/testlist.mk
FOUND_TESTS := $$(patsubst ./tests/%,%,$$(TEST_LIST))
$$(info $$(FOUND_TESTS))
endef
define PARSE_TEST
TESTS :=
TEST_NAME := $$(firstword $$(subst :, ,$$(RULE)))
TEST_TARGET := $$(subst $$(TEST_NAME),,$$(subst $$(TEST_NAME):,,$$(RULE)))
include $(BUILDDEFS_PATH)/testlist.mk
ifeq ($$(TEST_NAME),all)
MATCHED_TESTS := $$(TEST_LIST)
else
MATCHED_TESTS := $$(foreach TEST, $$(TEST_LIST),$$(if $$(findstring x$$(TEST_NAME)x, x$$(patsubst ./tests/%,%,$$(TEST)x)), $$(TEST),))
endif
$$(foreach TEST,$$(MATCHED_TESTS),$$(eval $$(call BUILD_TEST,$$(TEST),$$(TEST_TARGET))))
endef
# Set the silent mode depending on if we are trying to compile multiple keyboards or not
# By default it's on in that case, but it can be overridden by specifying silent=false
# from the command line
define SET_SILENT_MODE
ifdef SUB_IS_SILENT
SILENT_MODE := $(SUB_IS_SILENT)
else ifeq ($$(words $$(COMMANDS)),1)
SILENT_MODE := false
else
SILENT_MODE := true
endif
endef
include $(BUILDDEFS_PATH)/message.mk
ifeq ($(strip $(BREAK_ON_ERRORS)), yes)
HANDLE_ERROR = exit 1
else
HANDLE_ERROR = echo $$error_occurred > $(ERROR_FILE)
endif
# The empty line is important here, as it will force a new shell to be created for each command
# Otherwise the command line will become too long with a lot of keyboards and keymaps
define RUN_COMMAND
+error_occurred=0;\
$(COMMAND_$(SILENT_MODE)_$(COMMAND))\
if [ $$error_occurred -gt 0 ]; then $(HANDLE_ERROR); fi;
endef
define RUN_TEST
+error_occurred=0;\
$($(TEST)_COMMAND)\
if [ $$error_occurred -gt 0 ]; then $(HANDLE_ERROR); fi;
endef
# Catch everything and parse the command line ourselves.
.PHONY: %
%:
# Ensure that $(QMK_BIN) works.
if ! $(QMK_BIN) hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; exit 1; fi
ifdef NOT_REPO
printf "$(MSG_NOT_REPO)"
endif
ifndef SKIP_GIT
$(QMK_BIN) git-submodule --sync
# Check if the submodules are dirty, and display a warning if they are
if ! $(QMK_BIN) git-submodule --check 1> /dev/null 2>&1; then printf "$(MSG_SUBMODULE_DIRTY)"; fi
endif
rm -f $(ERROR_FILE) > /dev/null 2>&1
$(eval $(call PARSE_RULE,$@))
$(eval $(call SET_SILENT_MODE))
# Run all the commands in the same shell, notice the + at the first line
# it has to be there to allow parallel execution of the submake
# This always tries to compile everything, even if error occurs in the middle
# But we return the error code at the end, to trigger travis failures
# The sort at this point is to remove duplicates
$(foreach COMMAND,$(sort $(COMMANDS)),$(RUN_COMMAND))
if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
$(foreach TEST,$(sort $(TESTS)),$(RUN_TEST))
if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
lib/%:
git submodule sync $?
git submodule update --init $?
.PHONY: git-submodule
git-submodule:
$(QMK_BIN) git-submodule
.PHONY: git-submodules
git-submodules: git-submodule
.PHONY: list-keyboards
list-keyboards:
$(QMK_BIN) list-keyboards --no-resolve-defaults | tr '\n' ' '
.PHONY: list-tests
list-tests:
$(eval $(call LIST_TEST))
.PHONY: generate-keyboards-file
generate-keyboards-file:
$(QMK_BIN) list-keyboards --no-resolve-defaults
.PHONY: clean
clean:
echo -n 'Deleting .build/ ... '
rm -rf $(BUILD_DIR)
echo 'done.'
.PHONY: distclean distclean_qmk
distclean: distclean_qmk
distclean_qmk: clean
echo -n 'Deleting *.bin, *.hex, and *.uf2 ... '
rm -f *.bin *.hex *.uf2
echo 'done.'
ifneq ($(QMK_USERSPACE),)
.PHONY: distclean_userspace
distclean: distclean_userspace
distclean_userspace: clean
echo -n 'Deleting userspace *.bin, *.hex, and *.uf2 ... '
rm -f $(QMK_USERSPACE)/*.bin $(QMK_USERSPACE)/*.hex $(QMK_USERSPACE)/*.uf2
echo 'done.'
endif
# Extra targets for formatting and/or pytest, running within the qmk/qmk_cli container to match GHA.
CONTAINER_PREAMBLE := export HOME="/tmp"; export PATH="/tmp/.local/bin:\$$PATH"; python3 -m pip install --upgrade pip; python3 -m pip install -r requirements-dev.txt
.PHONY: format-core
format-core:
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk format-c --core-only -a && qmk format-python -a"
.PHONY: pytest
pytest:
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk pytest"
.PHONY: format-and-pytest
format-and-pytest:
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk format-c --core-only -a && qmk format-python -a && qmk pytest"
================================================
FILE: builddefs/build_full_test.mk
================================================
# Copyright 2017 Fred Sundvik
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
$(TEST_OUTPUT)_INC := \
tests/test_common/common_config.h
$(TEST_OUTPUT)_SRC := \
$(QUANTUM_SRC) \
$(SRC) \
$(QUANTUM_PATH)/keymap_introspection.c \
tests/test_common/matrix.c \
tests/test_common/pointing_device_driver.c \
tests/test_common/test_driver.cpp \
tests/test_common/keyboard_report_util.cpp \
tests/test_common/mouse_report_util.cpp \
tests/test_common/test_fixture.cpp \
tests/test_common/test_keymap_key.cpp \
tests/test_common/test_logger.cpp \
$(patsubst $(ROOTDIR)/%,%,$(wildcard $(TEST_PATH)/*.cpp))
$(TEST_OUTPUT)_DEFS := $(OPT_DEFS) "-DKEYMAP_C=\"keymap.c\""
$(TEST_OUTPUT)_CONFIG := $(TEST_PATH)/config.h
VPATH += $(TOP_DIR)/tests/test_common
================================================
FILE: builddefs/build_json.mk
================================================
# Look for a json keymap file
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)","")
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_5)/keymap.json
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_5)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.json)","")
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_4)/keymap.json
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_4)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.json)","")
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_3)/keymap.json
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_3)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.json)","")
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_2)/keymap.json
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_2)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.json)","")
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_1)/keymap.json
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_1)
endif
ifneq ($(QMK_USERSPACE),)
ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.json)","")
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.json
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.json)","")
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.json
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.json)","")
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.json
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.json)","")
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.json
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.json)","")
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.json
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
endif
endif
================================================
FILE: builddefs/build_keyboard.mk
================================================
# Determine what keyboard we are building and setup the build environment.
#
# We support folders up to 5 levels deep below `keyboards/`. This file is
# responsible for determining which folder is being used and doing the
# corresponding environment setup.
ifndef VERBOSE
.SILENT:
endif
.DEFAULT_GOAL := all
include paths.mk
include $(BUILDDEFS_PATH)/support.mk
include $(BUILDDEFS_PATH)/message.mk
# Helper to add defines with a 'QMK_' prefix
define add_qmk_prefix_defs
ifdef $1
# Need to cater for 'STM32L4xx+'
OPT_DEFS += -DQMK_$(2)="$($1)" -DQMK_$(2)_$(shell echo $($1) | sed -e 's@+@Plus@g' -e 's@[^a-zA-Z0-9]@_@g' | tr '[:lower:]' '[:upper:]')
endif
endef
# Set the qmk cli to use
QMK_BIN ?= qmk
# Set the filename for the final firmware binary
KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD))
TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP)
ifeq ($(strip $(DUMP_CI_METADATA)),yes)
$(info CI Metadata: KEYBOARD=$(KEYBOARD))
$(info CI Metadata: KEYMAP=$(KEYMAP))
endif
# Force expansion
override TARGET := $(TARGET)
ifneq ($(FORCE_LAYOUT),)
override TARGET := $(TARGET)_$(FORCE_LAYOUT)
endif
ifneq ($(CONVERT_TO),)
override TARGET := $(TARGET)_$(CONVERT_TO)
endif
# Object files and generated keymap directory
# To put object files in current directory, use a dot (.), do NOT make
# this an empty or blank macro!
INTERMEDIATE_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
ifdef SKIP_VERSION
OPT_DEFS += -DSKIP_VERSION
endif
# Generate the version.h file
VERSION_H_FLAGS :=
ifdef SKIP_VERSION
VERSION_H_FLAGS += --skip-all
endif
ifdef SKIP_GIT
VERSION_H_FLAGS += --skip-git
endif
# Determine which subfolders exist.
KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
KEYBOARD_FOLDER_PATH_3 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_2)))
KEYBOARD_FOLDER_PATH_4 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_3)))
KEYBOARD_FOLDER_PATH_5 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_4)))
KEYBOARD_FOLDER_1 := $(notdir $(KEYBOARD_FOLDER_PATH_1))
KEYBOARD_FOLDER_2 := $(notdir $(KEYBOARD_FOLDER_PATH_2))
KEYBOARD_FOLDER_3 := $(notdir $(KEYBOARD_FOLDER_PATH_3))
KEYBOARD_FOLDER_4 := $(notdir $(KEYBOARD_FOLDER_PATH_4))
KEYBOARD_FOLDER_5 := $(notdir $(KEYBOARD_FOLDER_PATH_5))
KEYBOARD_PATHS :=
KEYBOARD_PATH_1 := keyboards/$(KEYBOARD_FOLDER_PATH_1)
KEYBOARD_PATH_2 := keyboards/$(KEYBOARD_FOLDER_PATH_2)
KEYBOARD_PATH_3 := keyboards/$(KEYBOARD_FOLDER_PATH_3)
KEYBOARD_PATH_4 := keyboards/$(KEYBOARD_FOLDER_PATH_4)
KEYBOARD_PATH_5 := keyboards/$(KEYBOARD_FOLDER_PATH_5)
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
KEYBOARD_PATHS += $(KEYBOARD_PATH_5)
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
KEYBOARD_PATHS += $(KEYBOARD_PATH_4)
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
KEYBOARD_PATHS += $(KEYBOARD_PATH_3)
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
KEYBOARD_PATHS += $(KEYBOARD_PATH_2)
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
KEYBOARD_PATHS += $(KEYBOARD_PATH_1)
endif
# Pull in rules.mk files from all our subfolders
-include $(KEYBOARD_PATH_5)/rules.mk
-include $(KEYBOARD_PATH_4)/rules.mk
-include $(KEYBOARD_PATH_3)/rules.mk
-include $(KEYBOARD_PATH_2)/rules.mk
-include $(KEYBOARD_PATH_1)/rules.mk
# Create dependencies on DD keyboard config - structure validated elsewhere
DD_CONFIG_FILES :=
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
endif
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
# Pull in rules from DD keyboard config
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_rules.mk)
include $(INFO_RULES_MK)
# Check for keymap.json first, so we can regenerate keymap.c
include $(BUILDDEFS_PATH)/build_json.mk
# Pull in keymap level rules.mk
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
# Look through the possible keymap folders until we find a matching keymap.c
ifneq ($(QMK_USERSPACE),)
ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c)","")
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/rules.mk
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c)","")
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/rules.mk
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c)","")
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/rules.mk
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c)","")
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/rules.mk
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c)","")
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/rules.mk
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
endif
endif
ifeq ($(KEYMAP_PATH),)
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
-include $(MAIN_KEYMAP_PATH_1)/rules.mk
KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
-include $(MAIN_KEYMAP_PATH_2)/rules.mk
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
-include $(MAIN_KEYMAP_PATH_3)/rules.mk
KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
-include $(MAIN_KEYMAP_PATH_4)/rules.mk
KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
-include $(MAIN_KEYMAP_PATH_5)/rules.mk
KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
else ifneq ($(LAYOUTS),)
# If we haven't found a keymap yet fall back to community layouts
include $(BUILDDEFS_PATH)/build_layout.mk
else ifeq ("$(wildcard $(KEYMAP_JSON_PATH))", "") # Not finding keymap.c is fine if we found a keymap.json
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
# this state should never be reached
endif
endif
endif
# Have we found a keymap.json?
ifneq ("$(wildcard $(KEYMAP_JSON))", "")
ifneq ("$(wildcard $(KEYMAP_C))", "")
# Allow a separately-found keymap.c next to keymap.json -- the keymap.c
# generator will include the other keymap.c in the process, if supplied.
OTHER_KEYMAP_C := $(KEYMAP_C)
OPT_DEFS += -DOTHER_KEYMAP_C=\"$(OTHER_KEYMAP_C)\"
endif
KEYMAP_PATH := $(KEYMAP_JSON_PATH)
KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c
KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h
ifeq ($(OTHER_KEYMAP_C),)
# Load the keymap-level rules.mk if exists (and we havent already loaded it for keymap.c)
-include $(KEYMAP_PATH)/rules.mk
endif
# Load any rules.mk content from keymap.json
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/rules.mk $(KEYMAP_JSON))
include $(INFO_RULES_MK)
# Add rules to generate the keymap files - indentation here is important
$(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON))
@$(BUILD_CMD)
generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/keymap.c $(INTERMEDIATE_OUTPUT)/src/keymap.h
endif
# Community modules
COMMUNITY_RULES_MK = $(shell $(QMK_BIN) generate-community-modules-rules-mk -kb $(KEYBOARD) --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/community_rules.mk $(KEYMAP_JSON))
include $(COMMUNITY_RULES_MK)
$(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/community_modules.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-community-modules-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-led-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON))
@$(BUILD_CMD)
SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc
include $(BUILDDEFS_PATH)/converters.mk
# Generate the board's version.h file.
$(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o $(INTERMEDIATE_OUTPUT)/src/version.h)
MCU_ORIG := $(MCU)
include $(wildcard $(PLATFORM_PATH)/*/mcu_selection.mk)
# PLATFORM_KEY should be detected in DD keyboard config via key 'processor' (or rules.mk 'MCU')
ifeq ($(PLATFORM_KEY),)
$(call CATASTROPHIC_ERROR,Platform not defined)
endif
PLATFORM=$(shell echo $(PLATFORM_KEY) | tr '[:lower:]' '[:upper:]')
# Find all the C source files to be compiled in subfolders.
KEYBOARD_SRC :=
KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c
KEYBOARD_C_2 := $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).c
KEYBOARD_C_3 := $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).c
KEYBOARD_C_4 := $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).c
KEYBOARD_C_5 := $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).c
ifneq ("$(wildcard $(KEYBOARD_C_5))","")
KEYBOARD_SRC += $(KEYBOARD_C_5)
endif
ifneq ("$(wildcard $(KEYBOARD_C_4))","")
KEYBOARD_SRC += $(KEYBOARD_C_4)
endif
ifneq ("$(wildcard $(KEYBOARD_C_3))","")
KEYBOARD_SRC += $(KEYBOARD_C_3)
endif
ifneq ("$(wildcard $(KEYBOARD_C_2))","")
KEYBOARD_SRC += $(KEYBOARD_C_2)
endif
ifneq ("$(wildcard $(KEYBOARD_C_1))","")
KEYBOARD_SRC += $(KEYBOARD_C_1)
endif
# Generate KEYBOARD_name_subname for all levels of the keyboard folder
KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1)))
KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2)))
KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3)))
KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4)))
KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5)))
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5)
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4)
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3)
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2)
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1)
endif
# Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so
# that the same keymap may be used on multiple keyboards.
#
# We grab the most top-level include file that we can. That file should
# use #ifdef statements to include all the necessary subfolder includes,
# as described here:
#
# https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
#
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
endif
# Find all of the config.h files and add them to our CONFIG_H define.
CONFIG_H :=
define config_h_community_module_appender
ifneq ("$(wildcard $(1)/config.h)","")
CONFIG_H += $(1)/config.h
endif
endef
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call config_h_community_module_appender,$(module))))
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
CONFIG_H += $(KEYBOARD_PATH_5)/config.h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
CONFIG_H += $(KEYBOARD_PATH_4)/config.h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
CONFIG_H += $(KEYBOARD_PATH_3)/config.h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
CONFIG_H += $(KEYBOARD_PATH_2)/config.h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
CONFIG_H += $(KEYBOARD_PATH_1)/config.h
endif
POST_CONFIG_H :=
define post_config_h_community_module_appender
ifneq ("$(wildcard $(1)/post_config.h)","")
POST_CONFIG_H += $(1)/post_config.h
endif
endef
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_config_h_community_module_appender,$(module))))
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","")
POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_config.h)","")
POST_CONFIG_H += $(KEYBOARD_PATH_2)/post_config.h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_config.h)","")
POST_CONFIG_H += $(KEYBOARD_PATH_3)/post_config.h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_config.h)","")
POST_CONFIG_H += $(KEYBOARD_PATH_4)/post_config.h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
endif
CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
$(INTERMEDIATE_OUTPUT)/src/info_config.h: $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_config.h)
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/default_keyboard.c: $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-keyboard-c --quiet --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c)
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/default_keyboard.h: $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --include $(FOUND_KEYBOARD_H) --output $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h)
@$(BUILD_CMD)
generated-files: $(INTERMEDIATE_OUTPUT)/src/info_config.h $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h
generated-files: $(INTERMEDIATE_OUTPUT)/src/info_deps.d
$(INTERMEDIATE_OUTPUT)/src/info_deps.d:
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-make-dependencies -kb $(KEYBOARD) -km $(KEYMAP) -o $(INTERMEDIATE_OUTPUT)/src/info_deps.d)
@$(BUILD_CMD)
-include $(INTERMEDIATE_OUTPUT)/src/info_deps.d
.INTERMEDIATE : generated-files
# Userspace setup and definitions
ifeq ("$(USER_NAME)","")
USER_NAME := $(KEYMAP)
endif
USER_PATH := users/$(USER_NAME)
# If we have userspace, then add it to the lookup VPATH
ifneq ($(wildcard $(QMK_USERSPACE)),)
VPATH += $(QMK_USERSPACE)
endif
# If the equivalent users directory exists in userspace, use that in preference to anything currently in the main repo
ifneq ($(wildcard $(QMK_USERSPACE)/$(USER_PATH)),)
USER_PATH := $(QMK_USERSPACE)/$(USER_PATH)
endif
# Pull in user level rules.mk
-include $(USER_PATH)/rules.mk
ifneq ("$(wildcard $(USER_PATH)/config.h)","")
CONFIG_H += $(USER_PATH)/config.h
endif
ifneq ("$(wildcard $(USER_PATH)/post_config.h)","")
POST_CONFIG_H += $(USER_PATH)/post_config.h
endif
# Disable features that a keyboard doesn't support
-include $(BUILDDEFS_PATH)/disable_features.mk
ifneq ("$(CONVERTER)","")
-include $(CONVERTER)/post_converter.mk
endif
# Pull in post_rules.mk files from all our subfolders
-include $(KEYBOARD_PATH_1)/post_rules.mk
-include $(KEYBOARD_PATH_2)/post_rules.mk
-include $(KEYBOARD_PATH_3)/post_rules.mk
-include $(KEYBOARD_PATH_4)/post_rules.mk
-include $(KEYBOARD_PATH_5)/post_rules.mk
define post_rules_mk_community_module_includer
ifneq ("$(wildcard $(1)/post_rules.mk)","")
include $(1)/post_rules.mk
endif
endef
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_rules_mk_community_module_includer,$(module))))
ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
CONFIG_H += $(KEYMAP_PATH)/config.h
endif
ifneq ("$(KEYMAP_H)","")
CONFIG_H += $(KEYMAP_H)
endif
ifeq ($(KEYMAP_C),)
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
endif
OPT_DEFS += -DKEYMAP_C=\"$(KEYMAP_C)\"
# If a keymap or userspace places their keymap array in another file instead, allow for it to be included
# !!NOTE!! -- For this to work, the source file cannot be part of $(SRC), so users should not add it via `SRC += <file>`
ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),)
OPT_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
endif
# project specific files
SRC += \
$(KEYBOARD_SRC) \
$(QUANTUM_DIR)/keymap_introspection.c \
$(QUANTUM_SRC) \
$(QUANTUM_DIR)/main.c \
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(KEYMAP_PATH)
VPATH += $(USER_PATH)
VPATH += $(KEYBOARD_PATHS)
VPATH += $(COMMON_VPATH)
VPATH += $(INTERMEDIATE_OUTPUT)/src
include $(BUILDDEFS_PATH)/common_features.mk
include $(BUILDDEFS_PATH)/generic_features.mk
include $(TMK_PATH)/protocol.mk
include $(PLATFORM_PATH)/common.mk
SRC += $(patsubst %.c,%.clib,$(LIB_SRC))
SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC))
-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/bootloader.mk
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/flash.mk
ifneq ($(strip $(PROTOCOL)),)
PROTOCOL_KEY = $(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]'))
else
PROTOCOL_KEY = $(PLATFORM_KEY)
endif
include $(TMK_PATH)/protocol/$(PROTOCOL_KEY)/$(PROTOCOL_KEY).mk
# Setup definitions based on the selected MCU
$(eval $(call add_qmk_prefix_defs,MCU_ORIG,MCU))
$(eval $(call add_qmk_prefix_defs,MCU_ARCH,MCU_ARCH))
$(eval $(call add_qmk_prefix_defs,MCU_PORT_NAME,MCU_PORT_NAME))
$(eval $(call add_qmk_prefix_defs,MCU_FAMILY,MCU_FAMILY))
$(eval $(call add_qmk_prefix_defs,MCU_SERIES,MCU_SERIES))
$(eval $(call add_qmk_prefix_defs,BOARD,BOARD))
$(eval $(call add_qmk_prefix_defs,OPT,OPT))
# Control whether intermediate file listings are generated
# e.g.:
# make handwired/onekey/blackpill_f411:default KEEP_INTERMEDIATES=yes
# cat .build/obj_handwired_onekey_blackpill_f411_default/quantum/quantum.i | sed -e 's@^#.*@@g' -e 's@^\s*//.*@@g' -e '/^\s*$/d' | clang-format
ifeq ($(strip $(KEEP_INTERMEDIATES)), yes)
OPT_DEFS += -save-temps=obj
endif
OUTPUTS := $(INTERMEDIATE_OUTPUT)
$(INTERMEDIATE_OUTPUT)_SRC := $(SRC) $(PLATFORM_SRC)
$(INTERMEDIATE_OUTPUT)_DEFS := \
-DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(INTERMEDIATE_OUTPUT)/src/default_keyboard.h\" \
-DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" \
$(OPT_DEFS)
$(INTERMEDIATE_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
$(INTERMEDIATE_OUTPUT)_CONFIG := $(CONFIG_H) $(POST_CONFIG_H)
# Default target.
all: build check-size
build: elf cpfirmware
check-size: build
check-md5: build
objs-size: build
ifneq ($(strip $(TOP_SYMBOLS)),)
ifeq ($(strip $(TOP_SYMBOLS)),yes)
NUM_TOP_SYMBOLS := 10
else
NUM_TOP_SYMBOLS := $(strip $(TOP_SYMBOLS))
endif
all: top-symbols
check-size: top-symbols
top-symbols: build
echo "###########################################"
echo "# Highest flash usage:"
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [RrTt] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
echo "###########################################"
echo "# Highest RAM usage:"
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [BbCDdGgSs] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
echo "###########################################"
endif
include $(BUILDDEFS_PATH)/show_options.mk
include $(BUILDDEFS_PATH)/common_rules.mk
# Ensure we have generated files available for each of the objects
define GEN_FILES
$1: generated-files
endef
$(foreach O,$(OBJ),$(eval $(call GEN_FILES,$(patsubst %.a,%.o,$(O)))))
================================================
FILE: builddefs/build_layout.mk
================================================
LAYOUTS_PATH := layouts
LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/))))
ifneq ($(QMK_USERSPACE),)
LAYOUTS_REPOS += $(patsubst %/,%,$(QMK_USERSPACE)/$(LAYOUTS_PATH))
endif
define SEARCH_LAYOUTS_REPO
LAYOUT_KEYMAP_PATH := $$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP)
LAYOUT_KEYMAP_JSON := $$(LAYOUT_KEYMAP_PATH)/keymap.json
LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c
ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_JSON))","")
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk
KEYMAP_JSON := $$(LAYOUT_KEYMAP_JSON)
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH)
else ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","")
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk
KEYMAP_C := $$(LAYOUT_KEYMAP_C)
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH)
endif
endef
define SEARCH_LAYOUTS
$$(foreach LAYOUTS_REPO,$$(LAYOUTS_REPOS),$$(eval $$(call SEARCH_LAYOUTS_REPO)))
endef
ifneq ($(FORCE_LAYOUT),)
ifneq (,$(findstring $(FORCE_LAYOUT),$(LAYOUTS)))
$(info Forcing layout: $(FORCE_LAYOUT))
LAYOUTS := $(FORCE_LAYOUT)
else
$(call CATASTROPHIC_ERROR,Invalid layout,Forced layout does not exist)
endif
endif
$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS)))
================================================
FILE: builddefs/build_test.mk
================================================
ifndef VERBOSE
.SILENT:
endif
.DEFAULT_GOAL := all
OPT = g
include paths.mk
include $(BUILDDEFS_PATH)/support.mk
include $(BUILDDEFS_PATH)/message.mk
TARGET=test/$(TEST_OUTPUT)
GTEST_OUTPUT = $(BUILD_DIR)/gtest
TEST_OBJ = $(BUILD_DIR)/test_obj
OUTPUTS := $(TEST_OBJ)/$(TEST_OUTPUT) $(GTEST_OUTPUT)
GTEST_INC := \
$(LIB_PATH)/googletest/googletest/include \
$(LIB_PATH)/googletest/googlemock/include
GTEST_INTERNAL_INC := \
$(LIB_PATH)/googletest/googletest \
$(LIB_PATH)/googletest/googlemock
$(GTEST_OUTPUT)_SRC := \
googletest/src/gtest-all.cc\
googlemock/src/gmock-all.cc
$(GTEST_OUTPUT)_DEFS :=
$(GTEST_OUTPUT)_INC := $(GTEST_INC) $(GTEST_INTERNAL_INC)
LDFLAGS += -lstdc++ -lpthread -shared-libgcc
CREATE_MAP := no
VPATH += \
$(LIB_PATH)/googletest \
$(LIB_PATH)/googlemock \
$(COMMON_VPATH) \
$(TEST_PATH)
all: elf
PLATFORM:=TEST
PLATFORM_KEY:=test
BOOTLOADER_TYPE:=none
DEBUG ?= 0
ifneq ($(strip $(DEBUG)), 0)
CONSOLE_ENABLE = yes
endif
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
include tests/test_common/build.mk
include $(TEST_PATH)/test.mk
endif
include $(BUILDDEFS_PATH)/common_features.mk
include $(BUILDDEFS_PATH)/generic_features.mk
include $(PLATFORM_PATH)/common.mk
include $(TMK_PATH)/protocol.mk
include $(QUANTUM_PATH)/debounce/tests/rules.mk
include $(QUANTUM_PATH)/encoder/tests/rules.mk
include $(QUANTUM_PATH)/os_detection/tests/rules.mk
include $(QUANTUM_PATH)/sequencer/tests/rules.mk
include $(QUANTUM_PATH)/wear_leveling/tests/rules.mk
include $(QUANTUM_PATH)/logging/print.mk
include $(PLATFORM_PATH)/test/rules.mk
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
include $(BUILDDEFS_PATH)/build_full_test.mk
endif
$(TEST_OUTPUT)_SRC += \
tests/test_common/main.cpp \
$(QUANTUM_PATH)/logging/print.c
ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),)
$(TEST_OUTPUT)_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
endif
$(TEST_OBJ)/$(TEST_OUTPUT)_SRC := $($(TEST_OUTPUT)_SRC)
$(TEST_OBJ)/$(TEST_OUTPUT)_INC := $($(TEST_OUTPUT)_INC) $(VPATH) $(GTEST_INC)
$(TEST_OBJ)/$(TEST_OUTPUT)_DEFS := $($(TEST_OUTPUT)_DEFS)
$(TEST_OBJ)/$(TEST_OUTPUT)_CONFIG := $($(TEST_OUTPUT)_CONFIG)
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
include $(BUILDDEFS_PATH)/common_rules.mk
$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null)
$(shell mkdir -p $(TEST_OBJ) 2>/dev/null)
================================================
FILE: builddefs/common_features.mk
================================================
# Copyright 2017 Fred Sundvik
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
QUANTUM_SRC += \
$(QUANTUM_DIR)/quantum.c \
$(QUANTUM_DIR)/bitwise.c \
$(QUANTUM_DIR)/led.c \
$(QUANTUM_DIR)/action.c \
$(QUANTUM_DIR)/action_layer.c \
$(QUANTUM_DIR)/action_tapping.c \
$(QUANTUM_DIR)/action_util.c \
$(QUANTUM_DIR)/eeconfig.c \
$(QUANTUM_DIR)/keyboard.c \
$(QUANTUM_DIR)/keymap_common.c \
$(QUANTUM_DIR)/keycode_config.c \
$(QUANTUM_DIR)/sync_timer.c \
$(QUANTUM_DIR)/logging/debug.c \
$(QUANTUM_DIR)/logging/sendchar.c \
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \
include $(QUANTUM_DIR)/nvm/rules.mk
VPATH += $(QUANTUM_DIR)/logging
# Fall back to lib/printf if there is no platform provided print
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
include $(QUANTUM_PATH)/logging/print.mk
else
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk
endif
ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), yes)
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE
CONSOLE_ENABLE = yes
else ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), api)
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE
endif
AUDIO_ENABLE ?= no
ifeq ($(strip $(AUDIO_ENABLE)), yes)
ifeq ($(PLATFORM),CHIBIOS)
AUDIO_DRIVER ?= dac_basic
ifeq ($(strip $(AUDIO_DRIVER)), dac_basic)
OPT_DEFS += -DAUDIO_DRIVER_DAC
else ifeq ($(strip $(AUDIO_DRIVER)), dac_additive)
OPT_DEFS += -DAUDIO_DRIVER_DAC
## stm32f2 and above have a usable DAC unit, f1 do not, and need to use pwm instead
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_software)
OPT_DEFS += -DAUDIO_DRIVER_PWM
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_hardware)
OPT_DEFS += -DAUDIO_DRIVER_PWM
endif
else
# fallback for all other platforms is pwm
AUDIO_DRIVER ?= pwm_hardware
OPT_DEFS += -DAUDIO_DRIVER_PWM
endif
OPT_DEFS += -DAUDIO_ENABLE
COMMON_VPATH += $(QUANTUM_PATH)/audio
MUSIC_ENABLE = yes
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c
SRC += $(QUANTUM_DIR)/audio/audio.c ## common audio code, hardware agnostic
SRC += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/audio_$(strip $(AUDIO_DRIVER)).c
SRC += $(QUANTUM_DIR)/audio/voices.c
SRC += $(QUANTUM_DIR)/audio/luts.c
endif
ifeq ($(strip $(SEQUENCER_ENABLE)), yes)
MUSIC_ENABLE = yes
endif
ifeq ($(strip $(MIDI_ENABLE)), yes)
OPT_DEFS += -DMIDI_ENABLE
MUSIC_ENABLE = yes
COMMON_VPATH += $(QUANTUM_PATH)/midi
SRC += $(QUANTUM_DIR)/midi/midi.c
SRC += $(QUANTUM_DIR)/midi/midi_device.c
SRC += $(QUANTUM_DIR)/midi/qmk_midi.c
SRC += $(QUANTUM_DIR)/midi/sysex_tools.c
SRC += $(QUANTUM_DIR)/midi/bytequeue/bytequeue.c
SRC += $(QUANTUM_DIR)/midi/bytequeue/interrupt_setting.c
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
endif
VALID_STENO_PROTOCOL_TYPES := geminipr txbolt all
STENO_PROTOCOL ?= all
ifeq ($(strip $(STENO_ENABLE)), yes)
ifeq ($(filter $(STENO_PROTOCOL),$(VALID_STENO_PROTOCOL_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid STENO_PROTOCOL,STENO_PROTOCOL="$(STENO_PROTOCOL)" is not a valid stenography protocol)
else
OPT_DEFS += -DSTENO_ENABLE
VIRTSER_ENABLE ?= yes
ifeq ($(strip $(STENO_PROTOCOL)), geminipr)
OPT_DEFS += -DSTENO_ENABLE_GEMINI
endif
ifeq ($(strip $(STENO_PROTOCOL)), txbolt)
OPT_DEFS += -DSTENO_ENABLE_BOLT
endif
ifeq ($(strip $(STENO_PROTOCOL)), all)
OPT_DEFS += -DSTENO_ENABLE_ALL
OPT_DEFS += -DSTENO_ENABLE_GEMINI
OPT_DEFS += -DSTENO_ENABLE_BOLT
endif
SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c
endif
endif
ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
MOUSE_ENABLE := yes
endif
VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick azoteq_iqs5xx cirque_pinnacle_i2c cirque_pinnacle_spi paw3204 pmw3320 pmw3360 pmw3389 pimoroni_trackball navigator_trackpad custom
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid POINTING_DEVICE_DRIVER,POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type)
else
OPT_DEFS += -DPOINTING_DEVICE_ENABLE
MOUSE_ENABLE := yes
VPATH += $(QUANTUM_DIR)/pointing_device
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_auto_mouse.c
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
endif
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_NAME=$(strip $(POINTING_DEVICE_DRIVER))
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
SPI_DRIVER_REQUIRED = yes
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
ANALOG_DRIVER_REQUIRED = yes
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), azoteq_iqs5xx)
I2C_DRIVER_REQUIRED = yes
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_i2c)
I2C_DRIVER_REQUIRED = yes
SRC += drivers/sensors/cirque_pinnacle.c
SRC += drivers/sensors/cirque_pinnacle_gestures.c
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_spi)
SPI_DRIVER_REQUIRED = yes
SRC += drivers/sensors/cirque_pinnacle.c
SRC += drivers/sensors/cirque_pinnacle_gestures.c
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball)
I2C_DRIVER_REQUIRED = yes
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), navigator_trackpad)
I2C_DRIVER_REQUIRED = yes
SRC += drivers/sensors/navigator.c
else ifneq ($(filter $(strip $(POINTING_DEVICE_DRIVER)),pmw3360 pmw3389),)
SPI_DRIVER_REQUIRED = yes
SRC += drivers/sensors/pmw33xx_common.c
endif
endif
endif
QUANTUM_PAINTER_ENABLE ?= no
ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes)
include $(QUANTUM_DIR)/painter/rules.mk
endif
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
EEPROM_DRIVER ?= vendor
ifneq ($(strip $(EEPROM_DRIVER)),none)
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
else
OPT_DEFS += -DEEPROM_ENABLE
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
COMMON_VPATH += $(DRIVER_PATH)/eeprom
COMMON_VPATH += $(PLATFORM_COMMON_DIR)
ifeq ($(strip $(EEPROM_DRIVER)), custom)
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
SRC += eeprom_driver.c
else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling)
# Wear-leveling EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
SRC += eeprom_driver.c eeprom_wear_leveling.c
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
# External I2C EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
I2C_DRIVER_REQUIRED = yes
SRC += eeprom_driver.c eeprom_i2c.c
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
# External SPI EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
SPI_DRIVER_REQUIRED = yes
SRC += eeprom_driver.c eeprom_spi.c
else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash)
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
COMMON_VPATH += $(DRIVER_PATH)/flash
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
# Transient EEPROM implementation -- no data storage but provides runtime area for it
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
SRC += eeprom_driver.c eeprom_transient.c
else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
# Vendor-implemented EEPROM
OPT_DEFS += -DEEPROM_VENDOR
ifeq ($(PLATFORM),AVR)
# Automatically provided by avr-libc, nothing required
else ifeq ($(PLATFORM),CHIBIOS)
ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
COMMON_VPATH += $(DRIVER_PATH)/flash
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G0xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
# Wear-leveling EEPROM implementation, backed by MCU flash
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
SRC += eeprom_driver.c eeprom_wear_leveling.c
WEAR_LEVELING_DRIVER ?= embedded_flash
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
# True EEPROM on STM32L0xx, L1xx
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
SRC += eeprom_driver.c eeprom_stm32_L0_L1.c
else ifneq ($(filter $(MCU_SERIES),RP2040),)
# Wear-leveling EEPROM implementation, backed by RP2040 flash
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
SRC += eeprom_driver.c eeprom_wear_leveling.c
WEAR_LEVELING_DRIVER ?= rp2040_flash
else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
# Teensy EEPROM implementations
OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM
SRC += eeprom_kinetis_flexram.c
else
# Fall back to transient, i.e. non-persistent
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
SRC += eeprom_driver.c eeprom_transient.c
endif
else ifeq ($(PLATFORM),TEST)
# Test harness "EEPROM"
OPT_DEFS += -DEEPROM_TEST_HARNESS
SRC += eeprom.c
endif
endif
endif
endif
VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy
WEAR_LEVELING_DRIVER ?= none
ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
ifeq ($(filter $(WEAR_LEVELING_DRIVER),$(VALID_WEAR_LEVELING_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid WEAR_LEVELING_DRIVER,WEAR_LEVELING_DRIVER="$(WEAR_LEVELING_DRIVER)" is not a valid wear leveling driver)
else
FNV_ENABLE := yes
OPT_DEFS += -DWEAR_LEVELING_ENABLE
OPT_DEFS += -DWEAR_LEVELING_$(strip $(shell echo $(WEAR_LEVELING_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling
COMMON_VPATH += $(DRIVER_PATH)/wear_leveling
COMMON_VPATH += $(QUANTUM_DIR)/wear_leveling
SRC += wear_leveling.c
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
OPT_DEFS += -DHAL_USE_EFL
SRC += wear_leveling_efl.c
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
FLASH_DRIVER := spi
SRC += wear_leveling_flash_spi.c
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
SRC += wear_leveling_rp2040_flash.c
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
SRC += legacy_flash_ops.c wear_leveling_legacy.c
endif
endif
endif
VALID_FLASH_DRIVER_TYPES := spi custom
FLASH_DRIVER ?= none
ifneq ($(strip $(FLASH_DRIVER)), none)
ifeq ($(filter $(FLASH_DRIVER),$(VALID_FLASH_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid FLASH_DRIVER,FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid flash driver)
else
OPT_DEFS += -DFLASH_ENABLE -DFLASH_DRIVER -DFLASH_DRIVER_$(strip $(shell echo $(FLASH_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(DRIVER_PATH)/flash
ifeq ($(strip $(FLASH_DRIVER)),spi)
SRC += flash_spi.c
SPI_DRIVER_REQUIRED = yes
endif
endif
endif
RGBLIGHT_ENABLE ?= no
VALID_RGBLIGHT_TYPES := ws2812 apa102 custom
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
RGBLIGHT_DRIVER ?= ws2812
ifeq ($(filter $(RGBLIGHT_DRIVER),$(VALID_RGBLIGHT_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid RGBLIGHT_DRIVER,RGBLIGHT_DRIVER="$(RGBLIGHT_DRIVER)" is not a valid RGB type)
else
COMMON_VPATH += $(QUANTUM_DIR)/rgblight
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
OPT_DEFS += -DRGBLIGHT_ENABLE
OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
SRC += $(QUANTUM_DIR)/process_keycode/process_underglow.c
SRC += $(QUANTUM_DIR)/color.c
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c
CIE1931_CURVE := yes
endif
ifeq ($(strip $(RGBLIGHT_DRIVER)), ws2812)
WS2812_DRIVER_REQUIRED := yes
endif
ifeq ($(strip $(RGBLIGHT_DRIVER)), apa102)
APA102_DRIVER_REQUIRED := yes
endif
ifeq ($(strip $(VELOCIKEY_ENABLE)), yes)
OPT_DEFS += -DVELOCIKEY_ENABLE
endif
endif
# Deprecated driver names - do not use
ifeq ($(strip $(LED_MATRIX_DRIVER)), aw20216)
LED_MATRIX_DRIVER := aw20216s
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), ckled2001)
LED_MATRIX_DRIVER := snled27351
endif
LED_MATRIX_ENABLE ?= no
VALID_LED_MATRIX_TYPES := is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 custom
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid LED_MATRIX_DRIVER,LED_MATRIX_DRIVER="$(LED_MATRIX_DRIVER)" is not a valid matrix type)
endif
OPT_DEFS += -DLED_MATRIX_ENABLE
OPT_DEFS += -DLED_MATRIX_$(strip $(shell echo $(LED_MATRIX_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations/runners
POST_CONFIG_H += $(QUANTUM_DIR)/led_matrix/post_config.h
SRC += $(QUANTUM_DIR)/process_keycode/process_led_matrix.c
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix.c
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix_drivers.c
LIB8TION_ENABLE := yes
CIE1931_CURVE := yes
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3218)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3218-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3236)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3236-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3729)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3729-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3731)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3731-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3733)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3733-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3736)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3736-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3737)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3737-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3741)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3741-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3742a)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3742a-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3743a)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3743a-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3745)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3745-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3746a)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3746a-mono.c
endif
ifeq ($(strip $(LED_MATRIX_DRIVER)), snled27351)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led
SRC += snled27351-mono.c
endif
ifeq ($(strip $(LED_MATRIX_CUSTOM_KB)), yes)
OPT_DEFS += -DLED_MATRIX_CUSTOM_KB
endif
ifeq ($(strip $(LED_MATRIX_CUSTOM_USER)), yes)
OPT_DEFS += -DLED_MATRIX_CUSTOM_USER
endif
endif
# Deprecated driver names - do not use
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216)
RGB_MATRIX_DRIVER := aw20216s
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), ckled2001)
RGB_MATRIX_DRIVER := snled27351
endif
RGB_MATRIX_ENABLE ?= no
VALID_RGB_MATRIX_TYPES := aw20216s is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 ws2812 custom
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid RGB_MATRIX_DRIVER,RGB_MATRIX_DRIVER="$(RGB_MATRIX_DRIVER)" is not a valid matrix type)
endif
OPT_DEFS += -DRGB_MATRIX_ENABLE
OPT_DEFS += -DRGB_MATRIX_$(strip $(shell echo $(RGB_MATRIX_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
POST_CONFIG_H += $(QUANTUM_DIR)/rgb_matrix/post_config.h
# TODO: Remove this
SRC += $(QUANTUM_DIR)/process_keycode/process_underglow.c
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb_matrix.c
SRC += $(QUANTUM_DIR)/color.c
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
LIB8TION_ENABLE := yes
CIE1931_CURVE := yes
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216s)
SPI_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led
SRC += aw20216s.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3218)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3218.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3236)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3236.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3729)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3729.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3731)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3731.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3733)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3733.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3736)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3736.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3737)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3737.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3741)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3741.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3742a)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3742a.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3743a)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3743a.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3745)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3745.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3746a)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led/issi
SRC += is31fl3746a.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), snled27351)
I2C_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/led
SRC += snled27351.c
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), ws2812)
WS2812_DRIVER_REQUIRED := yes
endif
ifeq ($(strip $(RGB_MATRIX_DRIVER)), apa102)
APA102_DRIVER_REQUIRED := yes
endif
ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
OPT_DEFS += -DRGB_MATRIX_CUSTOM_KB
endif
ifeq ($(strip $(RGB_MATRIX_CUSTOM_USER)), yes)
OPT_DEFS += -DRGB_MATRIX_CUSTOM_USER
endif
endif
VARIABLE_TRACE ?= no
ifneq ($(strip $(VARIABLE_TRACE)),no)
SRC += $(QUANTUM_DIR)/variable_trace.c
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE))
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),)
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE))
endif
endif
ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c
OPT_DEFS += -DSLEEP_LED_ENABLE
NO_SUSPEND_POWER_DOWN := yes
endif
VALID_BACKLIGHT_TYPES := pwm timer software custom
BACKLIGHT_ENABLE ?= no
BACKLIGHT_DRIVER ?= pwm
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid BACKLIGHT_DRIVER,BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type)
endif
COMMON_VPATH += $(QUANTUM_DIR)/backlight
COMMON_VPATH += $(DRIVER_PATH)/backlight
SRC += $(QUANTUM_DIR)/backlight/backlight.c
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
OPT_DEFS += -DBACKLIGHT_ENABLE
OPT_DEFS += -DBACKLIGHT_$(strip $(shell echo $(BACKLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
ifneq ($(strip $(BACKLIGHT_DRIVER)), custom)
SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c
ifeq ($(strip $(BACKLIGHT_DRIVER)), software)
SRC += $(DRIVER_PATH)/backlight/backlight_software.c
else
SRC += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/backlight_$(strip $(BACKLIGHT_DRIVER)).c
endif
endif
endif
ifeq ($(strip $(CIE1931_CURVE)), yes)
OPT_DEFS += -DUSE_CIE1931_CURVE
LED_TABLES := yes
endif
ifeq ($(strip $(LED_TABLES)), yes)
SRC += $(QUANTUM_DIR)/led_tables.c
endif
ifeq ($(strip $(VIA_ENABLE)), yes)
DYNAMIC_KEYMAP_ENABLE := yes
RAW_ENABLE := yes
BOOTMAGIC_ENABLE := yes
TRI_LAYER_ENABLE := yes
endif
ifeq ($(strip $(RAW_ENABLE)), yes)
OPT_DEFS += -DRAW_ENABLE
SRC += raw_hid.c
endif
ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
SEND_STRING_ENABLE := yes
endif
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
CUSTOM_MATRIX ?= no
ifneq ($(strip $(CUSTOM_MATRIX)), yes)
ifeq ($(filter $(CUSTOM_MATRIX),$(VALID_CUSTOM_MATRIX_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid CUSTOM_MATRIX,CUSTOM_MATRIX="$(CUSTOM_MATRIX)" is not a valid custom matrix type)
endif
# Include common stuff for all non custom matrix users
QUANTUM_SRC += $(QUANTUM_DIR)/matrix_common.c
# if 'lite' then skip the actual matrix implementation
ifneq ($(strip $(CUSTOM_MATRIX)), lite)
# Include the standard or split matrix code if needed
QUANTUM_SRC += $(QUANTUM_DIR)/matrix.c
endif
endif
# Debounce Modules. Set DEBOUNCE_TYPE=custom if including one manually.
DEBOUNCE_TYPE ?= sym_defer_g
ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c
endif
VALID_SERIAL_DRIVER_TYPES := bitbang usart vendor
SERIAL_DRIVER ?= bitbang
ifeq ($(filter $(SERIAL_DRIVER),$(VALID_SERIAL_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid SERIAL_DRIVER,SERIAL_DRIVER="$(SERIAL_DRIVER)" is not a valid SERIAL driver)
endif
ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h
OPT_DEFS += -DSPLIT_KEYBOARD
CRC_ENABLE := yes
# Include files used by all split keyboards
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_util.c
# Determine which (if any) transport files are required
ifneq ($(strip $(SPLIT_TRANSPORT)), custom)
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/transport.c \
$(QUANTUM_DIR)/split_common/transactions.c
OPT_DEFS += -DSPLIT_COMMON_TRANSACTIONS
# Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called.
# Unused functions are pruned away, which is why we can add multiple drivers here without bloat.
ifeq ($(PLATFORM),AVR)
ifneq ($(NO_I2C),yes)
QUANTUM_LIB_SRC += i2c_master.c \
i2c_slave.c
endif
endif
OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]'))
ifeq ($(strip $(SERIAL_DRIVER)), bitbang)
QUANTUM_LIB_SRC += serial.c
else
QUANTUM_LIB_SRC += serial_protocol.c
QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c
endif
endif
COMMON_VPATH += $(QUANTUM_PATH)/split_common
endif
ifeq ($(strip $(FNV_ENABLE)), yes)
OPT_DEFS += -DFNV_ENABLE
VPATH += $(LIB_PATH)/fnv
SRC += qmk_fnv_type_validation.c hash_32a.c hash_64a.c
endif
ifeq ($(strip $(LIB8TION_ENABLE)), yes)
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
OPT_DEFS += -DLIB8_ATTINY
endif
OPT_DEFS += -DFASTLED_SCALE8_FIXED=1 -DFASTLED_BLEND_FIXED=1
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
endif
VALID_HAPTIC_DRIVER_TYPES := drv2605l solenoid
ifeq ($(strip $(HAPTIC_ENABLE)),yes)
ifeq ($(filter $(HAPTIC_DRIVER),$(VALID_HAPTIC_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid HAPTIC_DRIVER,HAPTIC_DRIVER="$(HAPTIC_DRIVER)" is not a valid Haptic driver)
else
OPT_DEFS += -DHAPTIC_$(strip $(shell echo $(HAPTIC_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(DRIVER_PATH)/haptic
ifeq ($(strip $(HAPTIC_DRIVER)), drv2605l)
I2C_DRIVER_REQUIRED = yes
SRC += drv2605l.c
endif
ifeq ($(strip $(HAPTIC_DRIVER)), solenoid)
SRC += solenoid.c
endif
endif
endif
ifeq ($(strip $(HD44780_ENABLE)), yes)
OPT_DEFS += -DHD44780_ENABLE
COMMON_VPATH += $(DRIVER_PATH)/lcd
SRC += hd44780.c
endif
VALID_OLED_DRIVER_TYPES := custom ssd1306
OLED_DRIVER ?= ssd1306
VALID_OLED_TRANSPORT_TYPES := i2c spi custom
OLED_TRANSPORT ?= i2c
ifeq ($(strip $(OLED_ENABLE)), yes)
ifeq ($(filter $(OLED_DRIVER),$(VALID_OLED_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid OLED_DRIVER,OLED_DRIVER="$(OLED_DRIVER)" is not a valid OLED driver)
else
ifeq ($(filter $(OLED_TRANSPORT),$(VALID_OLED_TRANSPORT_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid OLED_TRANSPORT,OLED_TRANSPORT="$(OLED_TRANSPORT)" is not a valid OLED transport)
else
OPT_DEFS += -DOLED_ENABLE
OPT_DEFS += -DOLED_$(strip $(shell echo $(OLED_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(DRIVER_PATH)/oled
ifneq ($(strip $(OLED_DRIVER)), custom)
SRC += oled_driver.c
endif
OPT_DEFS += -DOLED_TRANSPORT_$(strip $(shell echo $(OLED_TRANSPORT) | tr '[:lower:]' '[:upper:]'))
ifeq ($(strip $(OLED_TRANSPORT)), i2c)
I2C_DRIVER_REQUIRED = yes
endif
ifeq ($(strip $(OLED_TRANSPORT)), spi)
SPI_DRIVER_REQUIRED = yes
endif
endif
endif
endif
ifeq ($(strip $(ST7565_ENABLE)), yes)
OPT_DEFS += -DST7565_ENABLE
SPI_DRIVER_REQUIRED = yes
COMMON_VPATH += $(DRIVER_PATH)/oled # For glcdfont.h
COMMON_VPATH += $(DRIVER_PATH)/lcd
SRC += st7565.c
endif
ifeq ($(strip $(UCIS_ENABLE)), yes)
OPT_DEFS += -DUCIS_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c \
$(QUANTUM_DIR)/unicode/ucis.c
endif
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
OPT_DEFS += -DUNICODEMAP_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c \
$(QUANTUM_DIR)/unicode/unicodemap.c
endif
ifeq ($(strip $(UNICODE_ENABLE)), yes)
OPT_DEFS += -DUNICODE_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
endif
ifeq ($(strip $(UNICODE_COMMON)), yes)
OPT_DEFS += -DUNICODE_COMMON_ENABLE
COMMON_VPATH += $(QUANTUM_DIR)/unicode
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c \
$(QUANTUM_DIR)/unicode/unicode.c \
$(QUANTUM_DIR)/unicode/utf8.c
endif
ifeq ($(strip $(PS2_MOUSE_ENABLE)), yes)
PS2_ENABLE := yes
MOUSE_ENABLE := yes
SRC += ps2_mouse.c
OPT_DEFS += -DPS2_MOUSE_ENABLE
endif
VALID_PS2_DRIVER_TYPES := busywait interrupt usart vendor
PS2_DRIVER ?= busywait
ifeq ($(strip $(PS2_ENABLE)), yes)
ifeq ($(filter $(PS2_DRIVER),$(VALID_PS2_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid PS2_DRIVER,PS2_DRIVER="$(PS2_DRIVER)" is not a valid PS/2 driver)
endif
OPT_DEFS += -DPS2_DRIVER_$(strip $(shell echo $(PS2_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(DRIVER_PATH)/ps2
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/ps2
OPT_DEFS += -DPS2_ENABLE
ifneq ($(strip $(PS2_DRIVER)), vendor)
SRC += ps2_io.c
endif
SRC += ps2_$(strip $(PS2_DRIVER)).c
endif
JOYSTICK_ENABLE ?= no
VALID_JOYSTICK_TYPES := analog digital
JOYSTICK_DRIVER ?= analog
ifeq ($(strip $(JOYSTICK_ENABLE)), yes)
ifeq ($(filter $(JOYSTICK_DRIVER),$(VALID_JOYSTICK_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid JOYSTICK_DRIVER,JOYSTICK_DRIVER="$(JOYSTICK_DRIVER)" is not a valid joystick driver)
endif
OPT_DEFS += -DJOYSTICK_ENABLE
OPT_DEFS += -DJOYSTICK_$(strip $(shell echo $(JOYSTICK_DRIVER) | tr '[:lower:]' '[:upper:]'))
SRC += $(QUANTUM_DIR)/process_keycode/process_joystick.c
SRC += $(QUANTUM_DIR)/joystick.c
ifeq ($(strip $(JOYSTICK_DRIVER)), analog)
ANALOG_DRIVER_REQUIRED = yes
endif
endif
USBPD_ENABLE ?= no
VALID_USBPD_DRIVER_TYPES = custom vendor
USBPD_DRIVER ?= vendor
ifeq ($(strip $(USBPD_ENABLE)), yes)
ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver)
else
OPT_DEFS += -DUSBPD_ENABLE
ifeq ($(strip $(USBPD_DRIVER)), vendor)
# Vendor-specific implementations
OPT_DEFS += -DUSBPD_VENDOR
ifeq ($(strip $(MCU_SERIES)), STM32G4xx)
OPT_DEFS += -DUSBPD_STM32G4
SRC += usbpd_stm32g4.c
else
$(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,There is no vendor-provided USBPD driver available)
endif
else ifeq ($(strip $(USBPD_DRIVER)), custom)
OPT_DEFS += -DUSBPD_CUSTOM
# Board designers can add their own driver to $(SRC)
endif
endif
endif
BLUETOOTH_ENABLE ?= no
VALID_BLUETOOTH_DRIVER_TYPES := bluefruit_le custom rn42
ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
ifeq ($(filter $(strip $(BLUETOOTH_DRIVER)),$(VALID_BLUETOOTH_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid BLUETOOTH_DRIVER,BLUETOOTH_DRIVER="$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type)
endif
OPT_DEFS += -DBLUETOOTH_ENABLE
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
NO_USB_STARTUP_CHECK := yes
CONNECTION_ENABLE := yes
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
SPI_DRIVER_REQUIRED = yes
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
endif
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
UART_DRIVER_REQUIRED = yes
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
endif
endif
ENCODER_ENABLE ?= no
ENCODER_DRIVER ?= quadrature
VALID_ENCODER_DRIVER_TYPES := quadrature custom
ifeq ($(strip $(ENCODER_ENABLE)), yes)
ifeq ($(filter $(ENCODER_DRIVER),$(VALID_ENCODER_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid ENCODER_DRIVER,ENCODER_DRIVER="$(ENCODER_DRIVER)" is not a valid encoder driver)
endif
SRC += $(QUANTUM_DIR)/encoder.c
OPT_DEFS += -DENCODER_ENABLE
OPT_DEFS += -DENCODER_DRIVER_$(strip $(shell echo $(ENCODER_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/encoder
COMMON_VPATH += $(DRIVER_PATH)/encoder
ifneq ($(strip $(ENCODER_DRIVER)), custom)
SRC += encoder_$(strip $(ENCODER_DRIVER)).c
endif
ifeq ($(strip $(ENCODER_MAP_ENABLE)), yes)
OPT_DEFS += -DENCODER_MAP_ENABLE
endif
endif
ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
ifeq ($(strip $(DIP_SWITCH_MAP_ENABLE)), yes)
OPT_DEFS += -DDIP_SWITCH_MAP_ENABLE
endif
endif
VALID_BATTERY_DRIVER_TYPES := adc custom vendor
BATTERY_DRIVER ?= adc
ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes)
ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver)
endif
OPT_DEFS += -DBATTERY_DRIVER
OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(DRIVER_PATH)/battery
SRC += battery.c
SRC += battery_$(strip $(BATTERY_DRIVER)).c
# add extra deps
ifeq ($(strip $(BATTERY_DRIVER)), adc)
ANALOG_DRIVER_REQUIRED = yes
endif
endif
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor
WS2812_DRIVER ?= bitbang
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid WS2812_DRIVER,WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver)
endif
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(DRIVER_PATH)/led
SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c
ifeq ($(strip $(PLATFORM)), CHIBIOS)
ifeq ($(strip $(WS2812_DRIVER)), pwm)
OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE
endif
endif
# add extra deps
ifeq ($(strip $(WS2812_DRIVER)), i2c)
I2C_DRIVER_REQUIRED = yes
endif
endif
ifeq ($(strip $(APA102_DRIVER_REQUIRED)), yes)
COMMON_VPATH += $(DRIVER_PATH)/led
SRC += apa102.c
endif
ifeq ($(strip $(ANALOG_DRIVER_REQUIRED)), yes)
OPT_DEFS += -DHAL_USE_ADC=TRUE
QUANTUM_LIB_SRC += analog.c
endif
ifeq ($(strip $(I2C_DRIVER_REQUIRED)), yes)
OPT_DEFS += -DHAL_USE_I2C=TRUE
QUANTUM_LIB_SRC += i2c_master.c
endif
ifeq ($(strip $(SPI_DRIVER_REQUIRED)), yes)
OPT_DEFS += -DHAL_USE_SPI=TRUE
QUANTUM_LIB_SRC += spi_master.c
endif
ifeq ($(strip $(UART_DRIVER_REQUIRED)), yes)
ifeq ($(strip $(PLATFORM)), CHIBIOS)
ifneq ($(filter $(MCU_SERIES),RP2040),)
OPT_DEFS += -DHAL_USE_SIO=TRUE
QUANTUM_LIB_SRC += uart_sio.c
else
OPT_DEFS += -DHAL_USE_SERIAL=TRUE
QUANTUM_LIB_SRC += uart_serial.c
endif
else
QUANTUM_LIB_SRC += uart.c
endif
endif
ifeq ($(strip $(ACHORDION_ENABLE)), yes)
OPT_DEFS += -DACHORDION_ENABLE -DPERMISSIVE_HOLD
SRC += $(QUANTUM_DIR)/process_keycode/process_achordion.c
endif
================================================
FILE: builddefs/common_rules.mk
================================================
# Hey Emacs, this is a -*- makefile -*-
#----------------------------------------------------------------------------
# Enable vpath searching for source files only
# Without this, output files, could be read from the wrong .build directories
VPATH_SRC := $(VPATH)
vpath %.c $(VPATH_SRC)
vpath %.h $(VPATH_SRC)
vpath %.cpp $(VPATH_SRC)
vpath %.cc $(VPATH_SRC)
vpath %.hpp $(VPATH_SRC)
vpath %.S $(VPATH_SRC)
VPATH :=
# Helper to return the distinct elements of a list
uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
# Convert all SRC to OBJ
define OBJ_FROM_SRC
$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.cc,$1/%.o,$(patsubst %.S,$1/%.o,$(patsubst %.clib,$1/%.a,$($1_SRC))))))
endef
$(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT))))
# Define a list of all objects
OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ))
NO_LTO_OBJ := $(filter %.a,$(OBJ))
MASTER_OUTPUT := $(firstword $(OUTPUTS))
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
# Optimization level, can be [0, 1, 2, 3, s].
OPT ?= s
# Compiler flag to set the C and C++ language standard level
CSTANDARD = -std=gnu11
CXXSTANDARD = -std=gnu++14
# Speed up recompilations by opt-in usage of ccache
USE_CCACHE ?= no
ifneq ($(USE_CCACHE),no)
CC_PREFIX ?= ccache
endif
#---------------- Debug Options ----------------
DEBUG_ENABLE ?= no
ifeq ($(strip $(DEBUG_ENABLE)),yes)
CFLAGS += -ggdb3
CXXFLAGS += -ggdb3
ASFLAGS += -ggdb3
# Create a map file when debugging
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
endif
#---------------- C Compiler Options ----------------
ifeq ($(strip $(LTO_ENABLE)), yes)
CDEFS += -flto
CDEFS += -DLTO_ENABLE
endif
CFLAGS += $(CDEFS)
CFLAGS += -O$(OPT)
# add color
ifeq ($(COLOR),true)
ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "")
CFLAGS+= -fdiagnostics-color
endif
endif
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
CFLAGS += -Werror
endif
CFLAGS += $(CSTANDARD)
# This fixes lots of keyboards linking errors but SHOULDN'T BE A FINAL SOLUTION
# Fixing of multiple variable definitions must be made.
CFLAGS += -fcommon
#---------------- C++ Compiler Options ----------------
CXXFLAGS += $(CXXDEFS)
CXXFLAGS += -O$(OPT)
# to suppress "warning: only initialized variables can be placed into program memory area"
CXXFLAGS += -w
CXXFLAGS += -Wall
CXXFLAGS += -Wundef
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
CXXFLAGS += -Werror
endif
#---------------- Assembler Options ----------------
ASFLAGS += $(ADEFS)
ifeq ($(VERBOSE_AS_CMD),yes)
ASFLAGS += -v
endif
#---------------- Linker Options ----------------
ifeq ($(VERBOSE_LD_CMD),yes)
LDFLAGS += -v
endif
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
LDFLAGS += -lm
# You can give EXTRALDFLAGS at 'make' command line.
LDFLAGS += $(EXTRALDFLAGS)
#---------------- Assembler Listings ----------------
ADHLNS_ENABLE ?= no
ifeq ($(ADHLNS_ENABLE),yes)
# Avoid "Options to '-Xassembler' do not match" - only specify assembler options at LTO link time
ifeq ($(strip $(LTO_ENABLE)), yes)
LDFLAGS += -Wa,-adhlns=$(BUILD_DIR)/$(TARGET).lst
else
CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
CXXFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100
endif
endif
# Define programs and commands.
SHELL = sh
SED = sed
REMOVE = rm -f
REMOVEDIR = rmdir
COPY = cp
WINSHELL = cmd
SECHO = $(SILENT) || echo
MD5SUM ?= md5sum
ifneq ($(filter Darwin FreeBSD,$(shell uname -s)),)
MD5SUM = md5
endif
# UF2 format settings
# To produce a UF2 file in your build, add to your keyboard's rules.mk:
# FIRMWARE_FORMAT = uf2
UF2CONV = $(TOP_DIR)/util/uf2conv.py
UF2CONV_ARGS ?=
UF2_FAMILY ?= 0x0
# Compiler flags to generate dependency files.
#GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
GENDEPFLAGS = -MMD -MP -MF $(patsubst %.o,%.td,$@)
# Combine all necessary flags and optional flags.
# Add target processor to flags.
# You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar
ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS)
ALL_CXXFLAGS = $(MCUFLAGS) -x c++ $(CXXFLAGS) $(EXTRAFLAGS)
ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
define NO_LTO
$(patsubst %.a,%.o,$1): NOLTO_CFLAGS += -fno-lto
endef
$(foreach LOBJ, $(NO_LTO_OBJ), $(eval $(call NO_LTO,$(LOBJ))))
MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
# For a ChibiOS build, ensure that the board files have the hook overrides injected
define BOARDSRC_INJECT_HOOKS
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
endef
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
# Add QMK specific flags
DFU_SUFFIX ?= dfu-suffix
DFU_SUFFIX_ARGS ?=
elf: $(BUILD_DIR)/$(TARGET).elf
hex: $(BUILD_DIR)/$(TARGET).hex
uf2: $(BUILD_DIR)/$(TARGET).uf2
cpfirmware_qmk: $(FIRMWARE_FORMAT)
$(SILENT) || printf "Copying $(TARGET).$(FIRMWARE_FORMAT) to qmk_firmware folder" | $(AWK_CMD)
$(COPY) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT) $(TARGET).$(FIRMWARE_FORMAT) && $(PRINT_OK)
eep: $(BUILD_DIR)/$(TARGET).eep
lss: $(BUILD_DIR)/$(TARGET).lss
sym: $(BUILD_DIR)/$(TARGET).sym
LIBNAME=lib$(TARGET).a
lib: $(LIBNAME)
cpfirmware: cpfirmware_qmk
ifneq ($(QMK_USERSPACE),)
cpfirmware: cpfirmware_userspace
cpfirmware_userspace: cpfirmware_qmk
$(SILENT) || printf "Copying $(TARGET).$(FIRMWARE_FORMAT) to userspace folder" | $(AWK_CMD)
$(COPY) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT) $(QMK_USERSPACE)/$(TARGET).$(FIRMWARE_FORMAT) && $(PRINT_OK)
endif
# Display size of file, modifying the output so people don't mistakenly grab the hex output
BINARY_SIZE = $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex | $(SED) -e 's/\.build\/.*$$/$(TARGET).$(FIRMWARE_FORMAT)/g'
sizebefore:
@if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(BINARY_SIZE); \
2>/dev/null; $(SECHO); fi
sizeafter: $(BUILD_DIR)/$(TARGET).hex
@if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(BINARY_SIZE); \
2>/dev/null; $(SECHO); fi
# Display compiler version information.
gccversion :
@$(SILENT) || $(CC) --version
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
$(eval CMD=$(HEX) $< $@)
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
@$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD)
@$(BUILD_CMD)
%.uf2: %.elf
$(eval CMD=$(HEX) $< $(BUILD_DIR)/$(TARGET).tmp && $(UF2CONV) $(UF2CONV_ARGS) $(BUILD_DIR)/$(TARGET).tmp --output $@ --convert --family $(UF2_FAMILY) >/dev/null 2>&1)
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
@$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
@$(BUILD_CMD)
%.eep: %.elf
$(eval CMD=$(EEP) $< $@ || exit 0)
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
@$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD)
@$(BUILD_CMD)
# Create extended listing file from ELF output file.
%.lss: %.elf
$(eval CMD=$(OBJDUMP) -h -S -z $< > $@)
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
@$(SILENT) || printf "$(MSG_EXTENDED_LISTING) $@" | $(AWK_CMD)
@$(BUILD_CMD)
# Create a symbol table from ELF output file.
%.sym: %.elf
$(eval CMD=$(NM) -n $< > $@ )
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
@$(SILENT) || printf "$(MSG_SYMBOL_TABLE) $@" | $(AWK_CMD)
@$(BUILD_CMD)
%.bin: %.elf
$(eval CMD=$(BIN) $< $@ || exit 0)
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
@$(SILENT) || printf "$(MSG_BIN) $@" | $(AWK_CMD)
@$(BUILD_CMD)
if [ ! -z "$(DFU_SUFFIX_ARGS)" ]; then \
$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null ;\
fi
#$(SILENT) || printf "$(MSG_EXECUTING) '$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null':\n" ;\
$(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
BEGIN = gccversion sizebefore
# Link: create ELF output file from object files.
.SECONDARY : $(BUILD_DIR)/$(TARGET).elf
.PRECIOUS : $(OBJ)
# Note the obj.txt depeendency is there to force linking if a source file is deleted
%.elf: $(OBJ) $(MASTER_OUTPUT)/cflags.txt $(MASTER_OUTPUT)/ldflags.txt $(MASTER_OUTPUT)/obj.txt | $(BEGIN)
@$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
$(eval CMD=MAKE=$(MAKE) $(CC) $(ALL_CFLAGS) $(call uniq,$(OBJ)) --output $@ $(LDFLAGS))
@$(BUILD_CMD)
define GEN_OBJRULE
$1_INCFLAGS := $$(patsubst %,-I%,$$($1_INC))
ifdef $1_CONFIG
$1_CONFIG_FLAGS += $$(patsubst %,-include %,$$($1_CONFIG))
endif
$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS)
$1_CXXFLAGS = $$(ALL_CXXFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS)
$1_ASFLAGS = $$(ALL_ASFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
# Compile: create object files from C source files.
$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
@mkdir -p $$(@D)
@$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD)
$$(eval CC_EXEC := $$(CC))
ifneq ($$(VERBOSE_C_CMD),)
$$(if $$(filter $$(notdir $$(VERBOSE_C_CMD)),$$(notdir $$<)),$$(eval CC_EXEC += -v))
endif
ifneq ($$(VERBOSE_C_INCLUDE),)
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
endif
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD)
ifneq ($$(DUMP_C_MACROS),)
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$<)
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
endif
# Compile: create object files from C++ source files.
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
@mkdir -p $$(@D)
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD)
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
@mkdir -p $$(@D)
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD)
# Assemble: create object files from assembler source files.
$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN)
@mkdir -p $$(@D)
@$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD)
$$(eval CMD=$$(CC) -c $$($1_ASFLAGS) $$< -o $$@)
@$$(BUILD_CMD)
$1/%.a : $1/%.o
@mkdir -p $$(@D)
@$(SILENT) || printf "Archiving: $$<" | $$(AWK_CMD)
$$(eval CMD=$$(AR) rcs $$@ $$<)
@$$(BUILD_CMD)
$1/force:
$1/cflags.txt: $1/force
echo '$$($1_CFLAGS)' | cmp -s - $$@ || echo '$$($1_CFLAGS)' > $$@
$1/cxxflags.txt: $1/force
echo '$$($1_CXXFLAGS)' | cmp -s - $$@ || echo '$$($1_CXXFLAGS)' > $$@
$1/asflags.txt: $1/force
echo '$$($1_ASFLAGS)' | cmp -s - $$@ || echo '$$($1_ASFLAGS)' > $$@
$1/compiler.txt: $1/force
test -f $$@ || touch $$@
$$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@
endef
.PRECIOUS: $(MASTER_OUTPUT)/obj.txt
$(MASTER_OUTPUT)/obj.txt: $(MASTER_OUTPUT)/force
echo '$(OBJ)' | cmp -s - $@ || echo '$(OBJ)' > $@
.PRECIOUS: $(MASTER_OUTPUT)/ldflags.txt
$(MASTER_OUTPUT)/ldflags.txt: $(MASTER_OUTPUT)/force
echo '$(LDFLAGS)' | cmp -s - $@ || echo '$(LDFLAGS)' > $@
# We have to use static rules for the .d files for some reason
DEPS = $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ)))
# Keep the .d files
.PRECIOUS: $(DEPS)
# Empty rule to force recompilation if the .d file is missing
$(DEPS):
$(foreach OUTPUT,$(OUTPUTS),$(eval $(call GEN_OBJRULE,$(OUTPUT))))
# Create preprocessed source for use in sending a bug report.
%.i : %.c | $(BEGIN)
$(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
# Target: clean project.
clean:
$(foreach OUTPUT,$(OUTPUTS), $(REMOVE) -r $(OUTPUT) 2>/dev/null)
$(REMOVE) $(BUILD_DIR)/$(TARGET).*
show_path:
@echo VPATH=$(VPATH)
@echo SRC=$(SRC)
@echo OBJ=$(OBJ)
dump_vars: ERROR_IF_EMPTY=""
dump_vars: ERROR_IF_NONBOOL=""
dump_vars: ERROR_IF_UNSET=""
dump_vars: CATASTROPHIC_ERROR=""
dump_vars:
@$(foreach V,$(sort $(.VARIABLES)),$(if $(filter-out environment% default automatic,$(origin $V)),$(info $V=$($V))))
objs-size:
for i in $(OBJ); do echo $$i; done | sort | xargs $(SIZE)
# size check optionally implemented in its platform.mk
check-size:
check-md5:
$(MD5SUM) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT)
# Create build directory
$(shell mkdir -p $(BUILD_DIR) 2>/dev/null)
# Create object files directory
$(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null)))
# Include the dependency files.
-include $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ)))
# Listing of phony targets.
.PHONY : all dump_vars finish sizebefore sizeafter qmkversion \
gccversion build elf hex uf2 eep lss sym coff extcoff \
clean clean_list debug gdb-config show_path \
program teensy dfu dfu-ee dfu-start \
flash dfu-split-left dfu-split-right \
avrdude-split-left avrdude-split-right \
avrdude-loop usbasp
================================================
FILE: builddefs/converters.mk
================================================
ifneq (,$(filter $(MCU),atmega32u4))
# TODO: opt in rather than assume everything uses a pro micro
PIN_COMPATIBLE ?= promicro
endif
# Remove whitespace from any rule.mk provided vars
# - env cannot be overwritten but cannot have whitespace anyway
CONVERT_TO:=$(strip $(CONVERT_TO))
ifneq ($(CONVERT_TO),)
# stash so we can overwrite env provided vars if needed
ACTIVE_CONVERTER=$(CONVERT_TO)
ifeq ($(PIN_COMPATIBLE),)
$(call CATASTROPHIC_ERROR,Converting to '$(CONVERT_TO)' not possible!)
endif
# glob to search each platfrorm and/or check for valid converter
CONVERTER := $(wildcard $(PLATFORM_PATH)/*/converters/$(PIN_COMPATIBLE)_to_$(CONVERT_TO)/)
ifeq ($(CONVERTER),)
$(call CATASTROPHIC_ERROR,Converting from '$(PIN_COMPATIBLE)' to '$(CONVERT_TO)' not possible!)
endif
-include $(CONVERTER)/pre_converter.mk
PLATFORM_KEY = $(shell echo $(CONVERTER) | cut -d "/" -f2)
# Configure any defaults
OPT_DEFS += -DCONVERT_TO_$(shell echo $(CONVERT_TO) | tr '[:lower:]' '[:upper:]')
OPT_DEFS += -DCONVERTER_TARGET=\"$(CONVERT_TO)\"
OPT_DEFS += -DCONVERTER_ENABLED
VPATH += $(CONVERTER)
# Configure for "alias" - worst case it produces an idential define
OPT_DEFS += -DCONVERT_TO_$(shell echo $(ACTIVE_CONVERTER) | tr '[:lower:]' '[:upper:]')
# Finally run any converter specific logic
include $(CONVERTER)/converter.mk
endif
================================================
FILE: builddefs/disable_features.mk
================================================
# Unconditionally disable features that a keyboard advertises it doesn't support
FEATURE_NAMES :=
FEATURE_NAMES += AUDIO
FEATURE_NAMES += BACKLIGHT
FEATURE_NAMES += BLUETOOTH
FEATURE_NAMES += DIP_SWITCH
FEATURE_NAMES += DYNAMIC_KEYMAP
FEATURE_NAMES += ENCODER
FEATURE_NAMES += HAPTIC
FEATURE_NAMES += HD44780
FEATURE_NAMES += IOS_DEVICE
FEATURE_NAMES += LCD_BACKLIGHT
FEATURE_NAMES += LCD
FEATURE_NAMES += OLED
FEATURE_NAMES += POINTING_DEVICE
FEATURE_NAMES += PS2_MOUSE
FEATURE_NAMES += RGBLIGHT
FEATURE_NAMES += RGB_MATRIX
FEATURE_NAMES += SLEEP_LED
FEATURE_NAMES += STENO
FEATURE_NAMES += SWAP_HANDS
FEATURE_NAMES += WATCHDOG
FEATURE_NAMES += XT
$(foreach AFEATURE,$(FEATURE_NAMES),\
$(if $(filter $($(AFEATURE)_SUPPORTED),no),$(eval $(AFEATURE)_ENABLE=no)))
================================================
FILE: builddefs/docsgen/.gitignore
================================================
node_modules
.vitepress/cache
.vitepress/.temp
.vitepress/dist
docs
================================================
FILE: builddefs/docsgen/.vitepress/config.mts
================================================
import { defineConfig } from "vitepress";
import { tabsMarkdownPlugin } from "vitepress-plugin-tabs";
import sidebar from "../../../docs/_sidebar.json";
// https://vitepress.dev/reference/site-config
export default defineConfig(({ mode }) => {
const prod = mode === "production";
return {
title: "QMK Firmware",
description: "Documentation for QMK Firmware",
srcDir: prod ? "docs" : "../../docs",
outDir: "../../.build/docs",
cleanUrls: true,
markdown: {
config(md) {
md.use(tabsMarkdownPlugin);
},
},
vite: {
resolve: {
preserveSymlinks: true,
},
},
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
logo: {
light: "/qmk-logo-light.svg",
dark: "/qmk-logo-dark.svg",
},
title: 'QMK Firmware',
nav: [{ text: "Home", link: "/" }],
search: {
provider: "local",
},
editLink: {
pattern: 'https://github.com/qmk/qmk_firmware/edit/master/docs/:path'
},
lastUpdated: true,
sidebar: sidebar,
externalLinkIcon: true,
socialLinks: [
{ icon: { svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 29 3 C 28.0625 3 27.164063 3.382813 26.5 4 C 25.835938 4.617188 25.363281 5.433594 25 6.40625 C 24.355469 8.140625 24.085938 10.394531 24.03125 13.03125 C 19.234375 13.179688 14.820313 14.421875 11.28125 16.46875 C 10.214844 15.46875 8.855469 14.96875 7.5 14.96875 C 6.089844 14.96875 4.675781 15.511719 3.59375 16.59375 C 1.425781 18.761719 1.425781 22.238281 3.59375 24.40625 L 3.84375 24.65625 C 3.3125 26.035156 3 27.488281 3 29 C 3 33.527344 5.566406 37.585938 9.5625 40.4375 C 13.558594 43.289063 19.007813 45 25 45 C 30.992188 45 36.441406 43.289063 40.4375 40.4375 C 44.433594 37.585938 47 33.527344 47 29 C 47 27.488281 46.6875 26.035156 46.15625 24.65625 L 46.40625 24.40625 C 48.574219 22.238281 48.574219 18.761719 46.40625 16.59375 C 45.324219 15.511719 43.910156 14.96875 42.5 14.96875 C 41.144531 14.96875 39.785156 15.46875 38.71875 16.46875 C 35.195313 14.433594 30.800781 13.191406 26.03125 13.03125 C 26.09375 10.546875 26.363281 8.46875 26.875 7.09375 C 27.164063 6.316406 27.527344 5.757813 27.875 5.4375 C 28.222656 5.117188 28.539063 5 29 5 C 29.460938 5 29.683594 5.125 30.03125 5.40625 C 30.378906 5.6875 30.785156 6.148438 31.3125 6.6875 C 32.253906 7.652344 33.695313 8.714844 36.09375 8.9375 C 36.539063 11.238281 38.574219 13 41 13 C 43.75 13 46 10.75 46 8 C 46 5.25 43.75 3 41 3 C 38.605469 3 36.574219 4.710938 36.09375 6.96875 C 34.3125 6.796875 33.527344 6.109375 32.75 5.3125 C 32.300781 4.851563 31.886719 4.3125 31.3125 3.84375 C 30.738281 3.375 29.9375 3 29 3 Z M 41 5 C 42.667969 5 44 6.332031 44 8 C 44 9.667969 42.667969 11 41 11 C 39.332031 11 38 9.667969 38 8 C 38 6.332031 39.332031 5 41 5 Z M 25 15 C 30.609375 15 35.675781 16.613281 39.28125 19.1875 C 42.886719 21.761719 45 25.226563 45 29 C 45 32.773438 42.886719 36.238281 39.28125 38.8125 C 35.675781 41.386719 30.609375 43 25 43 C 19.390625 43 14.324219 41.386719 10.71875 38.8125 C 7.113281 36.238281 5 32.773438 5 29 C 5 25.226563 7.113281 21.761719 10.71875 19.1875 C 14.324219 16.613281 19.390625 15 25 15 Z M 7.5 16.9375 C 8.203125 16.9375 8.914063 17.148438 9.53125 17.59375 C 7.527344 19.03125 5.886719 20.769531 4.75 22.71875 C 3.582031 21.296875 3.660156 19.339844 5 18 C 5.714844 17.285156 6.609375 16.9375 7.5 16.9375 Z M 42.5 16.9375 C 43.390625 16.9375 44.285156 17.285156 45 18 C 46.339844 19.339844 46.417969 21.296875 45.25 22.71875 C 44.113281 20.769531 42.472656 19.03125 40.46875 17.59375 C 41.085938 17.148438 41.796875 16.9375 42.5 16.9375 Z M 17 22 C 14.800781 22 13 23.800781 13 26 C 13 28.199219 14.800781 30 17 30 C 19.199219 30 21 28.199219 21 26 C 21 23.800781 19.199219 22 17 22 Z M 33 22 C 30.800781 22 29 23.800781 29 26 C 29 28.199219 30.800781 30 33 30 C 35.199219 30 37 28.199219 37 26 C 37 23.800781 35.199219 22 33 22 Z M 17 24 C 18.117188 24 19 24.882813 19 26 C 19 27.117188 18.117188 28 17 28 C 15.882813 28 15 27.117188 15 26 C 15 24.882813 15.882813 24 17 24 Z M 33 24 C 34.117188 24 35 24.882813 35 26 C 35 27.117188 34.117188 28 33 28 C 31.882813 28 31 27.117188 31 26 C 31 24.882813 31.882813 24 33 24 Z M 34.15625 33.84375 C 34.101563 33.851563 34.050781 33.859375 34 33.875 C 33.683594 33.9375 33.417969 34.144531 33.28125 34.4375 C 33.28125 34.4375 32.757813 35.164063 31.4375 36 C 30.117188 36.835938 28.058594 37.6875 25 37.6875 C 21.941406 37.6875 19.882813 36.835938 18.5625 36 C 17.242188 35.164063 16.71875 34.4375 16.71875 34.4375 C 16.492188 34.082031 16.066406 33.90625 15.65625 34 C 15.332031 34.082031 15.070313 34.316406 14.957031 34.632813 C 14.84375 34.945313 14.894531 35.292969 15.09375 35.5625 C 15.09375 35.5625 15.863281 36.671875 17.46875 37.6875 C 19.074219 38.703125 21.558594 39.6875 25 39.6875 C 28.441406 39.6875 30.925781 38.703125 32.53125 37.6875 C 34.136719 36.671875 34.90625 35.5625 34.90625 35.5625 C 35.207031 35.273438 35.296875 34.824219 35.128906 34.441406 C 34.960938 34.058594 34.574219 33.820313 34.15625 33.84375 Z"/></svg>' }, link: "https://reddit.com/r/olkb" },
{ icon: "discord", link: "https://discord.gg/qmk" },
{ icon: "github", link: "https://github.com/qmk/qmk_firmware" },
],
}
};
});
================================================
FILE: builddefs/docsgen/.vitepress/theme/QMKLayout.vue
================================================
<script setup>
import DefaultTheme from 'vitepress/theme'
import { useRouter } from 'vitepress'
import { onBeforeMount } from 'vue';
import aliases from "../../../../docs/_aliases.json";
const router = useRouter()
onBeforeMount(async () => {
// Convert from docsify-style to vitepress-style URLs
let newUrl = window.location.href.replace(/\/#\//, '/').replace(/\?id=/, '#');
// Convert any aliases
let testUrl = new URL(newUrl);
while (testUrl.pathname in aliases) {
testUrl.pathname = aliases[testUrl.pathname];
}
newUrl = testUrl.toString();
// Redirect if required
if (newUrl != window.location.href) {
window.history.replaceState({}, '', newUrl);
await router.go(newUrl);
}
});
</script>
<template>
<DefaultTheme.Layout/>
</template>
================================================
FILE: builddefs/docsgen/.vitepress/theme/custom.css
================================================
/* Override <kbd> as vitepress doesn't put them with borders */
kbd {
border: 1px solid var(--vp-c-text-1);
border-radius: 5px;
margin: 0.2em;
padding: 0.2em;
}
:root {
--vp-nav-logo-height: 32px;
--vp-layout-max-width: calc(98% + 64px);
--vp-sidebar-width: 300px;
}
.VPDoc.has-aside .content-container {
max-width: unset !important;
}
================================================
FILE: builddefs/docsgen/.vitepress/theme/index.ts
================================================
import type { Theme } from 'vitepress'
import DefaultTheme from 'vitepress/theme'
import { enhanceAppWithTabs } from 'vitepress-plugin-tabs/client'
import QMKLayout from './QMKLayout.vue'
import './custom.css'
export default {
extends: DefaultTheme,
Layout: QMKLayout,
enhanceApp({ app }) {
enhanceAppWithTabs(app)
}
} satisfies Theme
================================================
FILE: builddefs/docsgen/build-docs.sh
================================================
#!/usr/bin/env bash
cd "$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
yarn install
[[ -e docs ]] || ln -sf ../../docs docs
DEBUG='vitepress:*,vite:*' yarn run docs:build
================================================
FILE: builddefs/docsgen/package.json
================================================
{
"license": "GPL-2.0-or-later",
"devDependencies": {
"vite": "^5.4.18",
"vitepress": "^1.1.0",
"vitepress-plugin-tabs": "^0.5.0",
"vue": "^3.4.24"
},
"scripts": {
"docs:dev": "vitepress dev --host 0.0.0.0",
"docs:build": "vitepress build",
"docs:preview": "vitepress preview --host 0.0.0.0"
}
}
================================================
FILE: builddefs/docsgen/start-docs.sh
================================================
#!/usr/bin/env bash
cd "$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
yarn install
DEBUG='vitepress:*,vite:*' yarn run docs:dev
================================================
FILE: builddefs/generic_features.mk
================================================
# Copyright 2021 QMK
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
GRAVE_ESC_ENABLE ?= yes
MAGIC_ENABLE ?= yes
SEND_STRING_ENABLE ?= yes
SPACE_CADET_ENABLE ?= yes
GENERIC_FEATURES = \
AUTO_SHIFT \
AUTOCORRECT \
BOOTMAGIC \
CAPS_WORD \
COMBO \
COMMAND \
CONNECTION \
CRC \
DEFERRED_EXEC \
DIGITIZER \
DIP_SWITCH \
DYNAMIC_KEYMAP \
DYNAMIC_MACRO \
DYNAMIC_TAPPING_TERM \
GRAVE_ESC \
HAPTIC \
KEYCODE_STRING \
KEY_LOCK \
KEY_OVERRIDE \
LAYER_LOCK \
LEADER \
MAGIC \
MOUSEKEY \
MUSIC \
OS_DETECTION \
PROGRAMMABLE_BUTTON \
REPEAT_KEY \
SECURE \
SEND_STRING \
SEQUENCER \
SPACE_CADET \
SWAP_HANDS \
TAP_DANCE \
TRI_LAYER \
VIA \
VIRTSER \
WPM \
define HANDLE_GENERIC_FEATURE
# $$(info "Processing: $1_ENABLE $2.c")
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/nvm/$$(NVM_DRIVER_LOWER)/nvm_$2.c)
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
OPT_DEFS += -D$1_ENABLE
endef
$(foreach F,$(GENERIC_FEATURES),\
$(if $(filter yes, $(strip $($(F)_ENABLE))),\
$(eval $(call HANDLE_GENERIC_FEATURE,$(F),$(shell echo $(F) | tr '[:upper:]' '[:lower:]'))) \
) \
)
================================================
FILE: builddefs/message.mk
================================================
COLOR ?= true
ifeq ($(COLOR),true)
NO_COLOR=\033[0m
OK_COLOR=\033[32;01m
ERROR_COLOR=\033[31;01m
WARN_COLOR=\033[33;01m
SKIPPED_COLOR=\033[36;01m
BLUE=\033[0;34m
BOLD=\033[1m
endif
ifneq ($(shell echo "1 2 3" | awk '{ printf "%2s", $$3; }' 2>/dev/null)," 3")
AWK=awk
else
AWK=cat && test
endif
ON_ERROR ?= exit 1
OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n
ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n
WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n
SKIPPED_STRING=$(SKIPPED_COLOR)[SKIPPED]$(NO_COLOR)\n
TAB_LOG = printf "\n%s\n\n" "$$LOG" | $(AWK) '{ sub(/^/," | "); print }'
TAB_LOG_PLAIN = printf "%s\n" "$$LOG"
AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }'
AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }'
PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && $(ON_ERROR)
PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG)
PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && $(ON_ERROR)
PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN)
PRINT_SKIPPED_PLAIN = ($(SILENT) || printf " $(SKIPPED_STRING)" | $(AWK_STATUS))
PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS)
BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi;
MAKE_MSG_FORMAT = $(AWK) '{ printf "%-118s", $$0;}'
# The UNSYNC_OUTPUT_CMD command disables the `--output-sync` for the current command, if the `--output-sync` granularity is `target` or lower.
# This is achieved by telling make to treat the current command as if it invokes a recursive make subcommand (as if by calling `$(MAKE)`).
UNSYNC_OUTPUT_CMD = +true
# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_ERRORS = $(ERROR_COLOR)Make finished with errors\n$(NO_COLOR)
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for flashing:
MSG_UF2 = Creating UF2 file for deployment:
MSG_EEPROM = Creating load file for EEPROM:
MSG_BIN = Creating binary load file for flashing:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_EXECUTING = Executing:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_COMPILING_CXX = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
MSG_CREATING_LIBRARY = Creating library:
MSG_GENERATING = Generating:
MSG_NOT_REPO = $(WARN_COLOR)WARNING:$(NO_COLOR) Target folder is not a git repo, you probably downloaded a zip file instead of cloning.\n\
Please consider following $(BOLD)https://docs.qmk.fm/\#/newbs_getting_started$(NO_COLOR).\n\n
MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR) Some git submodules are out of date or modified.\n\
Please consider running $(BOLD)qmk git-submodule$(NO_COLOR).\n\n
define GENERATE_MSG_MAKE_KB
MSG_MAKE_KB_ACTUAL := Making $$(KB_SP) with keymap $(BOLD)$$(CURRENT_KM)$(NO_COLOR)
ifneq ($$(MAKE_TARGET),)
MSG_MAKE_KB_ACTUAL += and target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR)
endif
endef
MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL)
define GENERATE_MSG_MAKE_TEST
MSG_MAKE_TEST_ACTUAL := Making test $(BOLD)$(TEST_NAME)$(NO_COLOR)
ifneq ($$(MAKE_TARGET),)
MSG_MAKE_TEST_ACTUAL += with target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR)
endif
endef
MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL)
MSG_TEST = Testing $(BOLD)$(TEST_NAME)$(NO_COLOR)
define GENERATE_MSG_AVAILABLE_KEYMAPS
MSG_AVAILABLE_KEYMAPS_ACTUAL := Available keymaps for $(BOLD)$$(CURRENT_KB)$(NO_COLOR):
endef
MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL)
MSG_BOOTLOADER_NOT_FOUND_BASE = Bootloader not found. Make sure the board is in bootloader mode. See https://docs.qmk.fm/\#/newbs_flashing\n
MSG_CHECK_STACKSIZE = Checking stack size of $(TARGET)
MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT)
MSG_MEMORY_OVERFLOW = $(ERROR_COLOR)RAM usage (not including stack) exceeds available RAM by $(RAM_OVERFLOW_AMOUNT) bytes\n
MSG_STACK_SIZE = Available stack size: $(STACK_SIZE) bytes\n
MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n
MSG_FILE_TOO_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n
MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
MSG_FILE_NEAR_LIMIT = The firmware size is approaching the maximum - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
MSG_PYTHON_MISSING = $(ERROR_COLOR)ERROR:$(NO_COLOR) Cannot run \"qmk hello\"!\n\n\
Please run $(BOLD)qmk setup$(NO_COLOR) to install all the dependencies QMK requires.\n\n
MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n
MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again in 5s (Ctrl+C to cancel)\n
BOOTLOADER_RETRY_TIME ?= 0.5
MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
define WARNING_MESSAGE
$(shell printf "\n %-99s $(WARN_STRING)\n" "$1" >&2)
endef
define CATASTROPHIC_ERROR
$(shell printf "\n * %-99s $(ERROR_STRING)\n" "$2" >&2)
$(error $1)
endef
================================================
FILE: builddefs/show_options.mk
================================================
BUILD_OPTION_NAMES = \
BOOTMAGIC_ENABLE \
MOUSEKEY_ENABLE \
EXTRAKEY_ENABLE \
CONSOLE_ENABLE \
COMMAND_ENABLE \
NKRO_ENABLE \
CUSTOM_MATRIX \
DEBOUNCE_TYPE \
SPLIT_KEYBOARD \
DYNAMIC_KEYMAP_ENABLE \
USB_HID_ENABLE \
VIA_ENABLE
HARDWARE_OPTION_NAMES = \
SLEEP_LED_ENABLE \
BACKLIGHT_ENABLE \
BACKLIGHT_DRIVER \
RGBLIGHT_ENABLE \
RGBLIGHT_DRIVER \
RGB_MATRIX_ENABLE \
RGB_MATRIX_DRIVER \
CIE1931_CURVE \
MIDI_ENABLE \
BLUETOOTH_ENABLE \
BLUETOOTH_DRIVER \
AUDIO_ENABLE \
HD44780_ENABLE \
ENCODER_ENABLE \
LED_TABLES \
POINTING_DEVICE_ENABLE \
DIP_SWITCH_ENABLE
OTHER_OPTION_NAMES = \
UNICODE_ENABLE \
UCIS_ENABLE \
UNICODEMAP_ENABLE \
UNICODE_COMMON \
AUTO_SHIFT_ENABLE \
DYNAMIC_TAPPING_TERM_ENABLE \
COMBO_ENABLE \
KEY_LOCK_ENABLE \
KEY_OVERRIDE_ENABLE \
LEADER_ENABLE \
STENO_ENABLE \
STENO_PROTOCOL \
TAP_DANCE_ENABLE \
VIRTSER_ENABLE \
OLED_ENABLE \
OLED_DRIVER \
LED_BACK_ENABLE \
LED_UNDERGLOW_ENABLE \
LED_ANIMATIONS \
IOS_DEVICE_ENABLE \
HELIX ZINC \
AUTOLOG_ENABLE \
DEBUG_ENABLE \
ENCODER_MAP_ENABLE \
ENCODER_ENABLE_CUSTOM \
GERMAN_ENABLE \
HAPTIC_ENABLE \
KEYLOGGER_ENABLE \
LCD_BACKLIGHT_ENABLE \
MACROS_ENABLED \
PS2_ENABLE \
PS2_MOUSE_ENABLE \
PS2_DRIVER \
RAW_ENABLE \
SWAP_HANDS_ENABLE \
WATCHDOG_ENABLE \
ERGOINU \
NO_USB_STARTUP_CHECK \
DISABLE_PROMICRO_LEDs \
MITOSIS_DATAGROK_BOTTOMSPACE \
MITOSIS_DATAGROK_SLOWUART \
RGB_MATRIX_KEYPRESSES \
LED_MIRRORED \
RGBLIGHT_FULL_POWER \
LTO_ENABLE \
PROGRAMMABLE_BUTTON_ENABLE \
SECURE_ENABLE \
CAPS_WORD_ENABLE \
AUTOCORRECT_ENABLE \
TRI_LAYER_ENABLE \
REPEAT_KEY_ENABLE
define NAME_ECHO
@printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)"
endef
define YAML_NAME_ECHO
@echo ' $1 : "$(strip $($1))"'
endef
.PHONY: show_build_options0 show_build_options
show_build_options0:
@echo " KEYBOARD = $(KEYBOARD)"
@echo " KEYMAP = $(KEYMAP)"
@echo " MCU = $(MCU)"
@echo " MCU_SERIES = $(MCU_SERIES)"
@echo " PLATFORM = $(PLATFORM)"
@echo " BOOTLOADER = $(BOOTLOADER)"
@echo " FIRMWARE_FORMAT = $(FIRMWARE_FORMAT)"
@echo
@echo "Build Options:"
$(foreach A_OPTION_NAME,$(sort $(BUILD_OPTION_NAMES)),\
$(call NAME_ECHO,$(A_OPTION_NAME)))
show_build_options: show_build_options0
@echo
@echo "If you want to know more, please try 'show_all_features' or 'show_full_features'"
@echo
.PHONY: show_all_features
show_all_features: show_build_options0
@echo
@echo "Hardware Options:"
$(foreach A_OPTION_NAME,$(sort $(HARDWARE_OPTION_NAMES)),\
$(if $($(A_OPTION_NAME)),$(call NAME_ECHO,$(A_OPTION_NAME))))
@echo
@echo "Other Options:"
$(foreach A_OPTION_NAME,$(sort $(OTHER_OPTION_NAMES)),\
$(if $($(A_OPTION_NAME)),$(call NAME_ECHO,$(A_OPTION_NAME))))
.PHONY: show_full_features
show_full_features: show_build_options0
@echo
@echo "Hardware Options:"
$(foreach A_OPTION_NAME,$(sort $(HARDWARE_OPTION_NAMES)),\
$(call NAME_ECHO,$(A_OPTION_NAME)))
@echo
@echo "Other Options:"
$(foreach A_OPTION_NAME,$(sort $(OTHER_OPTION_NAMES)),\
$(call NAME_ECHO,$(A_OPTION_NAME)))
.PHONY: yaml_build_options
yaml_build_options:
@echo '- KEYBOARD : "$(KEYBOARD)"'
@echo ' KEYMAP : "$(KEYMAP)"'
@echo ' MCU : "$(MCU)"'
@echo ' MCU_SERIES : "$(MCU_SERIES)"'
@echo ' PLATFORM : "$(PLATFORM)"'
@echo ' FIRMWARE_FORMAT : "$(FIRMWARE_FORMAT)"'
$(foreach A_OPTION_NAME,$(sort $(BUILD_OPTION_NAMES)),\
$(call YAML_NAME_ECHO,$(A_OPTION_NAME)))
$(foreach A_OPTION_NAME,$(sort $(HARDWARE_OPTION_NAMES)),\
$(if $($(A_OPTION_NAME)),$(call YAML_NAME_ECHO,$(A_OPTION_NAME))))
$(foreach A_OPTION_NAME,$(sort $(OTHER_OPTION_NAMES)),\
$(if $($(A_OPTION_NAME)),$(call YAML_NAME_ECHO,$(A_OPTION_NAME))))
================================================
FILE: builddefs/support.mk
================================================
# Helper to determine if a compiler option is supported
# Args:
# $(1) = option to test, if successful will be output
# $(2) = option to use if $(1) is not supported
# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
cc-option = $(shell \
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
then echo "$(1)"; else echo "$(2)"; fi)
# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
, := ,
================================================
FILE: builddefs/testlist.mk
================================================
TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f -name test.mk)))
FULL_TESTS := $(notdir $(TEST_LIST))
include $(QUANTUM_PATH)/debounce/tests/testlist.mk
include $(QUANTUM_PATH)/encoder/tests/testlist.mk
include $(QUANTUM_PATH)/os_detection/tests/testlist.mk
include $(QUANTUM_PATH)/sequencer/tests/testlist.mk
include $(QUANTUM_PATH)/wear_leveling/tests/testlist.mk
include $(PLATFORM_PATH)/test/testlist.mk
define VALIDATE_TEST_LIST
ifneq ($1,)
ifeq ($$(findstring -,$1),-)
$$(call CATASTROPHIC_ERROR,Invalid test name,Test names can't contain '-', but '$1' does.)
else
$$(eval $$(call VALIDATE_TEST_LIST,$$(firstword $2),$$(wordlist 2,9999,$2)))
endif
endif
endef
$(eval $(call VALIDATE_TEST_LIST,$(firstword $(TEST_LIST)),$(wordlist 2,9999,$(TEST_LIST))))
================================================
FILE: data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson
================================================
{
"aliases": {
/*
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ ² │ & │ é │ " │ ' │ ( │ § │ è │ ! │ ç │ à │ ) │ - │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ │ A │ Z │ E │ R │ T │ Y │ U │ I │ O │ P │ ^ │ $ │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ Q │ S │ D │ F │ G │ H │ J │ K │ L │ M │ ù │ µ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
* │ │ < │ W │ X │ C │ V │ B │ N │ , │ ; │ : │ = │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
"KC_GRV": {
"key": "BE_SUP2",
"label": "²",
}
"KC_1": {
"key": "BE_AMPR",
"label": "&",
}
"KC_2": {
"key": "BE_EACU",
"label": "é",
}
"KC_3": {
"key": "BE_DQUO",
"label": "\"",
}
"KC_4": {
"key": "BE_QUOT",
"label": "'",
}
"KC_5": {
"key": "BE_LPRN",
"label": "(",
}
"KC_6": {
"key": "BE_SECT",
"label": "§",
}
"KC_7": {
"key": "BE_EGRV",
"label": "è",
}
"KC_8": {
"key": "BE_EXLM",
"label": "!",
}
"KC_9": {
"key": "BE_CCED",
"label": "ç",
}
"KC_0": {
"key": "BE_AGRV",
"label": "à",
}
"KC_MINS": {
"key": "BE_RPRN",
"label": ")",
}
"KC_EQL": {
"key": "BE_MINS",
"label": "-",
}
"KC_Q": {
"key": "BE_A",
"label": "A",
}
"KC_W": {
"key": "BE_Z",
"label": "Z",
}
"KC_E": {
"key": "BE_E",
"label": "E",
}
"KC_R": {
"key": "BE_R",
"label": "R",
}
"KC_T": {
"key": "BE_T",
"label": "T",
}
"KC_Y": {
"key": "BE_Y",
"label": "Y",
}
"KC_U": {
"key": "BE_U",
"label": "U",
}
"KC_I": {
"key": "BE_I",
"label": "I",
}
"KC_O": {
"key": "BE_O",
"label": "O",
}
"KC_P": {
"key": "BE_P",
"label": "P",
}
"KC_LBRC": {
"key": "BE_DCIR",
"label": "^ (dead)",
}
"KC_RBRC": {
"key": "BE_DLR",
"label": "$",
}
"KC_A": {
"key": "BE_Q",
"label": "Q",
}
"KC_S": {
"key": "BE_S",
"label": "S",
}
"KC_D": {
"key": "BE_D",
"label": "D",
}
"KC_F": {
"key": "BE_F",
"label": "F",
}
"KC_G": {
"key": "BE_G",
"label": "G",
}
"KC_H": {
"key": "BE_H",
"label": "H",
}
"KC_J": {
"key": "BE_J",
"label": "J",
}
"KC_K": {
"key": "BE_K",
"label": "K",
}
"KC_L": {
"key": "BE_L",
"label": "L",
}
"KC_SCLN": {
"key": "BE_M",
"label": "M",
}
"KC_QUOT": {
"key": "BE_UGRV",
"label": "ù",
}
"KC_NUHS": {
"key": "BE_MICR",
"label": "µ",
}
"KC_NUBS": {
"key": "BE_LABK",
"label": "<",
}
"KC_Z": {
"key": "BE_W",
"label": "W",
}
"KC_X": {
"key": "BE_X",
"label": "X",
}
"KC_C": {
"key": "BE_C",
"label": "C",
}
"KC_V": {
"key": "BE_V",
"label": "V",
}
"KC_B": {
"key": "BE_B",
"label": "B",
}
"KC_N": {
"key": "BE_N",
"label": "N",
}
"KC_M": {
"key": "BE_COMM",
"label": ",",
}
"KC_COMM": {
"key": "BE_SCLN",
"label": ";",
}
"KC_DOT": {
"key": "BE_COLN",
"label": ":",
}
"KC_SLSH": {
"key": "BE_EQL",
"label": "=",
}
/* Shifted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ ³ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ° │ _ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ │ │ │ │ │ │ │ │ │ │ │ ¨ │ * │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ │ │ │ │ │ │ │ │ │ │ % │ £ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
* │ │ > │ │ │ │ │ │ │ ? │ . │ / │ + │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
"S(BE_SUP2)": {
"key": "BE_SUP3",
"label": "³",
}
"S(BE_AMPR)": {
"key": "BE_1",
"label": "1",
}
"S(BE_EACU)": {
"key": "BE_2",
"label": "2",
}
"S(BE_DQUO)": {
"key": "BE_3",
"label": "3",
}
"S(BE_QUOT)": {
"key": "BE_4",
"label": "4",
}
"S(BE_LPRN)": {
"key": "BE_5",
"label": "5",
}
"S(BE_SECT)": {
"key": "BE_6",
"label": "6",
}
"S(BE_EGRV)": {
"key": "BE_7",
"label": "7",
}
"S(BE_EXLM)": {
"key": "BE_8",
"label": "8",
}
"S(BE_CCED)": {
"key": "BE_9",
"label": "9",
}
"S(BE_AGRV)": {
"key": "BE_0",
"label": "0",
}
"S(BE_RPRN)": {
"key": "BE_DEG",
"label": "°",
}
"S(BE_MINS)": {
"key": "BE_UNDS",
"label": "_",
}
"S(BE_DCIR)": {
"key": "BE_DIAE",
"label": "¨ (dead)",
}
"S(BE_DLR)": {
"key": "BE_ASTR",
"label": "*",
}
"S(BE_UGRV)": {
"key": "BE_PERC",
"label": "%",
}
"S(BE_MICR)": {
"key": "BE_PND",
"label": "£",
}
"S(BE_LABK)": {
"key": "BE_RABK",
"label": ">",
}
"S(BE_COMM)": {
"key": "BE_QUES",
"label": "?",
}
"S(BE_SCLN)": {
"key": "BE_DOT",
"label": ".",
}
"S(BE_COLN)": {
"key": "BE_SLSH",
"label": "/",
}
"S(BE_EQL)": {
"key": "BE_PLUS",
"label": "+",
}
/* AltGr symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ │ | │ @ │ # │ │ │ ^ │ │ │ { │ } │ │ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ │ │ │ € │ │ │ │ │ │ │ │ [ │ ] │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ │ │ │ │ │ │ │ │ │ │ ´ │ ` │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
* │ │ \ │ │ │ │ │ │ │ │ │ │ ~ │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
"ALGR(BE_AMPR)": {
"key": "BE_PIPE",
"label": "|",
}
"ALGR(BE_EACU)": {
"key": "BE_AT",
"label": "@",
}
"ALGR(BE_DQUO)": {
"key": "BE_HASH",
"label": "#",
}
"ALGR(BE_SECT)": {
"key": "BE_CIRC",
"label": "^",
}
"ALGR(BE_CCED)": {
"key": "BE_LCBR",
"label": "{",
}
"ALGR(BE_AGRV)": {
"key": "BE_RCBR",
"label": "}",
}
"ALGR(BE_E)": {
"key": "BE_EURO",
"label": "€",
}
"ALGR(BE_DCIR)": {
"key": "BE_LBRC",
"label": "[",
}
"ALGR(BE_DLR)": {
"key": "BE_RBRC",
"label": "]",
}
"ALGR(BE_UGRV)": {
"key": "BE_ACUT",
"label": "´ (dead)",
}
"ALGR(BE_MICR)": {
"key": "BE_GRV",
"label": "` (dead)",
}
"ALGR(BE_LABK)": {
"key": "BE_BSLS",
"label": "\\",
}
"ALGR(BE_EQL)": {
"key": "BE_TILD",
"label": "~",
}
}
}
================================================
FILE: data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson
================================================
{
"aliases": {
/*
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ $ │ " │ « │ » │ ( │ ) │ @ │ + │ - │ / │ * │ = │ % │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ │ B │ É │ P │ O │ È │ ^ │ V │ D │ L │ J │ Z │ W │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ A │ U │ I │ E │ , │ C │ T │ S │ R │ N │ M │ Ç │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
* │ │ Ê │ À │ Y │ X │ . │ K │ ' │ Q │ G │ H │ F │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
"KC_GRV": {
"key": "BP_DLR",
"label": "$",
}
"KC_1": {
"key": "BP_DQUO",
"label": "\"",
}
"KC_2": {
"key": "BP_LDAQ",
"label": "«",
}
"KC_3": {
"key": "BP_RDAQ",
"label": "»",
}
"KC_4": {
"key": "BP_LPRN",
"label": "(",
}
"KC_5": {
"key": "BP_RPRN",
"label": ")",
}
"KC_6": {
"key": "BP_AT",
"label": "@",
}
"KC_7": {
"key": "BP_PLUS",
"label": "+",
}
"KC_8": {
"key": "BP_MINS",
"label": "-",
}
"KC_9": {
"key": "BP_SLSH",
"label": "/",
}
"KC_0": {
"key": "BP_ASTR",
"label": "*",
}
"KC_MINS": {
"key": "BP_EQL",
"label": "=",
}
"KC_EQL": {
"key": "BP_PERC",
"label": "%",
}
"KC_Q": {
"key": "BP_B",
"label": "B",
}
"KC_W": {
"key": "BP_EACU",
"label": "É",
}
"KC_E": {
"key": "BP_P",
"label": "P",
}
"KC_R": {
"key": "BP_O",
"label": "O",
}
"KC_T": {
"key": "BP_EGRV",
"label": "È",
}
"KC_Y": {
"key": "BP_DCIR",
"label": "^ (dead)",
}
"KC_U": {
"key": "BP_V",
"label": "V",
}
"KC_I": {
"key": "BP_D",
"label": "D",
}
"KC_O": {
"key": "BP_L",
"label": "L",
}
"KC_P": {
"key": "BP_J",
"label": "J",
}
"KC_LBRC": {
"key": "BP_Z",
"label": "Z",
}
"KC_RBRC": {
"key": "BP_W",
"label": "W",
}
"KC_A": {
"key": "BP_A",
"label": "A",
}
"KC_S": {
"key": "BP_U",
"label": "U",
}
"KC_D": {
"key": "BP_I",
"label": "I",
}
"KC_F": {
"key": "BP_E",
"label": "E",
}
"KC_G": {
"key": "BP_COMM",
"label": ",",
}
"KC_H": {
"key": "BP_C",
"label": "C",
}
"KC_J": {
"key": "BP_T",
"label": "T",
}
"KC_K": {
"key": "BP_S",
"label": "S",
}
"KC_L": {
"key": "BP_R",
"label": "R",
}
"KC_SCLN": {
"key": "BP_N",
"label": "N",
}
"KC_QUOT": {
"key": "BP_M",
"label": "M",
}
"KC_BSLS": {
"key": "BP_CCED",
"label": "Ç",
}
"KC_NUBS": {
"key": "BP_ECIR",
"label": "Ê",
}
"KC_Z": {
"key": "BP_AGRV",
"label": "À",
}
"KC_X": {
"key": "BP_Y",
"label": "Y",
}
"KC_C": {
"key": "BP_X",
"label": "X",
}
"KC_V": {
"key": "BP_DOT",
"label": ".",
}
"KC_B": {
"key": "BP_K",
"label": "K",
}
"KC_N": {
"key": "BP_QUOT",
"label": "'",
}
"KC_M": {
"key": "BP_Q",
"label": "Q",
}
"KC_COMM": {
"key": "BP_G",
"label": "G",
}
"KC_DOT": {
"key": "BP_H",
"label": "H",
}
"KC_SLSH": {
"key": "BP_F",
"label": "F",
}
/* Shifted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ # │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ° │ ` │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ │ │ │ │ │ │ ! │ │ │ │ │ │ │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ │ │ │ │ ; │ │ │ │ │ │ │ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
* │ │ │ │ │ │ : │ │ ? │ │ │ │ │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
"S(BP_DLR)": {
"key": "BP_HASH",
"label": "#",
}
"S(BP_DQUO)": {
"key": "BP_1",
"label": "1",
}
"S(BP_LDAQ)": {
"key": "BP_2",
"label": "2",
}
"S(BP_RDAQ)": {
"key": "BP_3",
"label": "3",
}
"S(BP_LPRN)": {
"key": "BP_4",
"label": "4",
}
"S(BP_RPRN)": {
"key": "BP_5",
"label": "5",
}
"S(BP_AT)": {
"key": "BP_6",
"label": "6",
}
"S(BP_PLUS)": {
"key": "BP_7",
"label": "7",
}
"S(BP_MINS)": {
"key": "BP_8",
"label": "8",
}
"S(BP_SLSH)": {
"key": "BP_9",
"label": "9",
}
"S(BP_ASTR)": {
"key": "BP_0",
"label": "0",
}
"S(BP_EQL)": {
"key": "BP_DEG",
"label": "°",
}
"S(BP_PERC)": {
"key": "BP_GRV",
"label": "`",
}
"S(BP_DCIR)": {
"key": "BP_EXLM",
"label": "!",
}
"S(BP_COMM)": {
"key": "BP_SCLN",
"label": ";",
}
"S(BP_DOT)": {
"key": "BP_COLN",
"label": ":",
}
"S(BP_QUOT)": {
"key": "BP_QUES",
"label": "?",
}
"S(KC_SPC)": {
"key": "BP_NBSP",
"label": "(non-breaking space)",
}
/* AltGr symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ – │ — │ < │ > │ [ │ ] │ ^ │ ± │ − │ ÷ │ × │ ≠ │ ‰ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ │ | │ ´ │ & │ Œ │ ` │ ¡ │ ˇ │ Ð │ / │ IJ │ Ə │ ˘ │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ Æ │ Ù │ ¨ │ € │ │ © │ Þ │ ẞ │ ® │ ~ │ ¯ │ ¸ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
* │ │ │ \ │ { │ } │ … │ ~ │ ¿ │ ° │ │ † │ ˛ │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │ │ │ │ _ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
"ALGR(BP_DLR)": {
"key": "BP_NDSH",
"label": "–",
}
"ALGR(BP_DQUO)": {
"key": "BP_MDSH",
"label": "—",
}
"ALGR(BP_LDAQ)": {
"key": "BP_LABK",
"label": "<",
}
"ALGR(BP_RDAQ)": {
"key": "BP_RABK",
"label": ">",
}
"ALGR(BP_LPRN)": {
"key": "BP_LBRC",
"label": "[",
}
"ALGR(BP_RPRN)": {
"key": "BP_RBRC",
"label": "]",
}
"ALGR(BP_AT)": {
"key": "BP_CIRC",
"label": "^",
}
"ALGR(BP_PLUS)": {
"key": "BP_PLMN",
"label": "±",
}
"ALGR(BP_MINS)": {
"key": "BP_MMNS",
"label": "−",
}
"ALGR(BP_SLSH)": {
"key": "BP_DIV",
"label": "÷",
}
"ALGR(BP_ASTR)": {
"key": "BP_MUL",
"label": "×",
}
"ALGR(BP_EQL)": {
"key": "BP_NEQL",
"label": "≠",
}
"ALGR(BP_PERC)": {
"key": "BP_PERM",
"label": "‰",
}
"ALGR(BP_B)": {
"key": "BP_PIPE",
"label": "|",
}
"ALGR(BP_EACU)": {
"key": "BP_ACUT",
"label": "´ (dead)",
}
"ALGR(BP_P)": {
"key": "BP_AMPR",
"label": "&",
}
"ALGR(BP_O)": {
"key": "BP_OE",
"label": "Œ",
}
"ALGR(BP_EGRV)": {
"key": "BP_DGRV",
"label": "` (dead)",
}
"ALGR(BP_DCIR)": {
"key": "BP_IEXL",
"label": "¡",
}
"ALGR(BP_V)": {
"key": "BP_CARN",
"label": "ˇ (dead)",
}
"ALGR(BP_D)": {
"key": "BP_ETH",
"label": "Ð",
}
"ALGR(BP_L)": {
"key": "BP_DSLS",
"label": "/ (dead)",
}
"ALGR(BP_J)": {
"key": "BP_IJ",
"label": "IJ",
}
"ALGR(BP_Z)": {
"key": "BP_SCHW",
"label": "Ə",
}
"ALGR(BP_W)": {
"key": "BP_BREV",
"label": "˘ (dead)",
}
"ALGR(BP_A)": {
"key": "BP_AE",
"label": "Æ",
}
"ALGR(BP_U)": {
"key": "BP_UGRV",
"label": "Ù",
}
"ALGR(BP_I)": {
"key": "BP_DIAE",
"label": "¨ (dead)",
}
"ALGR(BP_E)": {
"key": "BP_EURO",
"label": "€",
}
"ALGR(BP_C)": {
"key": "BP_COPY",
"label": "©",
}
"ALGR(BP_T)": {
"key": "BP_THRN",
"label": "Þ",
}
"ALGR(BP_S)": {
"key": "BP_SS",
"label": "ẞ",
}
"ALGR(BP_R)": {
"key": "BP_REGD",
"label": "®",
}
"ALGR(BP_N)": {
"key": "BP_DTIL",
"label": "~ (dead)",
}
"ALGR(BP_M)": {
"key": "BP_MACR",
"label": "¯ (dead)",
}
"ALGR(BP_CCED)": {
"key": "BP_CEDL",
"label": "¸ (dead)",
}
"ALGR(BP_AGRV)": {
"key": "BP_BSLS",
"label": "\\",
}
"ALGR(BP_Y)": {
"key": "BP_LCBR",
"label": "{",
}
"ALGR(BP_X)": {
"key": "BP_RCBR",
"label": "}",
}
"ALGR(BP_DOT)": {
"key": "BP_ELLP",
"label": "…",
}
"ALGR(BP_K)": {
"key": "BP_TILD",
"label": "~",
}
"ALGR(BP_QUES)": {
"key": "BP_IQUE",
"label": "¿",
}
"ALGR(BP_Q)": {
"key": "BP_RNGA",
"label": "° (dead)",
}
"ALGR(BP_G)": {
"key": "BP_DGRK",
"label": "µ (dead Greek key)",
}
"ALGR(BP_H)": {
"key": "BP_DAGG",
"label": "†",
}
"ALGR(BP_F)": {
"key": "BP_OGON",
"label": "˛ (dead)",
}
"ALGR(KC_SPC)": {
"key": "BP_UNDS",
"label": "_",
}
/* Shift+AltGr symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │ ¶ │ „ │ “ │ ” │ ≤ │ ≥ │ │ ¬ │ ¼ │ ½ │ ¾ │ ′ │ ″ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │ │ ¦ │ ˝ │ § │ │ │ │ │ │ │ │ │ │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ │ │ ˙ │ ¤ │ ̛ │ ſ │ │ │ ™ │ │ º │ , │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
* │ │ │ │ ‘ │ ’ │ · │ ⌨ │ ̉ │ ̣ │ │ ‡ │ ª │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
* │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
"S(ALGR(BP_DLR))": {
"key": "BP_PARA",
"label": "¶",
}
"S(ALGR(BP_DQUO))": {
"key": "BP_DLQU",
"label": "„",
}
"S(ALGR(BP_LDAQ))": {
"key": "BP_LDQU",
"label": "“",
}
"S(ALGR(BP_RDAQ))": {
"key": "BP_RDQU",
"label": "”",
}
"S(ALGR(BP_LPRN))": {
"key": "BP_LEQL",
"label": "≤",
}
"S(ALGR(BP_RPRN))": {
"key": "BP_GEQL",
"label": "≥",
}
"S(ALGR(BP_PLUS))": {
"key": "BP_NOT",
"label": "¬",
}
"S(ALGR(BP_MINS))": {
"key": "BP_QRTR",
"label": "¼",
}
"S(ALGR(BP_SLSH))": {
"key": "BP_HALF",
"label": "½",
}
"S(ALGR(BP_ASTR))": {
"key": "BP_TQTR",
"label": "¾",
}
"S(ALGR(BP_EQL))": {
"key": "BP_PRIM",
"label": "′",
}
"S(ALGR(BP_PERC))": {
"key": "BP_DPRM",
"label": "″",
}
"S(ALGR(BP_B))": {
"key": "BP_BRKP",
"label": "¦",
}
"S(ALGR(BP_EACU))": {
"key": "BP_DACU",
"label": "˝ (dead)",
}
"S(ALGR(BP_P))": {
"key": "BP_SECT",
"label": "§",
}
"S(ALGR(BP_I))": {
"key": "BP_DOTA",
"label": "˙ (dead)",
}
"S(ALGR(BP_E))": {
"key": "BP_CURR",
"label": "¤ (dead)",
}
"S(ALGR(BP_COMM))": {
"key": "BP_HORN",
"label": "̛ (dead)",
}
"S(ALGR(BP_C))": {
"key": "BP_LNGS",
"label": "ſ",
}
"S(ALGR(BP_R))": {
"key": "BP_TM",
"label": "™",
}
"S(ALGR(BP_M))": {
"key": "BP_MORD",
"label": "º",
}
"S(ALGR(BP_CCED))
gitextract_f7a0y425/
├── .clang-format
├── .clangd
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── feature_request.yml
│ │ ├── other_issues.yml
│ │ └── zzz_blank.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ ├── labeler.yml
│ └── workflows/
│ ├── build.yml
│ ├── format.yml
│ ├── lint.yml
│ ├── regen.yml
│ └── unit_test.yml
├── .gitignore
├── .gitmodules
├── Doxyfile
├── LICENSE
├── Makefile
├── builddefs/
│ ├── build_full_test.mk
│ ├── build_json.mk
│ ├── build_keyboard.mk
│ ├── build_layout.mk
│ ├── build_test.mk
│ ├── common_features.mk
│ ├── common_rules.mk
│ ├── converters.mk
│ ├── disable_features.mk
│ ├── docsgen/
│ │ ├── .gitignore
│ │ ├── .vitepress/
│ │ │ ├── config.mts
│ │ │ └── theme/
│ │ │ ├── QMKLayout.vue
│ │ │ ├── custom.css
│ │ │ └── index.ts
│ │ ├── build-docs.sh
│ │ ├── package.json
│ │ └── start-docs.sh
│ ├── generic_features.mk
│ ├── message.mk
│ ├── show_options.mk
│ ├── support.mk
│ └── testlist.mk
├── data/
│ ├── constants/
│ │ ├── keycodes/
│ │ │ ├── extras/
│ │ │ │ ├── keycodes_belgian_0.0.1.hjson
│ │ │ │ ├── keycodes_bepo_0.0.1.hjson
│ │ │ │ ├── keycodes_brazilian_abnt2_0.0.1.hjson
│ │ │ │ ├── keycodes_canadian_french_0.0.1.hjson
│ │ │ │ ├── keycodes_canadian_multilingual_0.0.1.hjson
│ │ │ │ ├── keycodes_colemak_0.0.1.hjson
│ │ │ │ ├── keycodes_croatian_0.0.1.hjson
│ │ │ │ ├── keycodes_czech_0.0.1.hjson
│ │ │ │ ├── keycodes_czech_mac_ansi_0.0.1.hjson
│ │ │ │ ├── keycodes_czech_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_danish_0.0.1.hjson
│ │ │ │ ├── keycodes_dvorak_0.0.1.hjson
│ │ │ │ ├── keycodes_dvorak_fr_0.0.1.hjson
│ │ │ │ ├── keycodes_dvorak_programmer_0.0.1.hjson
│ │ │ │ ├── keycodes_estonian_0.0.1.hjson
│ │ │ │ ├── keycodes_eurkey_0.0.1.hjson
│ │ │ │ ├── keycodes_farsi_0.0.1.hjson
│ │ │ │ ├── keycodes_finnish_0.0.1.hjson
│ │ │ │ ├── keycodes_french_0.0.1.hjson
│ │ │ │ ├── keycodes_french_afnor_0.0.1.hjson
│ │ │ │ ├── keycodes_french_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_german_0.0.1.hjson
│ │ │ │ ├── keycodes_german_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_greek_0.0.1.hjson
│ │ │ │ ├── keycodes_hebrew_0.0.1.hjson
│ │ │ │ ├── keycodes_hungarian_0.0.1.hjson
│ │ │ │ ├── keycodes_icelandic_0.0.1.hjson
│ │ │ │ ├── keycodes_irish_0.0.1.hjson
│ │ │ │ ├── keycodes_italian_0.0.1.hjson
│ │ │ │ ├── keycodes_italian_mac_ansi_0.0.1.hjson
│ │ │ │ ├── keycodes_italian_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_japanese_0.0.1.hjson
│ │ │ │ ├── keycodes_korean_0.0.1.hjson
│ │ │ │ ├── keycodes_latvian_0.0.1.hjson
│ │ │ │ ├── keycodes_lithuanian_azerty_0.0.1.hjson
│ │ │ │ ├── keycodes_lithuanian_qwerty_0.0.1.hjson
│ │ │ │ ├── keycodes_neo2_0.0.1.hjson
│ │ │ │ ├── keycodes_nordic_0.0.1.hjson
│ │ │ │ ├── keycodes_norman_0.0.1.hjson
│ │ │ │ ├── keycodes_norwegian_0.0.1.hjson
│ │ │ │ ├── keycodes_plover_0.0.1.hjson
│ │ │ │ ├── keycodes_plover_dvorak_0.0.1.hjson
│ │ │ │ ├── keycodes_polish_0.0.1.hjson
│ │ │ │ ├── keycodes_portuguese_0.0.1.hjson
│ │ │ │ ├── keycodes_portuguese_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_romanian_0.0.1.hjson
│ │ │ │ ├── keycodes_russian_0.0.1.hjson
│ │ │ │ ├── keycodes_russian_typewriter_0.0.1.hjson
│ │ │ │ ├── keycodes_serbian_0.0.1.hjson
│ │ │ │ ├── keycodes_serbian_latin_0.0.1.hjson
│ │ │ │ ├── keycodes_slovak_0.0.1.hjson
│ │ │ │ ├── keycodes_slovenian_0.0.1.hjson
│ │ │ │ ├── keycodes_spanish_0.0.1.hjson
│ │ │ │ ├── keycodes_spanish_dvorak_0.0.1.hjson
│ │ │ │ ├── keycodes_spanish_latin_america_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_mac_ansi_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_pro_mac_ansi_0.0.1.hjson
│ │ │ │ ├── keycodes_swedish_pro_mac_iso_0.0.1.hjson
│ │ │ │ ├── keycodes_swiss_de_0.0.1.hjson
│ │ │ │ ├── keycodes_swiss_fr_0.0.1.hjson
│ │ │ │ ├── keycodes_turkish_f_0.0.1.hjson
│ │ │ │ ├── keycodes_turkish_q_0.0.1.hjson
│ │ │ │ ├── keycodes_uk_0.0.1.hjson
│ │ │ │ ├── keycodes_ukrainian_0.0.1.hjson
│ │ │ │ ├── keycodes_us_0.0.1.hjson
│ │ │ │ ├── keycodes_us_extended_0.0.1.hjson
│ │ │ │ ├── keycodes_us_international_0.0.1.hjson
│ │ │ │ ├── keycodes_us_international_linux_0.0.1.hjson
│ │ │ │ ├── keycodes_workman_0.0.1.hjson
│ │ │ │ └── keycodes_workman_zxcvm_0.0.1.hjson
│ │ │ ├── keycodes_0.0.1.hjson
│ │ │ ├── keycodes_0.0.1_audio.hjson
│ │ │ ├── keycodes_0.0.1_basic.hjson
│ │ │ ├── keycodes_0.0.1_joystick.hjson
│ │ │ ├── keycodes_0.0.1_lighting.hjson
│ │ │ ├── keycodes_0.0.1_macro.hjson
│ │ │ ├── keycodes_0.0.1_magic.hjson
│ │ │ ├── keycodes_0.0.1_midi.hjson
│ │ │ ├── keycodes_0.0.1_programmable_button.hjson
│ │ │ ├── keycodes_0.0.1_quantum.hjson
│ │ │ ├── keycodes_0.0.1_sequencer.hjson
│ │ │ ├── keycodes_0.0.1_steno.hjson
│ │ │ ├── keycodes_0.0.1_swap_hands.hjson
│ │ │ ├── keycodes_0.0.2.hjson
│ │ │ ├── keycodes_0.0.2_basic.hjson
│ │ │ ├── keycodes_0.0.2_kb.hjson
│ │ │ ├── keycodes_0.0.2_magic.hjson
│ │ │ ├── keycodes_0.0.2_midi.hjson
│ │ │ ├── keycodes_0.0.2_quantum.hjson
│ │ │ ├── keycodes_0.0.2_sequencer.hjson
│ │ │ ├── keycodes_0.0.2_swap_hands.hjson
│ │ │ ├── keycodes_0.0.2_user.hjson
│ │ │ ├── keycodes_0.0.3.hjson
│ │ │ ├── keycodes_0.0.3_quantum.hjson
│ │ │ ├── keycodes_0.0.4.hjson
│ │ │ ├── keycodes_0.0.4_lighting.hjson
│ │ │ ├── keycodes_0.0.4_quantum.hjson
│ │ │ ├── keycodes_0.0.5.hjson
│ │ │ ├── keycodes_0.0.5_basic.hjson
│ │ │ ├── keycodes_0.0.6.hjson
│ │ │ ├── keycodes_0.0.6_connection.hjson
│ │ │ ├── keycodes_0.0.6_quantum.hjson
│ │ │ └── keycodes_0.0.7.hjson
│ │ └── module_hooks/
│ │ ├── 0.1.0.hjson
│ │ ├── 1.0.0.hjson
│ │ ├── 1.1.0.hjson
│ │ └── 1.1.1.hjson
│ ├── mappings/
│ │ ├── defaults.hjson
│ │ ├── info_config.hjson
│ │ ├── info_defaults.hjson
│ │ ├── info_rules.hjson
│ │ └── keyboard_aliases.hjson
│ ├── schemas/
│ │ ├── api_keyboard.jsonschema
│ │ ├── community_module.jsonschema
│ │ ├── definitions.jsonschema
│ │ ├── keyboard.jsonschema
│ │ ├── keycodes.jsonschema
│ │ ├── keymap.jsonschema
│ │ ├── user_repo_v0.jsonschema
│ │ ├── user_repo_v1.jsonschema
│ │ └── user_repo_v1_1.jsonschema
│ └── templates/
│ ├── api/
│ │ └── readme.md
│ ├── config-overrides/
│ │ ├── chibios/
│ │ │ ├── board.h
│ │ │ ├── chconf.h
│ │ │ ├── halconf.h
│ │ │ └── mcuconf.h
│ │ └── common/
│ │ └── lv_conf.h
│ └── keyboard/
│ ├── keyboard.json
│ └── readme.md
├── doxygen-todo
├── drivers/
│ ├── backlight/
│ │ └── backlight_software.c
│ ├── battery/
│ │ ├── battery.c
│ │ ├── battery.h
│ │ ├── battery_adc.c
│ │ └── battery_driver.h
│ ├── bluetooth/
│ │ ├── bluefruit_le.cpp
│ │ ├── bluefruit_le.h
│ │ ├── bluetooth.c
│ │ ├── bluetooth.h
│ │ ├── bluetooth_drivers.c
│ │ ├── outputselect.h
│ │ ├── ringbuffer.hpp
│ │ ├── rn42.c
│ │ └── rn42.h
│ ├── eeprom/
│ │ ├── eeprom_custom.c-template
│ │ ├── eeprom_driver.c
│ │ ├── eeprom_driver.h
│ │ ├── eeprom_i2c.c
│ │ ├── eeprom_i2c.h
│ │ ├── eeprom_spi.c
│ │ ├── eeprom_spi.h
│ │ ├── eeprom_transient.c
│ │ ├── eeprom_transient.h
│ │ └── eeprom_wear_leveling.c
│ ├── encoder/
│ │ └── encoder_quadrature.c
│ ├── flash/
│ │ ├── flash.h
│ │ ├── flash_spi.c
│ │ └── flash_spi.h
│ ├── gpio/
│ │ ├── mcp23018.c
│ │ ├── mcp23018.h
│ │ ├── pca9505.c
│ │ ├── pca9505.h
│ │ ├── pca9555.c
│ │ ├── pca9555.h
│ │ ├── sn74x138.c
│ │ ├── sn74x138.h
│ │ ├── sn74x154.c
│ │ └── sn74x154.h
│ ├── haptic/
│ │ ├── drv2605l.c
│ │ ├── drv2605l.h
│ │ ├── solenoid.c
│ │ └── solenoid.h
│ ├── i2c_master.h
│ ├── lcd/
│ │ ├── hd44780.c
│ │ ├── hd44780.h
│ │ ├── st7565.c
│ │ └── st7565.h
│ ├── led/
│ │ ├── apa102.c
│ │ ├── apa102.h
│ │ ├── aw20216s.c
│ │ ├── aw20216s.h
│ │ ├── issi/
│ │ │ ├── is31fl3218-mono.c
│ │ │ ├── is31fl3218-mono.h
│ │ │ ├── is31fl3218.c
│ │ │ ├── is31fl3218.h
│ │ │ ├── is31fl3236-mono.c
│ │ │ ├── is31fl3236-mono.h
│ │ │ ├── is31fl3236.c
│ │ │ ├── is31fl3236.h
│ │ │ ├── is31fl3729-mono.c
│ │ │ ├── is31fl3729-mono.h
│ │ │ ├── is31fl3729.c
│ │ │ ├── is31fl3729.h
│ │ │ ├── is31fl3731-mono.c
│ │ │ ├── is31fl3731-mono.h
│ │ │ ├── is31fl3731.c
│ │ │ ├── is31fl3731.h
│ │ │ ├── is31fl3733-mono.c
│ │ │ ├── is31fl3733-mono.h
│ │ │ ├── is31fl3733.c
│ │ │ ├── is31fl3733.h
│ │ │ ├── is31fl3736-mono.c
│ │ │ ├── is31fl3736-mono.h
│ │ │ ├── is31fl3736.c
│ │ │ ├── is31fl3736.h
│ │ │ ├── is31fl3737-mono.c
│ │ │ ├── is31fl3737-mono.h
│ │ │ ├── is31fl3737.c
│ │ │ ├── is31fl3737.h
│ │ │ ├── is31fl3741-mono.c
│ │ │ ├── is31fl3741-mono.h
│ │ │ ├── is31fl3741.c
│ │ │ ├── is31fl3741.h
│ │ │ ├── is31fl3742a-mono.c
│ │ │ ├── is31fl3742a-mono.h
│ │ │ ├── is31fl3742a.c
│ │ │ ├── is31fl3742a.h
│ │ │ ├── is31fl3743a-mono.c
│ │ │ ├── is31fl3743a-mono.h
│ │ │ ├── is31fl3743a.c
│ │ │ ├── is31fl3743a.h
│ │ │ ├── is31fl3745-mono.c
│ │ │ ├── is31fl3745-mono.h
│ │ │ ├── is31fl3745.c
│ │ │ ├── is31fl3745.h
│ │ │ ├── is31fl3746a-mono.c
│ │ │ ├── is31fl3746a-mono.h
│ │ │ ├── is31fl3746a.c
│ │ │ └── is31fl3746a.h
│ │ ├── snled27351-mono.c
│ │ ├── snled27351-mono.h
│ │ ├── snled27351.c
│ │ ├── snled27351.h
│ │ ├── ws2812.c
│ │ └── ws2812.h
│ ├── oled/
│ │ ├── glcdfont.c
│ │ ├── licenses.txt
│ │ ├── oled_driver.c
│ │ └── oled_driver.h
│ ├── painter/
│ │ ├── comms/
│ │ │ ├── qp_comms_dummy.c
│ │ │ ├── qp_comms_dummy.h
│ │ │ ├── qp_comms_i2c.c
│ │ │ ├── qp_comms_i2c.h
│ │ │ ├── qp_comms_spi.c
│ │ │ └── qp_comms_spi.h
│ │ ├── gc9xxx/
│ │ │ ├── qp_gc9107.c
│ │ │ ├── qp_gc9107.h
│ │ │ ├── qp_gc9107_opcodes.h
│ │ │ ├── qp_gc9a01.c
│ │ │ ├── qp_gc9a01.h
│ │ │ ├── qp_gc9a01_opcodes.h
│ │ │ └── qp_gc9xxx_opcodes.h
│ │ ├── generic/
│ │ │ ├── qp_surface.h
│ │ │ ├── qp_surface_common.c
│ │ │ ├── qp_surface_internal.h
│ │ │ ├── qp_surface_mono1bpp.c
│ │ │ └── qp_surface_rgb565.c
│ │ ├── ili9xxx/
│ │ │ ├── qp_ili9163.c
│ │ │ ├── qp_ili9163.h
│ │ │ ├── qp_ili9341.c
│ │ │ ├── qp_ili9341.h
│ │ │ ├── qp_ili9486.c
│ │ │ ├── qp_ili9486.h
│ │ │ ├── qp_ili9488.c
│ │ │ ├── qp_ili9488.h
│ │ │ └── qp_ili9xxx_opcodes.h
│ │ ├── ld7032/
│ │ │ ├── qp_ld7032.c
│ │ │ ├── qp_ld7032.h
│ │ │ └── qp_ld7032_opcodes.h
│ │ ├── oled_panel/
│ │ │ ├── qp_oled_panel.c
│ │ │ └── qp_oled_panel.h
│ │ ├── sh1106/
│ │ │ ├── qp_sh1106.c
│ │ │ ├── qp_sh1106.h
│ │ │ └── qp_sh1106_opcodes.h
│ │ ├── sh1107/
│ │ │ ├── qp_sh1107.c
│ │ │ ├── qp_sh1107.h
│ │ │ └── qp_sh1107_opcodes.h
│ │ ├── ssd1351/
│ │ │ ├── qp_ssd1351.c
│ │ │ ├── qp_ssd1351.h
│ │ │ └── qp_ssd1351_opcodes.h
│ │ ├── st77xx/
│ │ │ ├── qp_st7735.c
│ │ │ ├── qp_st7735.h
│ │ │ ├── qp_st7735_opcodes.h
│ │ │ ├── qp_st7789.c
│ │ │ ├── qp_st7789.h
│ │ │ ├── qp_st7789_opcodes.h
│ │ │ └── qp_st77xx_opcodes.h
│ │ └── tft_panel/
│ │ ├── qp_tft_panel.c
│ │ └── qp_tft_panel.h
│ ├── ps2/
│ │ ├── ps2.h
│ │ ├── ps2_busywait.c
│ │ ├── ps2_interrupt.c
│ │ ├── ps2_io.h
│ │ ├── ps2_mouse.c
│ │ └── ps2_mouse.h
│ ├── sensors/
│ │ ├── adns5050.c
│ │ ├── adns5050.h
│ │ ├── adns9800.c
│ │ ├── adns9800.h
│ │ ├── analog_joystick.c
│ │ ├── analog_joystick.h
│ │ ├── azoteq_iqs5xx.c
│ │ ├── azoteq_iqs5xx.h
│ │ ├── cirque_pinnacle.c
│ │ ├── cirque_pinnacle.h
│ │ ├── cirque_pinnacle_gestures.c
│ │ ├── cirque_pinnacle_gestures.h
│ │ ├── cirque_pinnacle_i2c.c
│ │ ├── cirque_pinnacle_regdefs.h
│ │ ├── cirque_pinnacle_spi.c
│ │ ├── navigator.c
│ │ ├── navigator.h
│ │ ├── navigator_trackpad.c
│ │ ├── navigator_trackpad.h
│ │ ├── paw3204.c
│ │ ├── paw3204.h
│ │ ├── pimoroni_trackball.c
│ │ ├── pimoroni_trackball.h
│ │ ├── pmw3320.c
│ │ ├── pmw3320.h
│ │ ├── pmw3360.c
│ │ ├── pmw3360.h
│ │ ├── pmw3389.c
│ │ ├── pmw3389.h
│ │ ├── pmw33xx_common.c
│ │ └── pmw33xx_common.h
│ ├── serial.h
│ ├── spi_master.h
│ ├── uart.h
│ ├── usb2422.c
│ ├── usb2422.h
│ ├── usbpd.h
│ └── wear_leveling/
│ ├── wear_leveling_flash_spi.c
│ └── wear_leveling_flash_spi_config.h
├── layouts/
│ └── default/
│ ├── 60_abnt2/
│ │ ├── default_60_abnt2/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi/
│ │ ├── default_60_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_arrow/
│ │ ├── default_60_ansi_arrow/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_arrow_split_bs/
│ │ ├── default_60_ansi_arrow_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_split_bs_rshift/
│ │ ├── default_60_ansi_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_tsangan/
│ │ ├── default_60_ansi_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_tsangan_split_bs_rshift/
│ │ ├── default_60_ansi_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_wkl/
│ │ ├── default_60_ansi_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_ansi_wkl_split_bs_rshift/
│ │ ├── default_60_ansi_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_hhkb/
│ │ ├── default_60_hhkb/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso/
│ │ ├── default_60_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_arrow/
│ │ ├── default_60_iso_arrow/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_arrow_split_bs/
│ │ ├── default_60_iso_arrow_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_split_bs_rshift/
│ │ ├── default_60_iso_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_tsangan/
│ │ ├── default_60_iso_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_tsangan_split_bs_rshift/
│ │ ├── default_60_iso_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_wkl/
│ │ ├── default_60_iso_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_iso_wkl_split_bs_rshift/
│ │ ├── default_60_iso_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 60_jis/
│ │ ├── default_60_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 64_ansi/
│ │ ├── default_64_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 64_iso/
│ │ ├── default_64_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi/
│ │ ├── default_65_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_blocker/
│ │ ├── default_65_ansi_blocker/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_blocker_split_bs/
│ │ ├── default_65_ansi_blocker_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_blocker_tsangan/
│ │ ├── default_65_ansi_blocker_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_blocker_tsangan_split_bs/
│ │ ├── default_65_ansi_blocker_tsangan_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_ansi_split_bs/
│ │ ├── default_65_ansi_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso/
│ │ ├── default_65_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_blocker/
│ │ ├── default_65_iso_blocker/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_blocker_split_bs/
│ │ ├── default_65_iso_blocker_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_blocker_tsangan/
│ │ ├── default_65_iso_blocker_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_blocker_tsangan_split_bs/
│ │ ├── default_65_iso_blocker_tsangan_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 65_iso_split_bs/
│ │ ├── default_65_iso_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 66_ansi/
│ │ ├── default_66_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 66_iso/
│ │ ├── default_66_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 68_ansi/
│ │ ├── default_68_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 68_iso/
│ │ ├── default_68_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 75_ansi/
│ │ ├── default_75_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 75_iso/
│ │ ├── default_75_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 96_ansi/
│ │ ├── default_96_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── 96_iso/
│ │ ├── default_96_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── alice/
│ │ ├── default_alice/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── alice_split_bs/
│ │ ├── default_alice_split_bs/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ergodox/
│ │ ├── default_ergodox/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_ansi/
│ │ ├── default_fullsize_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_extended_ansi/
│ │ ├── default_fullsize_extended_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_extended_iso/
│ │ ├── default_fullsize_extended_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_extended_jis/
│ │ ├── default_fullsize_extended_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_iso/
│ │ ├── default_fullsize_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── fullsize_jis/
│ │ ├── default_fullsize_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_4x4/
│ │ ├── default_numpad_4x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_5x4/
│ │ ├── default_numpad_5x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_5x6/
│ │ ├── default_numpad_5x6/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_6x4/
│ │ ├── default_numpad_6x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── numpad_6x5/
│ │ ├── default_numpad_6x5/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_1x1/
│ │ ├── default_ortho_1x1/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_2x3/
│ │ ├── default_ortho_2x3/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_2x6/
│ │ ├── default_ortho_2x6/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_3x10/
│ │ ├── default_ortho_3x10/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_3x3/
│ │ ├── default_ortho_3x3/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x10/
│ │ ├── default_ortho_4x10/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x12/
│ │ ├── default_ortho_4x12/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x16/
│ │ ├── default_ortho_4x16/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x4/
│ │ ├── default_ortho_4x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_4x6/
│ │ ├── default_ortho_4x6/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x10/
│ │ ├── default_ortho_5x10/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x12/
│ │ ├── default_ortho_5x12/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x13/
│ │ ├── default_ortho_5x13/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x14/
│ │ ├── default_ortho_5x14/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x15/
│ │ ├── default_ortho_5x15/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x4/
│ │ ├── default_ortho_5x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_5x5/
│ │ ├── default_ortho_5x5/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_6x13/
│ │ ├── default_ortho_6x13/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── ortho_6x4/
│ │ ├── default_ortho_6x4/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── planck_mit/
│ │ ├── default_planck_mit/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── readme.md
│ ├── split_3x5_2/
│ │ ├── default_split_3x5_2/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── split_3x5_3/
│ │ ├── default_split_3x5_3/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── split_3x6_3/
│ │ ├── default_split_3x6_3/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi/
│ │ ├── default_tkl_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_split_bs_rshift/
│ │ ├── default_tkl_ansi_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_tsangan/
│ │ ├── default_tkl_ansi_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_tsangan_split_bs_rshift/
│ │ ├── default_tkl_ansi_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_wkl/
│ │ ├── default_tkl_ansi_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_ansi_wkl_split_bs_rshift/
│ │ ├── default_tkl_ansi_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi/
│ │ ├── default_tkl_f13_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_split_bs_rshift/
│ │ ├── default_tkl_f13_ansi_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_tsangan/
│ │ ├── default_tkl_f13_ansi_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_tsangan_split_bs_rshift/
│ │ ├── default_tkl_f13_ansi_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_wkl/
│ │ ├── default_tkl_f13_ansi_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_ansi_wkl_split_bs_rshift/
│ │ ├── default_tkl_f13_ansi_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso/
│ │ ├── default_tkl_f13_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_split_bs_rshift/
│ │ ├── default_tkl_f13_iso_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_tsangan/
│ │ ├── default_tkl_f13_iso_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_tsangan_split_bs_rshift/
│ │ ├── default_tkl_f13_iso_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_wkl/
│ │ ├── default_tkl_f13_iso_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_iso_wkl_split_bs_rshift/
│ │ ├── default_tkl_f13_iso_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_f13_jis/
│ │ ├── default_tkl_f13_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso/
│ │ ├── default_tkl_iso/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_split_bs_rshift/
│ │ ├── default_tkl_iso_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_tsangan/
│ │ ├── default_tkl_iso_tsangan/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_tsangan_split_bs_rshift/
│ │ ├── default_tkl_iso_tsangan_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_wkl/
│ │ ├── default_tkl_iso_wkl/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_iso_wkl_split_bs_rshift/
│ │ ├── default_tkl_iso_wkl_split_bs_rshift/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_jis/
│ │ ├── default_tkl_jis/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ ├── tkl_nofrow_ansi/
│ │ ├── default_tkl_nofrow_ansi/
│ │ │ └── keymap.c
│ │ ├── info.json
│ │ ├── layout.json
│ │ └── readme.md
│ └── tkl_nofrow_iso/
│ ├── default_tkl_nofrow_iso/
│ │ └── keymap.c
│ ├── info.json
│ ├── layout.json
│ └── readme.md
├── lib/
│ ├── fnv/
│ │ ├── Makefile
│ │ ├── README
│ │ ├── fnv.h
│ │ ├── fnv32.c
│ │ ├── fnv64.c
│ │ ├── hash_32.c
│ │ ├── hash_32a.c
│ │ ├── hash_64.c
│ │ ├── hash_64a.c
│ │ ├── have_ulong64.c
│ │ ├── longlong.h
│ │ ├── qmk_fnv_type_validation.c
│ │ └── test_fnv.c
│ ├── lib8tion/
│ │ ├── LICENSE
│ │ ├── lib8tion.c
│ │ ├── lib8tion.h
│ │ ├── math8.h
│ │ ├── random8.h
│ │ ├── scale8.h
│ │ └── trig8.h
│ ├── python/
│ │ ├── kle2xy.py
│ │ └── qmk/
│ │ ├── __init__.py
│ │ ├── build_targets.py
│ │ ├── c_parse.py
│ │ ├── cli/
│ │ │ ├── __init__.py
│ │ │ ├── bux.py
│ │ │ ├── c2json.py
│ │ │ ├── cd.py
│ │ │ ├── chibios/
│ │ │ │ ├── __init__.py
│ │ │ │ └── confmigrate.py
│ │ │ ├── ci/
│ │ │ │ ├── __init__.py
│ │ │ │ └── validate_aliases.py
│ │ │ ├── clean.py
│ │ │ ├── compile.py
│ │ │ ├── docs.py
│ │ │ ├── doctor/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── check.py
│ │ │ │ ├── linux.py
│ │ │ │ ├── macos.py
│ │ │ │ ├── main.py
│ │ │ │ └── windows.py
│ │ │ ├── find.py
│ │ │ ├── flash.py
│ │ │ ├── format/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── c.py
│ │ │ │ ├── json.py
│ │ │ │ ├── python.py
│ │ │ │ └── text.py
│ │ │ ├── generate/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── api.py
│ │ │ │ ├── autocorrect_data.py
│ │ │ │ ├── community_modules.py
│ │ │ │ ├── compilation_database.py
│ │ │ │ ├── config_h.py
│ │ │ │ ├── develop_pr_list.py
│ │ │ │ ├── dfu_header.py
│ │ │ │ ├── docs.py
│ │ │ │ ├── info_json.py
│ │ │ │ ├── keyboard_c.py
│ │ │ │ ├── keyboard_h.py
│ │ │ │ ├── keycodes.py
│ │ │ │ ├── keymap_h.py
│ │ │ │ ├── make_dependencies.py
│ │ │ │ ├── rgb_breathe_table.py
│ │ │ │ ├── rules_mk.py
│ │ │ │ └── version_h.py
│ │ │ ├── git/
│ │ │ │ ├── __init__.py
│ │ │ │ └── submodule.py
│ │ │ ├── hello.py
│ │ │ ├── import/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── kbfirmware.py
│ │ │ │ ├── keyboard.py
│ │ │ │ └── keymap.py
│ │ │ ├── info.py
│ │ │ ├── json2c.py
│ │ │ ├── kle2json.py
│ │ │ ├── license_check.py
│ │ │ ├── lint.py
│ │ │ ├── list/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── keyboards.py
│ │ │ │ ├── keymaps.py
│ │ │ │ └── layouts.py
│ │ │ ├── mass_compile.py
│ │ │ ├── migrate.py
│ │ │ ├── new/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── keyboard.py
│ │ │ │ └── keymap.py
│ │ │ ├── painter/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── convert_graphics.py
│ │ │ │ └── make_font.py
│ │ │ ├── pytest.py
│ │ │ ├── resolve_alias.py
│ │ │ ├── test/
│ │ │ │ ├── __init__.py
│ │ │ │ └── c.py
│ │ │ ├── userspace/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── add.py
│ │ │ │ ├── compile.py
│ │ │ │ ├── doctor.py
│ │ │ │ ├── list.py
│ │ │ │ ├── path.py
│ │ │ │ └── remove.py
│ │ │ └── via2json.py
│ │ ├── commands.py
│ │ ├── comment_remover.py
│ │ ├── community_modules.py
│ │ ├── compilation_database.py
│ │ ├── constants.py
│ │ ├── converter.py
│ │ ├── datetime.py
│ │ ├── decorators.py
│ │ ├── docs.py
│ │ ├── errors.py
│ │ ├── flashers.py
│ │ ├── git.py
│ │ ├── importers.py
│ │ ├── info.py
│ │ ├── json_encoders.py
│ │ ├── json_schema.py
│ │ ├── keyboard.py
│ │ ├── keycodes.py
│ │ ├── keymap.py
│ │ ├── makefile.py
│ │ ├── math.py
│ │ ├── math_ops.py
│ │ ├── painter.py
│ │ ├── painter_qff.py
│ │ ├── painter_qgf.py
│ │ ├── path.py
│ │ ├── search.py
│ │ ├── submodules.py
│ │ ├── tests/
│ │ │ ├── .gitignore
│ │ │ ├── __init__.py
│ │ │ ├── attrdict.py
│ │ │ ├── kle.txt
│ │ │ ├── minimal_info.json
│ │ │ ├── minimal_keymap.json
│ │ │ ├── test_cli_commands.py
│ │ │ ├── test_qmk_errors.py
│ │ │ ├── test_qmk_keymap.py
│ │ │ └── test_qmk_path.py
│ │ ├── userspace.py
│ │ └── util.py
│ └── usbhost/
│ ├── USB_Host_Shield_2.0/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .gitmodules
│ │ ├── BTD.cpp
│ │ ├── BTD.h
│ │ ├── BTHID.cpp
│ │ ├── BTHID.h
│ │ ├── PS3BT.cpp
│ │ ├── PS3BT.h
│ │ ├── PS3Enums.h
│ │ ├── PS3USB.cpp
│ │ ├── PS3USB.h
│ │ ├── PS4BT.h
│ │ ├── PS4Parser.cpp
│ │ ├── PS4Parser.h
│ │ ├── PS4USB.h
│ │ ├── PSBuzz.cpp
│ │ ├── PSBuzz.h
│ │ ├── README.md
│ │ ├── SPP.cpp
│ │ ├── SPP.h
│ │ ├── Usb.cpp
│ │ ├── Usb.h
│ │ ├── UsbCore.h
│ │ ├── Wii.cpp
│ │ ├── Wii.h
│ │ ├── WiiCameraReadme.md
│ │ ├── XBOXOLD.cpp
│ │ ├── XBOXOLD.h
│ │ ├── XBOXONE.cpp
│ │ ├── XBOXONE.h
│ │ ├── XBOXRECV.cpp
│ │ ├── XBOXRECV.h
│ │ ├── XBOXUSB.cpp
│ │ ├── XBOXUSB.h
│ │ ├── address.h
│ │ ├── adk.cpp
│ │ ├── adk.h
│ │ ├── avrpins.h
│ │ ├── cdc_XR21B1411.cpp
│ │ ├── cdc_XR21B1411.h
│ │ ├── cdcacm.cpp
│ │ ├── cdcacm.h
│ │ ├── cdcftdi.cpp
│ │ ├── cdcftdi.h
│ │ ├── cdcprolific.cpp
│ │ ├── cdcprolific.h
│ │ ├── confdescparser.h
│ │ ├── controllerEnums.h
│ │ ├── examples/
│ │ │ ├── Bluetooth/
│ │ │ │ ├── BTHID/
│ │ │ │ │ ├── BTHID.ino
│ │ │ │ │ ├── KeyboardParser.h
│ │ │ │ │ └── MouseParser.h
│ │ │ │ ├── PS3BT/
│ │ │ │ │ └── PS3BT.ino
│ │ │ │ ├── PS3Multi/
│ │ │ │ │ └── PS3Multi.ino
│ │ │ │ ├── PS3SPP/
│ │ │ │ │ └── PS3SPP.ino
│ │ │ │ ├── PS4BT/
│ │ │ │ │ └── PS4BT.ino
│ │ │ │ ├── SPP/
│ │ │ │ │ └── SPP.ino
│ │ │ │ ├── SPPMulti/
│ │ │ │ │ └── SPPMulti.ino
│ │ │ │ ├── Wii/
│ │ │ │ │ └── Wii.ino
│ │ │ │ ├── WiiBalanceBoard/
│ │ │ │ │ └── WiiBalanceBoard.ino
│ │ │ │ ├── WiiIRCamera/
│ │ │ │ │ └── WiiIRCamera.ino
│ │ │ │ ├── WiiMulti/
│ │ │ │ │ └── WiiMulti.ino
│ │ │ │ └── WiiUProController/
│ │ │ │ └── WiiUProController.ino
│ │ │ ├── HID/
│ │ │ │ ├── USBHIDBootKbd/
│ │ │ │ │ └── USBHIDBootKbd.ino
│ │ │ │ ├── USBHIDBootKbdAndMouse/
│ │ │ │ │ └── USBHIDBootKbdAndMouse.ino
│ │ │ │ ├── USBHIDBootMouse/
│ │ │ │ │ └── USBHIDBootMouse.ino
│ │ │ │ ├── USBHIDJoystick/
│ │ │ │ │ ├── USBHIDJoystick.ino
│ │ │ │ │ ├── hidjoystickrptparser.cpp
│ │ │ │ │ └── hidjoystickrptparser.h
│ │ │ │ ├── USBHID_desc/
│ │ │ │ │ ├── USBHID_desc.ino
│ │ │ │ │ └── pgmstrings.h
│ │ │ │ ├── le3dp/
│ │ │ │ │ ├── le3dp.ino
│ │ │ │ │ ├── le3dp_rptparser.cpp
│ │ │ │ │ └── le3dp_rptparser.h
│ │ │ │ └── scale/
│ │ │ │ ├── scale.ino
│ │ │ │ ├── scale_rptparser.cpp
│ │ │ │ └── scale_rptparser.h
│ │ │ ├── PS3USB/
│ │ │ │ └── PS3USB.ino
│ │ │ ├── PS4USB/
│ │ │ │ └── PS4USB.ino
│ │ │ ├── PSBuzz/
│ │ │ │ └── PSBuzz.ino
│ │ │ ├── USB_desc/
│ │ │ │ ├── USB_desc.ino
│ │ │ │ └── pgmstrings.h
│ │ │ ├── Xbox/
│ │ │ │ ├── XBOXOLD/
│ │ │ │ │ └── XBOXOLD.ino
│ │ │ │ ├── XBOXONE/
│ │ │ │ │ └── XBOXONE.ino
│ │ │ │ ├── XBOXRECV/
│ │ │ │ │ └── XBOXRECV.ino
│ │ │ │ └── XBOXUSB/
│ │ │ │ └── XBOXUSB.ino
│ │ │ ├── acm/
│ │ │ │ └── acm_terminal/
│ │ │ │ ├── acm_terminal.ino
│ │ │ │ └── pgmstrings.h
│ │ │ ├── adk/
│ │ │ │ ├── ArduinoBlinkLED/
│ │ │ │ │ └── ArduinoBlinkLED.ino
│ │ │ │ ├── adk_barcode/
│ │ │ │ │ └── adk_barcode.ino
│ │ │ │ ├── demokit_20/
│ │ │ │ │ └── demokit_20.ino
│ │ │ │ ├── term_test/
│ │ │ │ │ └── term_test.ino
│ │ │ │ └── term_time/
│ │ │ │ └── term_time.ino
│ │ │ ├── board_qc/
│ │ │ │ └── board_qc.ino
│ │ │ ├── cdc_XR21B1411/
│ │ │ │ └── XR_terminal/
│ │ │ │ └── XR_terminal.ino
│ │ │ ├── ftdi/
│ │ │ │ └── USBFTDILoopback/
│ │ │ │ ├── USBFTDILoopback.ino
│ │ │ │ └── pgmstrings.h
│ │ │ ├── hub_demo/
│ │ │ │ ├── hub_demo.ino
│ │ │ │ └── pgmstrings.h
│ │ │ ├── max_LCD/
│ │ │ │ └── max_LCD.ino
│ │ │ ├── pl2303/
│ │ │ │ ├── pl2303_gprs_terminal/
│ │ │ │ │ └── pl2303_gprs_terminal.ino
│ │ │ │ ├── pl2303_gps/
│ │ │ │ │ └── pl2303_gps.ino
│ │ │ │ ├── pl2303_tinygps/
│ │ │ │ │ └── pl2303_tinygps.ino
│ │ │ │ └── pl2303_xbee_terminal/
│ │ │ │ └── pl2303_xbee_terminal.ino
│ │ │ └── testusbhostFAT/
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ └── testusbhostFAT.ino
│ │ ├── gpl2.txt
│ │ ├── hexdump.h
│ │ ├── hid.cpp
│ │ ├── hid.h
│ │ ├── hidboot.cpp
│ │ ├── hidboot.h
│ │ ├── hidescriptorparser.cpp
│ │ ├── hidescriptorparser.h
│ │ ├── hiduniversal.cpp
│ │ ├── hiduniversal.h
│ │ ├── hidusagestr.h
│ │ ├── hidusagetitlearrays.cpp
│ │ ├── keywords.txt
│ │ ├── library.json
│ │ ├── library.properties
│ │ ├── macros.h
│ │ ├── masstorage.cpp
│ │ ├── masstorage.h
│ │ ├── max3421e.h
│ │ ├── max_LCD.cpp
│ │ ├── max_LCD.h
│ │ ├── message.cpp
│ │ ├── message.h
│ │ ├── parsetools.cpp
│ │ ├── parsetools.h
│ │ ├── printhex.h
│ │ ├── settings.h
│ │ ├── sink_parser.h
│ │ ├── usb_ch9.h
│ │ ├── usbhost.h
│ │ ├── usbhub.cpp
│ │ ├── usbhub.h
│ │ ├── version_helper.h
│ │ └── xboxEnums.h
│ └── arduino-1.0.1/
│ ├── cores/
│ │ └── arduino/
│ │ ├── Arduino.h
│ │ ├── CDC.cpp
│ │ ├── Client.h
│ │ ├── HID.cpp
│ │ ├── HardwareSerial.cpp
│ │ ├── HardwareSerial.h
│ │ ├── IPAddress.cpp
│ │ ├── IPAddress.h
│ │ ├── Platform.h
│ │ ├── Print.cpp
│ │ ├── Print.h
│ │ ├── Printable.h
│ │ ├── Server.h
│ │ ├── Stream.cpp
│ │ ├── Stream.h
│ │ ├── Tone.cpp
│ │ ├── USBAPI.h
│ │ ├── USBCore.cpp
│ │ ├── USBCore.h
│ │ ├── USBDesc.h
│ │ ├── Udp.h
│ │ ├── WCharacter.h
│ │ ├── WInterrupts.c
│ │ ├── WMath.cpp
│ │ ├── WString.cpp
│ │ ├── WString.h
│ │ ├── binary.h
│ │ ├── main.cpp
│ │ ├── new.cpp
│ │ ├── new.h
│ │ ├── wiring.c
│ │ ├── wiring_analog.c
│ │ ├── wiring_digital.c
│ │ ├── wiring_private.h
│ │ ├── wiring_pulse.c
│ │ └── wiring_shift.c
│ └── variants/
│ ├── eightanaloginputs/
│ │ └── pins_arduino.h
│ ├── leonardo/
│ │ └── pins_arduino.h
│ ├── mega/
│ │ └── pins_arduino.h
│ └── standard/
│ └── pins_arduino.h
├── license_GPLv2.md
├── license_GPLv3.md
├── license_Modified_BSD.md
├── modules/
│ └── qmk/
│ ├── flow_led_matrix_effect/
│ │ ├── led_matrix_module.inc
│ │ └── qmk_module.json
│ ├── flow_rgb_matrix_effect/
│ │ ├── qmk_module.json
│ │ └── rgb_matrix_module.inc
│ ├── hello_world/
│ │ ├── hello_world.c
│ │ ├── introspection.c
│ │ ├── introspection.h
│ │ ├── qmk_module.json
│ │ └── rules.mk
│ └── super_alt_tab/
│ ├── qmk_module.json
│ └── super_alt_tab.c
├── nose2.cfg
├── paths.mk
├── platforms/
│ ├── atomic_util.h
│ ├── avr/
│ │ ├── _pin_defs.h
│ │ ├── _print.h
│ │ ├── _timer.h
│ │ ├── _util.h
│ │ ├── _wait.h
│ │ ├── atomic_util.h
│ │ ├── bootloader.mk
│ │ ├── bootloader_size.c
│ │ ├── bootloaders/
│ │ │ ├── bootloadhid.c
│ │ │ ├── caterina.c
│ │ │ ├── custom.c
│ │ │ ├── dfu.c
│ │ │ ├── halfkay.c
│ │ │ └── usbasploader.c
│ │ ├── drivers/
│ │ │ ├── analog.c
│ │ │ ├── analog.h
│ │ │ ├── audio_pwm.h
│ │ │ ├── audio_pwm_hardware.c
│ │ │ ├── backlight_pwm.c
│ │ │ ├── backlight_timer.c
│ │ │ ├── glcdfont.c
│ │ │ ├── i2c_master.c
│ │ │ ├── i2c_slave.c
│ │ │ ├── i2c_slave.h
│ │ │ ├── ps2/
│ │ │ │ ├── ps2_io.c
│ │ │ │ └── ps2_usart.c
│ │ │ ├── serial.c
│ │ │ ├── spi_master.c
│ │ │ ├── uart.c
│ │ │ ├── ws2812_bitbang.c
│ │ │ └── ws2812_i2c.c
│ │ ├── flash.mk
│ │ ├── gpio.h
│ │ ├── hardware_id.c
│ │ ├── mcu_selection.mk
│ │ ├── platform.c
│ │ ├── platform.mk
│ │ ├── platform_deps.h
│ │ ├── printf.c
│ │ ├── printf.mk
│ │ ├── sleep_led.c
│ │ ├── suspend.c
│ │ ├── timer.c
│ │ ├── timer_avr.h
│ │ ├── xprintf.S
│ │ └── xprintf.h
│ ├── bootloader.h
│ ├── chibios/
│ │ ├── _pin_defs.h
│ │ ├── _timer.h
│ │ ├── _util.h
│ │ ├── _wait.c
│ │ ├── _wait.h
│ │ ├── atomic_util.h
│ │ ├── boards/
│ │ │ ├── BLACKPILL_STM32_F401/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── BLACKPILL_STM32_F411/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── BONSAI_C4/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_AT32_F415XX/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_PROMICRO_RP2040/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_RP_RP2040/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F042X6/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F072XB/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F303XC/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F401XC/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F405XG/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F407XE/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F411XE/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_F446XE/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_G0B1XB/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.mk
│ │ │ │ │ └── extra.c
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_G431XB/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ ├── hal_lld.h
│ │ │ │ ├── mcuconf.h
│ │ │ │ └── stm32_registry.h
│ │ │ ├── GENERIC_STM32_G474XE/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_H723XG/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.mk
│ │ │ │ │ └── extra.c
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_L412XB/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_L432XC/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_STM32_L433XC/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_WB32_F3G71XX/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── GENERIC_WB32_FQ95XX/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── IC_TEENSY_3_1/
│ │ │ │ └── board/
│ │ │ │ ├── board.c
│ │ │ │ ├── board.h
│ │ │ │ └── board.mk
│ │ │ ├── IC_TEENSY_4_1/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── rules.mk
│ │ │ ├── PJRC_TEENSY_3_5/
│ │ │ │ └── board/
│ │ │ │ ├── board.mk
│ │ │ │ └── extra.c
│ │ │ ├── PJRC_TEENSY_3_6/
│ │ │ │ └── board/
│ │ │ │ ├── board.mk
│ │ │ │ └── extra.c
│ │ │ ├── QMK_BLOK/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── QMK_PM2040/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── QMK_PROTON_C/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── SIPEED_LONGAN_NANO/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── chconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── STEMCELL/
│ │ │ │ ├── board/
│ │ │ │ │ └── board.mk
│ │ │ │ └── configs/
│ │ │ │ ├── board.h
│ │ │ │ ├── chconf.h
│ │ │ │ ├── config.h
│ │ │ │ ├── halconf.h
│ │ │ │ └── mcuconf.h
│ │ │ ├── STM32_F103_STM32DUINO/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board.c
│ │ │ │ │ ├── board.h
│ │ │ │ │ └── board.mk
│ │ │ │ ├── configs/
│ │ │ │ │ ├── chconf.h
│ │ │ │ │ ├── config.h
│ │ │ │ │ └── mcuconf.h
│ │ │ │ └── ld/
│ │ │ │ ├── STM32F103x6_stm32duino.ld
│ │ │ │ ├── STM32F103x8_stm32duino.ld
│ │ │ │ ├── STM32F103xB_stm32duino.ld
│ │ │ │ └── stm32duino_bootloader_common.ld
│ │ │ └── common/
│ │ │ ├── configs/
│ │ │ │ ├── chconf.h
│ │ │ │ └── halconf.h
│ │ │ └── ld/
│ │ │ ├── MKL26Z64.ld
│ │ │ ├── RP2040_FLASH_TIMECRIT.ld
│ │ │ ├── RP2040_rules_data_with_timecrit.ld
│ │ │ ├── STM32F103x8_uf2boot.ld
│ │ │ ├── STM32F103xB_uf2boot.ld
│ │ │ ├── STM32F303xC_tinyuf2.ld
│ │ │ ├── STM32F401xC.ld
│ │ │ ├── STM32F401xC_tinyuf2.ld
│ │ │ ├── STM32F401xE.ld
│ │ │ ├── STM32F401xE_tinyuf2.ld
│ │ │ ├── STM32F405xG.ld
│ │ │ ├── STM32F405xG_tinyuf2.ld
│ │ │ ├── STM32F407xE.ld
│ │ │ ├── STM32F407xE_tinyuf2.ld
│ │ │ ├── STM32F411xC.ld
│ │ │ ├── STM32F411xC_tinyuf2.ld
│ │ │ ├── STM32F411xE.ld
│ │ │ ├── STM32F411xE_tinyuf2.ld
│ │ │ ├── STM32F446xE.ld
│ │ │ ├── STM32F446xE_tinyuf2.ld
│ │ │ ├── STM32G0B1xB.ld
│ │ │ ├── STM32L412xB.ld
│ │ │ ├── stm32f4xx_common.ld
│ │ │ └── stm32f4xx_tinyuf2_common.ld
│ │ ├── bootloader.mk
│ │ ├── bootloaders/
│ │ │ ├── at32_dfu.c
│ │ │ ├── custom.c
│ │ │ ├── gd32v_dfu.c
│ │ │ ├── halfkay.c
│ │ │ ├── kiibohd.c
│ │ │ ├── rp2040.c
│ │ │ ├── stm32_dfu.c
│ │ │ ├── stm32duino.c
│ │ │ ├── tinyuf2.c
│ │ │ ├── uf2boot.c
│ │ │ └── wb32_dfu.c
│ │ ├── chibios_config.h
│ │ ├── config.h
│ │ ├── converters/
│ │ │ ├── elite_c_to_elite_pi/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── elite_c_to_helios/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── elite_c_to_liatris/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── elite_c_to_rp2040_ce/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── elite_c_to_stemcell/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_bit_c_pro/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_blok/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_bonsai_c3/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_bonsai_c4/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ ├── converter.mk
│ │ │ │ └── post_converter.mk
│ │ │ ├── promicro_to_elite_pi/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_helios/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_imera/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_kb2040/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_liatris/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_michi/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_promicro_rp2040/
│ │ │ │ └── pre_converter.mk
│ │ │ ├── promicro_to_proton_c/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ ├── converter.mk
│ │ │ │ └── post_converter.mk
│ │ │ ├── promicro_to_rp2040_ce/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_sparkfun_pm2040/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ ├── promicro_to_stemcell/
│ │ │ │ ├── _pin_defs.h
│ │ │ │ └── converter.mk
│ │ │ └── promicro_to_svlinky/
│ │ │ ├── _pin_defs.h
│ │ │ └── converter.mk
│ │ ├── drivers/
│ │ │ ├── analog.c
│ │ │ ├── analog.h
│ │ │ ├── audio_dac.h
│ │ │ ├── audio_dac_additive.c
│ │ │ ├── audio_dac_basic.c
│ │ │ ├── audio_pwm.h
│ │ │ ├── audio_pwm_hardware.c
│ │ │ ├── audio_pwm_software.c
│ │ │ ├── backlight_pwm.c
│ │ │ ├── backlight_timer.c
│ │ │ ├── eeprom/
│ │ │ │ ├── eeprom_kinetis_flexram.c
│ │ │ │ ├── eeprom_kinetis_flexram.h
│ │ │ │ ├── eeprom_legacy_emulated_flash.c
│ │ │ │ ├── eeprom_legacy_emulated_flash.h
│ │ │ │ ├── eeprom_legacy_emulated_flash_defs.h
│ │ │ │ ├── eeprom_stm32_L0_L1.c
│ │ │ │ └── eeprom_stm32_L0_L1.h
│ │ │ ├── flash/
│ │ │ │ ├── legacy_flash_ops.c
│ │ │ │ └── legacy_flash_ops.h
│ │ │ ├── i2c_master.c
│ │ │ ├── ps2/
│ │ │ │ └── ps2_io.c
│ │ │ ├── serial.c
│ │ │ ├── serial_protocol.c
│ │ │ ├── serial_protocol.h
│ │ │ ├── serial_usart.c
│ │ │ ├── serial_usart.h
│ │ │ ├── spi_master.c
│ │ │ ├── uart_serial.c
│ │ │ ├── uart_sio.c
│ │ │ ├── usbpd_stm32g4.c
│ │ │ ├── vendor/
│ │ │ │ └── RP/
│ │ │ │ └── RP2040/
│ │ │ │ ├── ps2_vendor.c
│ │ │ │ ├── serial_vendor.c
│ │ │ │ └── ws2812_vendor.c
│ │ │ ├── wear_leveling/
│ │ │ │ ├── wear_leveling_efl.c
│ │ │ │ ├── wear_leveling_efl_config.h
│ │ │ │ ├── wear_leveling_legacy.c
│ │ │ │ ├── wear_leveling_legacy_config.h
│ │ │ │ ├── wear_leveling_rp2040_flash.c
│ │ │ │ └── wear_leveling_rp2040_flash_config.h
│ │ │ ├── ws2812_bitbang.c
│ │ │ ├── ws2812_pwm.c
│ │ │ └── ws2812_spi.c
│ │ ├── errno.h
│ │ ├── flash.mk
│ │ ├── gd32v_compatibility.h
│ │ ├── gpio.h
│ │ ├── hardware_id.c
│ │ ├── interrupt_handlers.c
│ │ ├── mcu_selection.mk
│ │ ├── platform.c
│ │ ├── platform.mk
│ │ ├── platform_deps.h
│ │ ├── sleep_led.c
│ │ ├── suspend.c
│ │ ├── synchronization_util.c
│ │ ├── syscall-fallbacks.c
│ │ ├── timer.c
│ │ ├── vendors/
│ │ │ └── RP/
│ │ │ ├── RP2040.mk
│ │ │ ├── _pin_defs.h
│ │ │ ├── pico_sdk_shims.c
│ │ │ └── stage2_bootloaders.c
│ │ └── wait.c
│ ├── common.mk
│ ├── eeprom.h
│ ├── gpio.h
│ ├── hardware_id.h
│ ├── lv_conf.h
│ ├── pin_defs.h
│ ├── progmem.h
│ ├── sleep_led.h
│ ├── suspend.c
│ ├── suspend.h
│ ├── synchronization_util.c
│ ├── synchronization_util.h
│ ├── test/
│ │ ├── _wait.h
│ │ ├── bootloaders/
│ │ │ └── none.c
│ │ ├── drivers/
│ │ │ ├── audio_pwm.h
│ │ │ └── audio_pwm_hardware.c
│ │ ├── eeprom.c
│ │ ├── eeprom_legacy_emulated_flash_tests.cpp
│ │ ├── eeprom_legacy_emulated_flash_tests.h
│ │ ├── hal.h
│ │ ├── hardware_id.c
│ │ ├── legacy_flash_ops_mock.c
│ │ ├── platform.c
│ │ ├── platform.h
│ │ ├── platform.mk
│ │ ├── platform_deps.h
│ │ ├── rules.mk
│ │ ├── suspend.c
│ │ ├── testlist.mk
│ │ └── timer.c
│ ├── timer.c
│ ├── timer.h
│ └── wait.h
├── quantum/
│ ├── action.c
│ ├── action.h
│ ├── action_code.h
│ ├── action_layer.c
│ ├── action_layer.h
│ ├── action_tapping.c
│ ├── action_tapping.h
│ ├── action_util.c
│ ├── action_util.h
│ ├── audio/
│ │ ├── audio.c
│ │ ├── audio.h
│ │ ├── luts.c
│ │ ├── luts.h
│ │ ├── muse.c
│ │ ├── muse.h
│ │ ├── musical_notes.h
│ │ ├── song_list.h
│ │ ├── voices.c
│ │ └── voices.h
│ ├── backlight/
│ │ ├── backlight.c
│ │ ├── backlight.h
│ │ ├── backlight_driver_common.c
│ │ └── backlight_driver_common.h
│ ├── basic_profiling.h
│ ├── bits.h
│ ├── bitwise.c
│ ├── bitwise.h
│ ├── bootmagic/
│ │ ├── bootmagic.c
│ │ └── bootmagic.h
│ ├── caps_word.c
│ ├── caps_word.h
│ ├── color.c
│ ├── color.h
│ ├── command.c
│ ├── command.h
│ ├── compiler_support.h
│ ├── connection/
│ │ ├── connection.c
│ │ └── connection.h
│ ├── crc.c
│ ├── crc.h
│ ├── debounce/
│ │ ├── asym_eager_defer_pk.c
│ │ ├── none.c
│ │ ├── sym_defer_g.c
│ │ ├── sym_defer_pk.c
│ │ ├── sym_defer_pr.c
│ │ ├── sym_eager_pk.c
│ │ ├── sym_eager_pr.c
│ │ └── tests/
│ │ ├── asym_eager_defer_pk_tests.cpp
│ │ ├── debounce_test_common.cpp
│ │ ├── debounce_test_common.h
│ │ ├── none_tests.cpp
│ │ ├── rules.mk
│ │ ├── sym_defer_g_tests.cpp
│ │ ├── sym_defer_pk_tests.cpp
│ │ ├── sym_defer_pr_tests.cpp
│ │ ├── sym_eager_pk_tests.cpp
│ │ ├── sym_eager_pr_tests.cpp
│ │ └── testlist.mk
│ ├── debounce.h
│ ├── deferred_exec.c
│ ├── deferred_exec.h
│ ├── digitizer.c
│ ├── digitizer.h
│ ├── dip_switch.c
│ ├── dip_switch.h
│ ├── dynamic_keymap.c
│ ├── dynamic_keymap.h
│ ├── eeconfig.c
│ ├── eeconfig.h
│ ├── encoder/
│ │ └── tests/
│ │ ├── config_encoder_common.h
│ │ ├── config_mock.h
│ │ ├── config_mock_split_left_eq_right.h
│ │ ├── config_mock_split_left_gt_right.h
│ │ ├── config_mock_split_left_lt_right.h
│ │ ├── config_mock_split_no_left.h
│ │ ├── config_mock_split_no_right.h
│ │ ├── config_mock_split_role.h
│ │ ├── encoder_tests.cpp
│ │ ├── encoder_tests_split_left_eq_right.cpp
│ │ ├── encoder_tests_split_left_gt_right.cpp
│ │ ├── encoder_tests_split_left_lt_right.cpp
│ │ ├── encoder_tests_split_no_left.cpp
│ │ ├── encoder_tests_split_no_right.cpp
│ │ ├── encoder_tests_split_role.cpp
│ │ ├── mock.c
│ │ ├── mock.h
│ │ ├── mock_split.c
│ │ ├── mock_split.h
│ │ ├── rules.mk
│ │ └── testlist.mk
│ ├── encoder.c
│ ├── encoder.h
│ ├── haptic.c
│ ├── haptic.h
│ ├── joystick.c
│ ├── joystick.h
│ ├── keyboard.c
│ ├── keyboard.h
│ ├── keycode.h
│ ├── keycode_config.c
│ ├── keycode_config.h
│ ├── keycode_string.c
│ ├── keycode_string.h
│ ├── keycodes.h
│ ├── keymap_common.c
│ ├── keymap_common.h
│ ├── keymap_extras/
│ │ ├── keymap_belgian.h
│ │ ├── keymap_bepo.h
│ │ ├── keymap_brazilian_abnt2.h
│ │ ├── keymap_canadian_french.h
│ │ ├── keymap_canadian_multilingual.h
│ │ ├── keymap_colemak.h
│ │ ├── keymap_croatian.h
│ │ ├── keymap_czech.h
│ │ ├── keymap_czech_mac_ansi.h
│ │ ├── keymap_czech_mac_iso.h
│ │ ├── keymap_danish.h
│ │ ├── keymap_dvorak.h
│ │ ├── keymap_dvorak_fr.h
│ │ ├── keymap_dvorak_programmer.h
│ │ ├── keymap_estonian.h
│ │ ├── keymap_eurkey.h
│ │ ├── keymap_farsi.h
│ │ ├── keymap_finnish.h
│ │ ├── keymap_french.h
│ │ ├── keymap_french_afnor.h
│ │ ├── keymap_french_mac_iso.h
│ │ ├── keymap_german.h
│ │ ├── keymap_german_mac_iso.h
│ │ ├── keymap_greek.h
│ │ ├── keymap_hebrew.h
│ │ ├── keymap_hungarian.h
│ │ ├── keymap_icelandic.h
│ │ ├── keymap_irish.h
│ │ ├── keymap_italian.h
│ │ ├── keymap_italian_mac_ansi.h
│ │ ├── keymap_italian_mac_iso.h
│ │ ├── keymap_japanese.h
│ │ ├── keymap_korean.h
│ │ ├── keymap_latvian.h
│ │ ├── keymap_lithuanian_azerty.h
│ │ ├── keymap_lithuanian_qwerty.h
│ │ ├── keymap_neo2.h
│ │ ├── keymap_nordic.h
│ │ ├── keymap_norman.h
│ │ ├── keymap_norwegian.h
│ │ ├── keymap_plover.h
│ │ ├── keymap_plover_dvorak.h
│ │ ├── keymap_polish.h
│ │ ├── keymap_portuguese.h
│ │ ├── keymap_portuguese_mac_iso.h
│ │ ├── keymap_romanian.h
│ │ ├── keymap_russian.h
│ │ ├── keymap_russian_typewriter.h
│ │ ├── keymap_serbian.h
│ │ ├── keymap_serbian_latin.h
│ │ ├── keymap_slovak.h
│ │ ├── keymap_slovenian.h
│ │ ├── keymap_spanish.h
│ │ ├── keymap_spanish_dvorak.h
│ │ ├── keymap_spanish_latin_america.h
│ │ ├── keymap_steno.h
│ │ ├── keymap_swedish.h
│ │ ├── keymap_swedish_mac_ansi.h
│ │ ├── keymap_swedish_mac_iso.h
│ │ ├── keymap_swedish_pro_mac_ansi.h
│ │ ├── keymap_swedish_pro_mac_iso.h
│ │ ├── keymap_swiss_de.h
│ │ ├── keymap_swiss_fr.h
│ │ ├── keymap_turkish_f.h
│ │ ├── keymap_turkish_q.h
│ │ ├── keymap_uk.h
│ │ ├── keymap_ukrainian.h
│ │ ├── keymap_us.h
│ │ ├── keymap_us_extended.h
│ │ ├── keymap_us_international.h
│ │ ├── keymap_us_international_linux.h
│ │ ├── keymap_workman.h
│ │ ├── keymap_workman_zxcvm.h
│ │ ├── sendstring_belgian.h
│ │ ├── sendstring_bepo.h
│ │ ├── sendstring_brazilian_abnt2.h
│ │ ├── sendstring_canadian_french.h
│ │ ├── sendstring_canadian_multilingual.h
│ │ ├── sendstring_colemak.h
│ │ ├── sendstring_croatian.h
│ │ ├── sendstring_czech.h
│ │ ├── sendstring_czech_mac_ansi.h
│ │ ├── sendstring_czech_mac_iso.h
│ │ ├── sendstring_danish.h
│ │ ├── sendstring_dvorak.h
│ │ ├── sendstring_dvorak_fr.h
│ │ ├── sendstring_dvorak_programmer.h
│ │ ├── sendstring_estonian.h
│ │ ├── sendstring_finnish.h
│ │ ├── sendstring_french.h
│ │ ├── sendstring_french_afnor.h
│ │ ├── sendstring_french_mac_iso.h
│ │ ├── sendstring_german.h
│ │ ├── sendstring_german_mac_iso.h
│ │ ├── sendstring_hungarian.h
│ │ ├── sendstring_icelandic.h
│ │ ├── sendstring_italian.h
│ │ ├── sendstring_italian_mac_ansi.h
│ │ ├── sendstring_italian_mac_iso.h
│ │ ├── sendstring_japanese.h
│ │ ├── sendstring_latvian.h
│ │ ├── sendstring_lithuanian_azerty.h
│ │ ├── sendstring_lithuanian_qwerty.h
│ │ ├── sendstring_norman.h
│ │ ├── sendstring_norwegian.h
│ │ ├── sendstring_portuguese.h
│ │ ├── sendstring_portuguese_mac_iso.h
│ │ ├── sendstring_romanian.h
│ │ ├── sendstring_serbian_latin.h
│ │ ├── sendstring_slovak.h
│ │ ├── sendstring_slovenian.h
│ │ ├── sendstring_spanish.h
│ │ ├── sendstring_spanish_dvorak.h
│ │ ├── sendstring_spanish_latin_america.h
│ │ ├── sendstring_swedish.h
│ │ ├── sendstring_swiss_de.h
│ │ ├── sendstring_swiss_fr.h
│ │ ├── sendstring_turkish_f.h
│ │ ├── sendstring_turkish_q.h
│ │ ├── sendstring_uk.h
│ │ ├── sendstring_us_international.h
│ │ ├── sendstring_workman.h
│ │ └── sendstring_workman_zxcvm.h
│ ├── keymap_introspection.c
│ ├── keymap_introspection.h
│ ├── layer_lock.c
│ ├── layer_lock.h
│ ├── leader.c
│ ├── leader.h
│ ├── led.c
│ ├── led.h
│ ├── led_matrix/
│ │ ├── animations/
│ │ │ ├── alpha_mods_anim.h
│ │ │ ├── band_anim.h
│ │ │ ├── band_pinwheel_anim.h
│ │ │ ├── band_spiral_anim.h
│ │ │ ├── breathing_anim.h
│ │ │ ├── cycle_left_right_anim.h
│ │ │ ├── cycle_out_in_anim.h
│ │ │ ├── cycle_up_down_anim.h
│ │ │ ├── dual_beacon_anim.h
│ │ │ ├── led_matrix_effects.inc
│ │ │ ├── runners/
│ │ │ │ ├── effect_runner_dx_dy.h
│ │ │ │ ├── effect_runner_dx_dy_dist.h
│ │ │ │ ├── effect_runner_i.h
│ │ │ │ ├── effect_runner_reactive.h
│ │ │ │ ├── effect_runner_reactive_splash.h
│ │ │ │ ├── effect_runner_sin_cos_i.h
│ │ │ │ └── led_matrix_runners.inc
│ │ │ ├── solid_anim.h
│ │ │ ├── solid_reactive_cross.h
│ │ │ ├── solid_reactive_nexus.h
│ │ │ ├── solid_reactive_simple_anim.h
│ │ │ ├── solid_reactive_wide.h
│ │ │ ├── solid_splash_anim.h
│ │ │ ├── wave_left_right_anim.h
│ │ │ └── wave_up_down_anim.h
│ │ ├── led_matrix.c
│ │ ├── led_matrix.h
│ │ ├── led_matrix_drivers.c
│ │ ├── led_matrix_drivers.h
│ │ ├── led_matrix_types.h
│ │ └── post_config.h
│ ├── led_tables.c
│ ├── led_tables.h
│ ├── logging/
│ │ ├── debug.c
│ │ ├── debug.h
│ │ ├── print.c
│ │ ├── print.h
│ │ ├── print.mk
│ │ ├── sendchar.c
│ │ └── sendchar.h
│ ├── main.c
│ ├── matrix.c
│ ├── matrix.h
│ ├── matrix_common.c
│ ├── midi/
│ │ ├── Config/
│ │ │ └── LUFAConfig.h
│ │ ├── bytequeue/
│ │ │ ├── COPYING
│ │ │ ├── bytequeue.c
│ │ │ ├── bytequeue.h
│ │ │ ├── interrupt_setting.c
│ │ │ └── interrupt_setting.h
│ │ ├── midi.c
│ │ ├── midi.h
│ │ ├── midi_device.c
│ │ ├── midi_device.h
│ │ ├── midi_function_types.h
│ │ ├── qmk_midi.c
│ │ ├── qmk_midi.h
│ │ ├── sysex_tools.c
│ │ └── sysex_tools.h
│ ├── modifiers.h
│ ├── mousekey.c
│ ├── mousekey.h
│ ├── nvm/
│ │ ├── eeprom/
│ │ │ ├── nvm_dynamic_keymap.c
│ │ │ ├── nvm_eeconfig.c
│ │ │ ├── nvm_eeprom_eeconfig_internal.h
│ │ │ ├── nvm_eeprom_via_internal.h
│ │ │ └── nvm_via.c
│ │ ├── nvm_dynamic_keymap.h
│ │ ├── nvm_eeconfig.h
│ │ ├── nvm_via.h
│ │ ├── readme.md
│ │ └── rules.mk
│ ├── os_detection/
│ │ └── tests/
│ │ ├── os_detection.cpp
│ │ ├── rules.mk
│ │ └── testlist.mk
│ ├── os_detection.c
│ ├── os_detection.h
│ ├── painter/
│ │ ├── lvgl/
│ │ │ ├── qp_lvgl.c
│ │ │ ├── qp_lvgl.h
│ │ │ └── rules.mk
│ │ ├── qff.c
│ │ ├── qff.h
│ │ ├── qgf.c
│ │ ├── qgf.h
│ │ ├── qp.c
│ │ ├── qp.h
│ │ ├── qp_comms.c
│ │ ├── qp_comms.h
│ │ ├── qp_draw.h
│ │ ├── qp_draw_circle.c
│ │ ├── qp_draw_codec.c
│ │ ├── qp_draw_core.c
│ │ ├── qp_draw_ellipse.c
│ │ ├── qp_draw_image.c
│ │ ├── qp_draw_text.c
│ │ ├── qp_internal.c
│ │ ├── qp_internal.h
│ │ ├── qp_internal_driver.h
│ │ ├── qp_internal_formats.h
│ │ ├── qp_stream.c
│ │ ├── qp_stream.h
│ │ └── rules.mk
│ ├── pointing_device/
│ │ ├── pointing_device.c
│ │ ├── pointing_device.h
│ │ ├── pointing_device_auto_mouse.c
│ │ ├── pointing_device_auto_mouse.h
│ │ ├── pointing_device_gestures.c
│ │ └── pointing_device_gestures.h
│ ├── pointing_device_internal.h
│ ├── process_keycode/
│ │ ├── autocorrect_data_default.h
│ │ ├── process_achordion.c
│ │ ├── process_achordion.h
│ │ ├── process_audio.c
│ │ ├── process_audio.h
│ │ ├── process_auto_shift.c
│ │ ├── process_auto_shift.h
│ │ ├── process_autocorrect.c
│ │ ├── process_autocorrect.h
│ │ ├── process_backlight.c
│ │ ├── process_backlight.h
│ │ ├── process_caps_word.c
│ │ ├── process_caps_word.h
│ │ ├── process_clicky.c
│ │ ├── process_clicky.h
│ │ ├── process_combo.c
│ │ ├── process_combo.h
│ │ ├── process_connection.c
│ │ ├── process_connection.h
│ │ ├── process_default_layer.c
│ │ ├── process_default_layer.h
│ │ ├── process_dynamic_macro.c
│ │ ├── process_dynamic_macro.h
│ │ ├── process_dynamic_tapping_term.c
│ │ ├── process_dynamic_tapping_term.h
│ │ ├── process_grave_esc.c
│ │ ├── process_grave_esc.h
│ │ ├── process_haptic.c
│ │ ├── process_haptic.h
│ │ ├── process_joystick.c
│ │ ├── process_joystick.h
│ │ ├── process_key_lock.c
│ │ ├── process_key_lock.h
│ │ ├── process_key_override.c
│ │ ├── process_key_override.h
│ │ ├── process_layer_lock.c
│ │ ├── process_layer_lock.h
│ │ ├── process_leader.c
│ │ ├── process_leader.h
│ │ ├── process_led_matrix.c
│ │ ├── process_led_matrix.h
│ │ ├── process_magic.c
│ │ ├── process_magic.h
│ │ ├── process_midi.c
│ │ ├── process_midi.h
│ │ ├── process_music.c
│ │ ├── process_music.h
│ │ ├── process_programmable_button.c
│ │ ├── process_programmable_button.h
│ │ ├── process_repeat_key.c
│ │ ├── process_repeat_key.h
│ │ ├── process_rgb_matrix.c
│ │ ├── process_rgb_matrix.h
│ │ ├── process_secure.c
│ │ ├── process_secure.h
│ │ ├── process_sequencer.c
│ │ ├── process_sequencer.h
│ │ ├── process_space_cadet.c
│ │ ├── process_space_cadet.h
│ │ ├── process_steno.c
│ │ ├── process_steno.h
│ │ ├── process_tap_dance.c
│ │ ├── process_tap_dance.h
│ │ ├── process_tri_layer.c
│ │ ├── process_tri_layer.h
│ │ ├── process_ucis.c
│ │ ├── process_ucis.h
│ │ ├── process_underglow.c
│ │ ├── process_underglow.h
│ │ ├── process_unicode.c
│ │ ├── process_unicode.h
│ │ ├── process_unicode_common.c
│ │ ├── process_unicode_common.h
│ │ ├── process_unicodemap.c
│ │ └── process_unicodemap.h
│ ├── programmable_button.c
│ ├── programmable_button.h
│ ├── quantum.c
│ ├── quantum.h
│ ├── quantum_keycodes.h
│ ├── quantum_keycodes_legacy.h
│ ├── raw_hid.c
│ ├── raw_hid.h
│ ├── repeat_key.c
│ ├── repeat_key.h
│ ├── rgb_matrix/
│ │ ├── animations/
│ │ │ ├── alpha_mods_anim.h
│ │ │ ├── breathing_anim.h
│ │ │ ├── colorband_pinwheel_sat_anim.h
│ │ │ ├── colorband_pinwheel_val_anim.h
│ │ │ ├── colorband_sat_anim.h
│ │ │ ├── colorband_spiral_sat_anim.h
│ │ │ ├── colorband_spiral_val_anim.h
│ │ │ ├── colorband_val_anim.h
│ │ │ ├── cycle_all_anim.h
│ │ │ ├── cycle_left_right_anim.h
│ │ │ ├── cycle_out_in_anim.h
│ │ │ ├── cycle_out_in_dual_anim.h
│ │ │ ├── cycle_pinwheel_anim.h
│ │ │ ├── cycle_spiral_anim.h
│ │ │ ├── cycle_up_down_anim.h
│ │ │ ├── digital_rain_anim.h
│ │ │ ├── dual_beacon_anim.h
│ │ │ ├── flower_blooming_anim.h
│ │ │ ├── gradient_left_right_anim.h
│ │ │ ├── gradient_up_down_anim.h
│ │ │ ├── hue_breathing_anim.h
│ │ │ ├── hue_pendulum_anim.h
│ │ │ ├── hue_wave_anim.h
│ │ │ ├── jellybean_raindrops_anim.h
│ │ │ ├── pixel_flow_anim.h
│ │ │ ├── pixel_fractal_anim.h
│ │ │ ├── pixel_rain_anim.h
│ │ │ ├── rainbow_beacon_anim.h
│ │ │ ├── rainbow_moving_chevron_anim.h
│ │ │ ├── rainbow_pinwheels_anim.h
│ │ │ ├── raindrops_anim.h
│ │ │ ├── rgb_matrix_effects.inc
│ │ │ ├── riverflow_anim.h
│ │ │ ├── runners/
│ │ │ │ ├── effect_runner_dx_dy.h
│ │ │ │ ├── effect_runner_dx_dy_dist.h
│ │ │ │ ├── effect_runner_i.h
│ │ │ │ ├── effect_runner_reactive.h
│ │ │ │ ├── effect_runner_reactive_splash.h
│ │ │ │ ├── effect_runner_sin_cos_i.h
│ │ │ │ └── rgb_matrix_runners.inc
│ │ │ ├── solid_color_anim.h
│ │ │ ├── solid_reactive_anim.h
│ │ │ ├── solid_reactive_cross.h
│ │ │ ├── solid_reactive_nexus.h
│ │ │ ├── solid_reactive_simple_anim.h
│ │ │ ├── solid_reactive_wide.h
│ │ │ ├── solid_splash_anim.h
│ │ │ ├── splash_anim.h
│ │ │ ├── starlight_anim.h
│ │ │ ├── starlight_dual_hue_anim.h
│ │ │ ├── starlight_dual_sat_anim.h
│ │ │ ├── starlight_smooth_anim.h
│ │ │ └── typing_heatmap_anim.h
│ │ ├── post_config.h
│ │ ├── rgb_matrix.c
│ │ ├── rgb_matrix.h
│ │ ├── rgb_matrix_drivers.c
│ │ ├── rgb_matrix_drivers.h
│ │ └── rgb_matrix_types.h
│ ├── rgblight/
│ │ ├── rgblight.c
│ │ ├── rgblight.h
│ │ ├── rgblight_breathe_table.h
│ │ ├── rgblight_drivers.c
│ │ ├── rgblight_drivers.h
│ │ ├── rgblight_modes.h
│ │ └── rgblight_post_config.h
│ ├── ring_buffer.h
│ ├── secure.c
│ ├── secure.h
│ ├── send_string/
│ │ ├── send_string.c
│ │ ├── send_string.h
│ │ └── send_string_keycodes.h
│ ├── sequencer/
│ │ ├── sequencer.c
│ │ ├── sequencer.h
│ │ └── tests/
│ │ ├── midi_mock.c
│ │ ├── midi_mock.h
│ │ ├── rules.mk
│ │ ├── sequencer_tests.cpp
│ │ └── testlist.mk
│ ├── split_common/
│ │ ├── post_config.h
│ │ ├── split_util.c
│ │ ├── split_util.h
│ │ ├── transaction_id_define.h
│ │ ├── transactions.c
│ │ ├── transactions.h
│ │ ├── transport.c
│ │ └── transport.h
│ ├── steno_keycodes.h
│ ├── sync_timer.c
│ ├── sync_timer.h
│ ├── tri_layer.c
│ ├── tri_layer.h
│ ├── unicode/
│ │ ├── ucis.c
│ │ ├── ucis.h
│ │ ├── unicode.c
│ │ ├── unicode.h
│ │ ├── unicode_keycodes.h
│ │ ├── unicodemap.c
│ │ ├── unicodemap.h
│ │ ├── utf8.c
│ │ └── utf8.h
│ ├── util.h
│ ├── variable_trace.c
│ ├── variable_trace.h
│ ├── via.c
│ ├── via.h
│ ├── virtser.h
│ ├── wear_leveling/
│ │ ├── tests/
│ │ │ ├── backing_mocks.cpp
│ │ │ ├── backing_mocks.hpp
│ │ │ ├── rules.mk
│ │ │ ├── testlist.mk
│ │ │ ├── wear_leveling_2byte.cpp
│ │ │ ├── wear_leveling_2byte_optimized_writes.cpp
│ │ │ ├── wear_leveling_4byte.cpp
│ │ │ ├── wear_leveling_8byte.cpp
│ │ │ └── wear_leveling_general.cpp
│ │ ├── wear_leveling.c
│ │ ├── wear_leveling.h
│ │ ├── wear_leveling_drivers.h
│ │ └── wear_leveling_internal.h
│ ├── wpm.c
│ └── wpm.h
├── readme.md
├── requirements-dev.txt
├── requirements.txt
├── setup.cfg
├── tests/
│ ├── audio/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_audio.cpp
│ ├── auto_shift/
│ │ ├── auto_shift_repeat/
│ │ │ ├── auto_shift_no_auto_repeat/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ └── test_auto_shift.cpp
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_auto_shift.cpp
│ │ ├── config.h
│ │ ├── retro_shift/
│ │ │ └── tap_hold_configurations/
│ │ │ ├── default_mod_tap/
│ │ │ │ ├── config.h
│ │ │ │ ├── no_timeout/
│ │ │ │ │ ├── config.h
│ │ │ │ │ ├── test.mk
│ │ │ │ │ └── test_retro_shift.cpp
│ │ │ │ ├── test.mk
│ │ │ │ └── test_retro_shift.cpp
│ │ │ ├── hold_on_other_key_press/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ └── test_retro_shift.cpp
│ │ │ ├── permissive_hold/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ └── test_retro_shift.cpp
│ │ │ └── permissive_hold_hold_on_other_key_press/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_retro_shift.cpp
│ │ ├── test.mk
│ │ └── test_auto_shift.cpp
│ ├── autocorrect/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_autocorrect.cpp
│ ├── basic/
│ │ ├── config.h
│ │ ├── test.mk
│ │ ├── test_action_layer.cpp
│ │ ├── test_keypress.cpp
│ │ ├── test_one_shot_keys.cpp
│ │ └── test_tapping.cpp
│ ├── caps_word/
│ │ ├── auto_shift/
│ │ │ ├── config.h
│ │ │ ├── retro_shift/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ └── test_caps_word_retroshift.cpp
│ │ │ ├── test.mk
│ │ │ └── test_caps_word_autoshift.cpp
│ │ ├── caps_word_combo/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_caps_word_combo.cpp
│ │ │ └── test_combos.c
│ │ ├── caps_word_invert_on_shift/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_caps_word_invert_on_shift.cpp
│ │ ├── config.h
│ │ ├── test.mk
│ │ ├── test_caps_word.cpp
│ │ └── unicodemap/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_caps_word_unicodemap.cpp
│ ├── combo/
│ │ ├── combo_repress/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_combo.cpp
│ │ │ └── test_combos_repress.c
│ │ ├── config.h
│ │ ├── test.mk
│ │ ├── test_combo.cpp
│ │ └── test_combos.c
│ ├── housekeeping/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_housekeeping.cpp
│ ├── keycode_string/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_keycode_string.cpp
│ ├── layer_lock/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_layer_lock.cpp
│ ├── leader/
│ │ ├── config.h
│ │ ├── leader_no_initial_timeout/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_leader_no_initial_timeout.cpp
│ │ ├── leader_per_key_timeout/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_leader_per_key_timeout.cpp
│ │ ├── leader_sequences.c
│ │ ├── leader_strict_key_processing/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_leader_strict_key_processing.cpp
│ │ ├── test.mk
│ │ └── test_leader.cpp
│ ├── mousekeys/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_mousekeys.cpp
│ ├── no_tapping/
│ │ ├── no_action_tapping/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_layer_tap.cpp
│ │ │ ├── test_mod_tap.cpp
│ │ │ └── test_one_shot_keys.cpp
│ │ └── no_mod_tap_mods/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_tapping.cpp
│ ├── pointing/
│ │ ├── config.h
│ │ ├── invertandrotate/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_invertandrotate.cpp
│ │ ├── invertxy/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_invertxy.cpp
│ │ ├── rotate180/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_rotate180.cpp
│ │ ├── rotate270/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_rotate270.cpp
│ │ ├── rotate90/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_rotate90.cpp
│ │ ├── test.mk
│ │ └── test_pointing.cpp
│ ├── repeat_key/
│ │ ├── alt_repeat_key/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_alt_repeat_key.cpp
│ │ ├── config.h
│ │ ├── repeat_key_combo/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_combos.c
│ │ │ └── test_repeat_key_combo.cpp
│ │ ├── test.mk
│ │ └── test_repeat_key.cpp
│ ├── secure/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_secure.cpp
│ ├── tap_dance/
│ │ ├── config.h
│ │ ├── examples.c
│ │ ├── examples.h
│ │ ├── tap_dance_layers/
│ │ │ ├── config.h
│ │ │ ├── tap_dance_defs.c
│ │ │ ├── tap_dance_defs.h
│ │ │ ├── test.mk
│ │ │ └── test_tap_dance_layers.cpp
│ │ ├── test.mk
│ │ └── test_examples.cpp
│ ├── tap_hold_configurations/
│ │ ├── chordal_hold/
│ │ │ ├── default/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ ├── test_keymap.c
│ │ │ │ ├── test_one_shot_keys.cpp
│ │ │ │ └── test_tap_hold.cpp
│ │ │ ├── hold_on_other_key_press/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ ├── test_keymap.c
│ │ │ │ └── test_tap_hold.cpp
│ │ │ ├── permissive_hold/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ ├── test_keymap.c
│ │ │ │ ├── test_one_shot_keys.cpp
│ │ │ │ └── test_tap_hold.cpp
│ │ │ ├── permissive_hold_flow_tap/
│ │ │ │ ├── config.h
│ │ │ │ ├── test.mk
│ │ │ │ ├── test_keymap.c
│ │ │ │ ├── test_one_shot_keys.cpp
│ │ │ │ └── test_tap_hold.cpp
│ │ │ └── retro_shift_permissive_hold/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_keymap.c
│ │ │ └── test_retro_shift.cpp
│ │ ├── default_mod_tap/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_one_shot_layer.cpp
│ │ │ └── test_tap_hold.cpp
│ │ ├── flow_tap/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_keymap.c
│ │ │ └── test_tap_hold.cpp
│ │ ├── hold_on_other_key_press/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ └── test_tap_hold.cpp
│ │ ├── permissive_hold/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_one_shot_keys.cpp
│ │ │ └── test_tap_hold.cpp
│ │ ├── quick_tap/
│ │ │ ├── config.h
│ │ │ ├── test.mk
│ │ │ ├── test_action_layer.cpp
│ │ │ └── test_quick_tap.cpp
│ │ └── retro_tapping/
│ │ ├── config.h
│ │ ├── test.mk
│ │ ├── test_key_roll.cpp
│ │ ├── test_neutralization.cpp
│ │ ├── test_tap_hold.cpp
│ │ └── test_tapping.cpp
│ ├── test_common/
│ │ ├── build.mk
│ │ ├── keyboard_report_util.cpp
│ │ ├── keyboard_report_util.hpp
│ │ ├── keymap.c
│ │ ├── main.cpp
│ │ ├── matrix.c
│ │ ├── mouse_report_util.cpp
│ │ ├── mouse_report_util.hpp
│ │ ├── pointing_device_driver.c
│ │ ├── test_common.h
│ │ ├── test_common.hpp
│ │ ├── test_driver.cpp
│ │ ├── test_driver.hpp
│ │ ├── test_fixture.cpp
│ │ ├── test_fixture.hpp
│ │ ├── test_keymap_key.cpp
│ │ ├── test_keymap_key.hpp
│ │ ├── test_logger.cpp
│ │ ├── test_logger.hpp
│ │ ├── test_matrix.h
│ │ └── test_pointing_device_driver.h
│ ├── tri_layer/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_tri_layer.cpp
│ └── unicode/
│ ├── config.h
│ ├── test.mk
│ ├── test_unicode.cpp
│ ├── unicode_basic/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_unicode_basic.cpp
│ ├── unicode_map/
│ │ ├── config.h
│ │ ├── test.mk
│ │ └── test_unicode_map.cpp
│ └── unicode_ucis/
│ ├── config.h
│ ├── test.mk
│ └── test_unicode_ucis.cpp
├── tmk_core/
│ ├── protocol/
│ │ ├── chibios/
│ │ │ ├── README.md
│ │ │ ├── chibios.c
│ │ │ ├── chibios.mk
│ │ │ ├── init_hooks.h
│ │ │ ├── lufa_utils/
│ │ │ │ └── LUFA/
│ │ │ │ └── Drivers/
│ │ │ │ └── USB/
│ │ │ │ └── USB.h
│ │ │ ├── usb_driver.c
│ │ │ ├── usb_driver.h
│ │ │ ├── usb_endpoints.c
│ │ │ ├── usb_endpoints.h
│ │ │ ├── usb_main.c
│ │ │ ├── usb_main.h
│ │ │ ├── usb_report_handling.c
│ │ │ ├── usb_report_handling.h
│ │ │ └── usb_util.c
│ │ ├── host.c
│ │ ├── host.h
│ │ ├── host_driver.h
│ │ ├── lufa/
│ │ │ ├── lufa.c
│ │ │ ├── lufa.h
│ │ │ ├── lufa.mk
│ │ │ └── usb_util.c
│ │ ├── report.c
│ │ ├── report.h
│ │ ├── usb_descriptor.c
│ │ ├── usb_descriptor.h
│ │ ├── usb_descriptor_common.h
│ │ ├── usb_device_state.c
│ │ ├── usb_device_state.h
│ │ ├── usb_hid/
│ │ │ ├── README
│ │ │ ├── override_Serial.cpp
│ │ │ ├── override_wiring.c
│ │ │ ├── parser.cpp
│ │ │ ├── parser.h
│ │ │ ├── usb_hid.h
│ │ │ └── usb_hid.mk
│ │ ├── usb_types.h
│ │ ├── usb_util.c
│ │ ├── usb_util.h
│ │ └── vusb/
│ │ ├── protocol.c
│ │ ├── usb_util.c
│ │ ├── usbconfig.h
│ │ ├── vusb.c
│ │ ├── vusb.h
│ │ └── vusb.mk
│ ├── protocol.mk
│ └── readme.md
└── util/
├── audio_generate_dac_lut.py
├── chibios_conf_updater.sh
├── ci/
│ ├── discord-results.py
│ ├── firmware_list_generator.py
│ ├── generate_failure_markdown.sh
│ ├── index_generator.py
│ ├── requirements.txt
│ └── templates/
│ └── index.html.j2
├── docker_build.sh
├── docker_cmd.sh
├── drivers.txt
├── env-bootstrap.sh
├── install/
│ ├── arch.sh
│ ├── debian.sh
│ ├── fedora.sh
│ ├── freebsd.sh
│ ├── gentoo.sh
│ ├── linux_shared.sh
│ ├── macos.sh
│ ├── msys2.sh
│ ├── slackware.sh
│ ├── solus.sh
│ └── void.sh
├── list-moved-keyboards.sh
├── polling_rate.py
├── qmk_install.sh
├── qmk_tab_complete.sh
├── regen.sh
├── rules_cleaner.sh
├── sample_parser.py
├── size_regression.sh
├── stm32eeprom_parser.py
├── udev/
│ └── 50-qmk.rules
├── uf2conv.py
├── uf2families.json
├── update_chibios_mirror.sh
├── usb_detach/
│ ├── Makefile
│ ├── readme.md
│ └── usb_detach.c
└── wavetable_parser.py
Showing preview only (617K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6659 symbols across 893 files)
FILE: builddefs/docsgen/.vitepress/theme/index.ts
method enhanceApp (line 10) | enhanceApp({ app }) {
FILE: drivers/backlight/backlight_software.c
function scale_backlight (line 33) | static uint8_t scale_backlight(uint8_t v) {
function backlight_init_ports (line 37) | void backlight_init_ports(void) {
function backlight_set (line 41) | void backlight_set(uint8_t level) {
function backlight_task (line 45) | void backlight_task(void) {
FILE: drivers/battery/battery.c
function battery_init (line 14) | void battery_init(void) {
function battery_percent_changed_user (line 20) | __attribute__((weak)) void battery_percent_changed_user(uint8_t level) {}
function battery_percent_changed_kb (line 21) | __attribute__((weak)) void battery_percent_changed_kb(uint8_t level) {}
function handle_percent_changed (line 23) | static void handle_percent_changed(void) {
function battery_task (line 28) | void battery_task(void) {
function battery_get_percent (line 39) | uint8_t battery_get_percent(void) {
FILE: drivers/battery/battery_adc.c
function battery_driver_init (line 28) | void battery_driver_init(void) {
function battery_driver_get_mv (line 32) | uint16_t battery_driver_get_mv(void) {
function battery_driver_sample_percent (line 44) | uint8_t battery_driver_sample_percent(void) {
FILE: drivers/bluetooth/bluefruit_le.cpp
type sdep_msg (line 53) | struct sdep_msg {
type queue_type (line 70) | enum queue_type {
type queue_item (line 76) | struct queue_item {
type queue_type (line 77) | enum queue_type
type queue_item (line 100) | struct queue_item
type queue_type (line 77) | enum queue_type
type sdep_type (line 102) | enum sdep_type {
type ble_cmd (line 111) | enum ble_cmd {
type ble_system_event_bits (line 118) | enum ble_system_event_bits {
function sdep_send_pkt (line 134) | static bool sdep_send_pkt(const struct sdep_msg *msg, uint16_t timeout) {
function sdep_build_pkt (line 163) | static inline void sdep_build_pkt(struct sdep_msg *msg, uint16_t command...
function sdep_recv_pkt (line 176) | static bool sdep_recv_pkt(struct sdep_msg *msg, uint16_t timeout) {
function resp_buf_read_one (line 219) | static void resp_buf_read_one(bool greedy) {
function send_buf_send_one (line 249) | static void send_buf_send_one(uint16_t timeout = SdepTimeout) {
function resp_buf_wait (line 271) | static void resp_buf_wait(const char *cmd) {
function bluefruit_le_init (line 282) | void bluefruit_le_init(void) {
function min (line 303) | static inline uint8_t min(uint8_t a, uint8_t b) {
function read_response (line 307) | static bool read_response(char *resp, uint16_t resplen, bool verbose) {
function at_command (line 366) | static bool at_command(const char *cmd, char *resp, uint16_t resplen, bo...
function at_command_P (line 411) | bool at_command_P(const char *cmd, char *resp, uint16_t resplen, bool ve...
function bluefruit_le_is_connected (line 417) | bool bluefruit_le_is_connected(void) {
function bluefruit_le_enable_keyboard (line 421) | bool bluefruit_le_enable_keyboard(void) {
function set_connected (line 473) | static void set_connected(bool connected) {
function bluefruit_le_task (line 493) | void bluefruit_le_task(void) {
function process_queue_item (line 545) | static bool process_queue_item(struct queue_item *item, uint16_t timeout) {
function bluefruit_le_send_keyboard (line 598) | void bluefruit_le_send_keyboard(report_keyboard_t *report) {
function bluefruit_le_send_consumer (line 615) | void bluefruit_le_send_consumer(uint16_t usage) {
function bluefruit_le_send_mouse (line 626) | void bluefruit_le_send_mouse(report_mouse_t *report) {
function bluefruit_le_set_mode_leds (line 641) | bool bluefruit_le_set_mode_leds(bool on) {
function bluefruit_le_set_power_level (line 657) | bool bluefruit_le_set_power_level(int8_t level) {
FILE: drivers/bluetooth/bluetooth.c
function bluetooth_init (line 6) | __attribute__((weak)) void bluetooth_init(void) {}
function bluetooth_task (line 8) | __attribute__((weak)) void bluetooth_task(void) {}
function bluetooth_is_connected (line 10) | __attribute__((weak)) bool bluetooth_is_connected(void) {
function bluetooth_can_send_nkro (line 14) | __attribute__((weak)) bool bluetooth_can_send_nkro(void) {
function bluetooth_keyboard_leds (line 18) | __attribute__((weak)) uint8_t bluetooth_keyboard_leds(void) {
function bluetooth_send_keyboard (line 22) | __attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *re...
function bluetooth_send_nkro (line 24) | __attribute__((weak)) void bluetooth_send_nkro(report_nkro_t *report) {}
function bluetooth_send_mouse (line 26) | __attribute__((weak)) void bluetooth_send_mouse(report_mouse_t *report) {}
function bluetooth_send_consumer (line 28) | __attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {}
function bluetooth_send_system (line 30) | __attribute__((weak)) void bluetooth_send_system(uint16_t usage) {}
function bluetooth_send_raw_hid (line 32) | __attribute__((weak)) void bluetooth_send_raw_hid(uint8_t *data, uint8_t...
FILE: drivers/bluetooth/bluetooth_drivers.c
function bluetooth_init (line 26) | void bluetooth_init(void) {
function bluetooth_task (line 34) | void bluetooth_task(void) {
function bluetooth_is_connected (line 40) | bool bluetooth_is_connected(void) {
function bluetooth_send_keyboard (line 49) | void bluetooth_send_keyboard(report_keyboard_t *report) {
function bluetooth_send_mouse (line 57) | void bluetooth_send_mouse(report_mouse_t *report) {
function bluetooth_send_consumer (line 65) | void bluetooth_send_consumer(uint16_t usage) {
FILE: drivers/bluetooth/ringbuffer.hpp
class RingBuffer (line 4) | class RingBuffer {
method nextPosition (line 9) | inline uint8_t nextPosition(uint8_t position) {
method prevPosition (line 13) | inline uint8_t prevPosition(uint8_t position) {
method enqueue (line 20) | inline bool enqueue(const T &item) {
method get (line 33) | inline bool get(T &dest, bool commit = true) {
method empty (line 49) | inline bool empty() const { return head_ == tail_; }
method size (line 51) | inline uint8_t size() const {
method T (line 59) | inline T& front() {
method peek (line 63) | inline bool peek(T &item) {
FILE: drivers/bluetooth/rn42.c
function rn42_consumer_usage_to_bitmap (line 27) | static inline uint16_t rn42_consumer_usage_to_bitmap(uint16_t usage) {
function rn42_init (line 66) | void rn42_init(void) {
function rn42_send_keyboard (line 70) | void rn42_send_keyboard(report_keyboard_t *report) {
function rn42_send_mouse (line 85) | void rn42_send_mouse(report_mouse_t *report) {
function rn42_send_consumer (line 96) | void rn42_send_consumer(uint16_t usage) {
FILE: drivers/eeprom/eeprom_driver.c
function eeprom_read_byte (line 22) | uint8_t eeprom_read_byte(const uint8_t *addr) {
function eeprom_read_word (line 28) | uint16_t eeprom_read_word(const uint16_t *addr) {
function eeprom_read_dword (line 34) | uint32_t eeprom_read_dword(const uint32_t *addr) {
function eeprom_write_byte (line 40) | void eeprom_write_byte(uint8_t *addr, uint8_t value) {
function eeprom_write_word (line 44) | void eeprom_write_word(uint16_t *addr, uint16_t value) {
function eeprom_write_dword (line 48) | void eeprom_write_dword(uint32_t *addr, uint32_t value) {
function eeprom_update_block (line 52) | void eeprom_update_block(const void *buf, void *addr, size_t len) {
function eeprom_update_byte (line 60) | void eeprom_update_byte(uint8_t *addr, uint8_t value) {
function eeprom_update_word (line 67) | void eeprom_update_word(uint16_t *addr, uint16_t value) {
function eeprom_update_dword (line 74) | void eeprom_update_dword(uint32_t *addr, uint32_t value) {
function eeprom_driver_format (line 82) | void eeprom_driver_format(bool erase) {
FILE: drivers/eeprom/eeprom_i2c.c
function fill_target_address (line 49) | static inline void fill_target_address(uint8_t *buffer, const void *addr) {
function eeprom_driver_init (line 57) | void eeprom_driver_init(void) {
function eeprom_driver_format (line 66) | void eeprom_driver_format(bool erase) {
function eeprom_driver_erase (line 73) | void eeprom_driver_erase(void) {
function eeprom_read_block (line 89) | void eeprom_read_block(void *buf, const void *addr, size_t len) {
function eeprom_write_block (line 105) | void eeprom_write_block(const void *buf, void *addr, size_t len) {
FILE: drivers/eeprom/eeprom_spi.c
function spi_eeprom_start (line 56) | static bool spi_eeprom_start(void) {
function spi_status_t (line 60) | static spi_status_t spi_eeprom_wait_while_busy(int timeout) {
function spi_eeprom_transmit_address (line 79) | static void spi_eeprom_transmit_address(uintptr_t addr) {
function eeprom_driver_init (line 92) | void eeprom_driver_init(void) {
function eeprom_driver_format (line 96) | void eeprom_driver_format(bool erase) {
function eeprom_driver_erase (line 103) | void eeprom_driver_erase(void) {
function eeprom_read_block (line 119) | void eeprom_read_block(void *buf, const void *addr, size_t len) {
function eeprom_write_block (line 155) | void eeprom_write_block(const void *buf, void *addr, size_t len) {
FILE: drivers/eeprom/eeprom_transient.c
function clamp_length (line 25) | size_t clamp_length(intptr_t offset, size_t len) {
function eeprom_driver_init (line 33) | void eeprom_driver_init(void) {}
function eeprom_driver_format (line 35) | void eeprom_driver_format(bool erase) {
function eeprom_driver_erase (line 42) | void eeprom_driver_erase(void) {
function eeprom_read_block (line 46) | void eeprom_read_block(void *buf, const void *addr, size_t len) {
function eeprom_write_block (line 55) | void eeprom_write_block(const void *buf, void *addr, size_t len) {
FILE: drivers/eeprom/eeprom_wear_leveling.c
function eeprom_driver_init (line 9) | void eeprom_driver_init(void) {
function eeprom_driver_format (line 13) | void eeprom_driver_format(bool erase) {
function eeprom_driver_erase (line 19) | void eeprom_driver_erase(void) {
function eeprom_read_block (line 23) | void eeprom_read_block(void *buf, const void *addr, size_t len) {
function eeprom_write_block (line 27) | void eeprom_write_block(const void *buf, void *addr, size_t len) {
FILE: drivers/encoder/encoder_quadrature.c
function encoder_wait_pullup_charge (line 40) | __attribute__((weak)) void encoder_wait_pullup_charge(void) {
function encoder_quadrature_init_pin (line 44) | __attribute__((weak)) void encoder_quadrature_init_pin(uint8_t index, bo...
function encoder_quadrature_read_pin (line 51) | __attribute__((weak)) uint8_t encoder_quadrature_read_pin(uint8_t index,...
function encoder_quadrature_post_init_kb (line 86) | __attribute__((weak)) void encoder_quadrature_post_init_kb(void) {
function encoder_quadrature_post_init (line 92) | void encoder_quadrature_post_init(void) {
function encoder_driver_init (line 109) | void encoder_driver_init(void) {
function encoder_quadrature_handle_read (line 200) | void encoder_quadrature_handle_read(uint8_t index, uint8_t pin_a_state, ...
function encoder_driver_task (line 209) | __attribute__((weak)) void encoder_driver_task(void) {
FILE: drivers/flash/flash.h
type flash_status_t (line 27) | typedef int16_t flash_status_t;
FILE: drivers/flash/flash_spi.c
function spi_flash_start (line 56) | static bool spi_flash_start(void) {
function flash_status_t (line 60) | static flash_status_t spi_flash_wait_while_busy_multiplier(int multiplie...
function flash_status_t (line 74) | static flash_status_t spi_flash_wait_while_busy(void) {
function flash_status_t (line 78) | flash_status_t flash_is_busy(void) {
function flash_status_t (line 97) | static flash_status_t spi_flash_write_enable(void) {
function flash_status_t (line 110) | static flash_status_t spi_flash_write_disable(void) {
function flash_status_t (line 124) | static flash_status_t spi_flash_transaction(uint8_t cmd, uint32_t addr, ...
function flash_init (line 161) | void flash_init(void) {
function flash_status_t (line 165) | flash_status_t flash_begin_erase_chip(void) {
function flash_status_t (line 193) | flash_status_t flash_wait_erase_chip(void) {
function flash_status_t (line 202) | flash_status_t flash_erase_chip(void) {
function flash_status_t (line 212) | flash_status_t flash_erase_sector(uint32_t addr) {
function flash_status_t (line 252) | flash_status_t flash_erase_block(uint32_t addr) {
function flash_status_t (line 292) | flash_status_t flash_read_range(uint32_t addr, void *buf, size_t len) {
function flash_status_t (line 323) | flash_status_t flash_write_range(uint32_t addr, const void *buf, size_t ...
FILE: drivers/gpio/mcp23018.c
function mcp23018_init (line 23) | void mcp23018_init(uint8_t addr) {
function mcp23018_set_config (line 33) | bool mcp23018_set_config(uint8_t slave_addr, mcp23018_port_t port, uint8...
function mcp23018_set_output (line 53) | bool mcp23018_set_output(uint8_t slave_addr, mcp23018_port_t port, uint8...
function mcp23018_set_output_all (line 66) | bool mcp23018_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t ...
function mcp23018_read_pins (line 79) | bool mcp23018_read_pins(uint8_t slave_addr, mcp23018_port_t port, uint8_...
function mcp23018_read_pins_all (line 92) | bool mcp23018_read_pins_all(uint8_t slave_addr, uint16_t* out) {
FILE: drivers/gpio/mcp23018.h
type mcp23018_port_t (line 12) | typedef enum {
FILE: drivers/gpio/pca9505.c
function pca9505_init (line 35) | void pca9505_init(uint8_t slave_addr) {
function pca9505_set_config (line 46) | bool pca9505_set_config(uint8_t slave_addr, pca9505_port_t port, uint8_t...
function pca9505_set_polarity (line 76) | bool pca9505_set_polarity(uint8_t slave_addr, pca9505_port_t port, uint8...
function pca9505_set_output (line 106) | bool pca9505_set_output(uint8_t slave_addr, pca9505_port_t port, uint8_t...
function pca9505_read_pins (line 136) | bool pca9505_read_pins(uint8_t slave_addr, pca9505_port_t port, uint8_t*...
FILE: drivers/gpio/pca9505.h
type pca9505_port_t (line 12) | typedef enum {
FILE: drivers/gpio/pca9555.c
function pca9555_init (line 23) | void pca9555_init(uint8_t slave_addr) {
function pca9555_set_config (line 34) | bool pca9555_set_config(uint8_t slave_addr, pca9555_port_t port, uint8_t...
function pca9555_set_output (line 47) | bool pca9555_set_output(uint8_t slave_addr, pca9555_port_t port, uint8_t...
function pca9555_set_output_all (line 60) | bool pca9555_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t c...
function pca9555_read_pins (line 73) | bool pca9555_read_pins(uint8_t slave_addr, pca9555_port_t port, uint8_t*...
function pca9555_read_pins_all (line 86) | bool pca9555_read_pins_all(uint8_t slave_addr, uint16_t* out) {
FILE: drivers/gpio/pca9555.h
type pca9555_port_t (line 35) | typedef enum {
FILE: drivers/gpio/sn74x138.c
function sn74x138_init (line 28) | void sn74x138_init(void) {
function sn74x138_set_enabled (line 49) | void sn74x138_set_enabled(bool enabled) {
function sn74x138_set_addr (line 61) | void sn74x138_set_addr(uint8_t address) {
FILE: drivers/gpio/sn74x154.c
function sn74x154_init (line 28) | void sn74x154_init(void) {
function sn74x154_set_enabled (line 45) | void sn74x154_set_enabled(bool enabled) {
function sn74x154_set_addr (line 54) | void sn74x154_set_addr(uint8_t address) {
FILE: drivers/haptic/drv2605l.c
function drv2605l_write (line 25) | void drv2605l_write(uint8_t reg_addr, uint8_t data) {
function drv2605l_read (line 31) | uint8_t drv2605l_read(uint8_t reg_addr) {
function drv2605l_init (line 37) | void drv2605l_init(void) {
function drv2605l_rtp_init (line 111) | void drv2605l_rtp_init(void) {
function drv2605l_amplitude (line 118) | void drv2605l_amplitude(uint8_t amplitude) {
function drv2605l_pulse (line 122) | void drv2605l_pulse(uint8_t sequence) {
FILE: drivers/haptic/drv2605l.h
type drv2605l_effect_t (line 178) | typedef enum drv2605l_effect_t {
type drv2605l_reg_feedback_ctrl_t (line 308) | typedef union { /* register 0x1A */
type drv2605l_reg_ctrl1_t (line 318) | typedef union { /* register 0x1B */
type drv2605l_reg_ctrl2_t (line 328) | typedef union { /* register 0x1C */
type drv2605l_reg_ctrl3_t (line 339) | typedef union { /* register 0x1D */
type drv2605l_reg_ctrl4_t (line 352) | typedef union { /* register 0x1E */
FILE: drivers/haptic/solenoid.c
function solenoid_buzz_on (line 42) | void solenoid_buzz_on(void) {
function solenoid_buzz_off (line 46) | void solenoid_buzz_off(void) {
function solenoid_set_buzz (line 50) | void solenoid_set_buzz(uint8_t buzz) {
function solenoid_set_dwell (line 54) | void solenoid_set_dwell(uint8_t dwell) {
function solenoid_stop (line 63) | void solenoid_stop(uint8_t index) {
function solenoid_fire (line 74) | void solenoid_fire(uint8_t index) {
function solenoid_fire_handler (line 88) | void solenoid_fire_handler(void) {
function solenoid_check (line 112) | void solenoid_check(void) {
function solenoid_setup (line 147) | void solenoid_setup(void) {
function solenoid_shutdown (line 171) | void solenoid_shutdown(void) {
FILE: drivers/i2c_master.h
type i2c_status_t (line 17) | typedef int16_t i2c_status_t;
FILE: drivers/lcd/hd44780.c
function hd44780_latch (line 59) | static void hd44780_latch(void) {
function hd44780_write (line 65) | void hd44780_write(uint8_t data, bool isData) {
function hd44780_read (line 90) | uint8_t hd44780_read(bool isData) {
function hd44780_busy (line 125) | bool hd44780_busy(void) {
function hd44780_command (line 129) | void hd44780_command(uint8_t command) {
function hd44780_data (line 135) | void hd44780_data(uint8_t data) {
function hd44780_clear (line 141) | void hd44780_clear(void) {
function hd44780_home (line 145) | void hd44780_home(void) {
function hd44780_on (line 149) | void hd44780_on(bool cursor, bool blink) {
function hd44780_off (line 161) | void hd44780_off(void) {
function hd44780_set_cgram_address (line 165) | void hd44780_set_cgram_address(uint8_t address) {
function hd44780_set_ddram_address (line 169) | void hd44780_set_ddram_address(uint8_t address) {
function hd44780_init (line 173) | void hd44780_init(bool cursor, bool blink) {
function hd44780_set_cursor (line 212) | void hd44780_set_cursor(uint8_t col, uint8_t line) {
function hd44780_define_char (line 228) | void hd44780_define_char(uint8_t index, uint8_t *data) {
function hd44780_putc (line 235) | void hd44780_putc(char c) {
function hd44780_puts (line 263) | void hd44780_puts(const char *s) {
function hd44780_define_char_P (line 271) | void hd44780_define_char_P(uint8_t index, const uint8_t *data) {
function hd44780_puts_P (line 278) | void hd44780_puts_P(const char *s) {
FILE: drivers/lcd/st7565.c
function InvertCharacter (line 87) | static void InvertCharacter(uint8_t *cursor) {
function st7565_init (line 95) | bool st7565_init(display_rotation_t rotation) {
function display_rotation_t (line 142) | __attribute__((weak)) display_rotation_t st7565_init_user(display_rotati...
function st7565_clear (line 146) | void st7565_clear(void) {
function crot (line 152) | uint8_t crot(uint8_t a, int8_t n) {
function st7565_render (line 158) | void st7565_render(void) {
function st7565_set_cursor (line 200) | void st7565_set_cursor(uint8_t col, uint8_t line) {
function st7565_advance_page (line 211) | void st7565_advance_page(bool clearPageRemainder) {
function st7565_advance_char (line 233) | void st7565_advance_char(void) {
function st7565_write_char (line 252) | void st7565_write_char(const char data, bool invert) {
function st7565_write (line 297) | void st7565_write(const char *data, bool invert) {
function st7565_write_ln (line 305) | void st7565_write_ln(const char *data, bool invert) {
function st7565_pan (line 310) | void st7565_pan(bool left) {
function display_buffer_reader_t (line 328) | display_buffer_reader_t st7565_read_raw(uint16_t start_index) {
function st7565_write_raw_byte (line 336) | void st7565_write_raw_byte(const char data, uint16_t index) {
function st7565_write_raw (line 343) | void st7565_write_raw(const char *data, uint16_t size) {
function st7565_write_pixel (line 354) | void st7565_write_pixel(uint8_t x, uint8_t y, bool on) {
function st7565_write_P (line 375) | void st7565_write_P(const char *data, bool invert) {
function st7565_write_ln_P (line 383) | void st7565_write_ln_P(const char *data, bool invert) {
function st7565_write_raw_P (line 388) | void st7565_write_raw_P(const char *data, uint16_t size) {
function st7565_on (line 400) | bool st7565_on(void) {
function st7565_on_user (line 419) | __attribute__((weak)) void st7565_on_user(void) {}
function st7565_off (line 421) | bool st7565_off(void) {
function st7565_off_user (line 436) | __attribute__((weak)) void st7565_off_user(void) {}
function st7565_is_on (line 438) | bool st7565_is_on(void) {
function st7565_invert (line 442) | bool st7565_invert(bool invert) {
function st7565_max_chars (line 456) | uint8_t st7565_max_chars(void) {
function st7565_max_lines (line 460) | uint8_t st7565_max_lines(void) {
function st7565_task (line 464) | void st7565_task(void) {
function st7565_task_user (line 491) | __attribute__((weak)) void st7565_task_user(void) {}
function st7565_reset (line 493) | void st7565_reset(void) {
function spi_status_t (line 500) | spi_status_t st7565_send_cmd(uint8_t cmd) {
function spi_status_t (line 505) | spi_status_t st7565_send_data(uint8_t *data, uint16_t length) {
FILE: drivers/lcd/st7565.h
type display_buffer_reader_t (line 91) | typedef struct __attribute__((__packed__)) {
type display_rotation_t (line 97) | typedef enum { DISPLAY_ROTATION_0, DISPLAY_ROTATION_180 } display_rotati...
FILE: drivers/led/apa102.c
function apa102_send_byte (line 59) | static void apa102_send_byte(uint8_t byte) {
function apa102_start_frame (line 70) | static void apa102_start_frame(void) {
function apa102_end_frame (line 79) | static void apa102_end_frame(uint16_t num_leds) {
function apa102_send_frame (line 113) | static void apa102_send_frame(uint8_t red, uint8_t green, uint8_t blue, ...
function apa102_init (line 120) | void apa102_init(void) {
function apa102_set_color (line 125) | void apa102_set_color(int index, uint8_t red, uint8_t green, uint8_t blu...
function apa102_set_color_all (line 131) | void apa102_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function apa102_flush (line 137) | void apa102_flush(void) {
function apa102_set_brightness (line 145) | void apa102_set_brightness(uint8_t brightness) {
FILE: drivers/led/aw20216s.c
type aw20216s_driver_t (line 48) | typedef struct aw20216s_driver_t {
function aw20216s_write (line 58) | bool aw20216s_write(pin_t cs_pin, uint8_t page, uint8_t reg, uint8_t* da...
function aw20216s_write_register (line 83) | static inline bool aw20216s_write_register(pin_t cs_pin, uint8_t page, u...
function aw20216s_soft_reset (line 88) | void aw20216s_soft_reset(pin_t cs_pin) {
function aw20216s_init_scaling (line 92) | static void aw20216s_init_scaling(pin_t cs_pin) {
function aw20216s_init_current_limit (line 99) | static inline void aw20216s_init_current_limit(pin_t cs_pin) {
function aw20216s_soft_enable (line 104) | static inline void aw20216s_soft_enable(pin_t cs_pin) {
function aw20216s_auto_lowpower (line 109) | static inline void aw20216s_auto_lowpower(pin_t cs_pin) {
function aw20216s_init_drivers (line 113) | void aw20216s_init_drivers(void) {
function aw20216s_init (line 127) | void aw20216s_init(pin_t cs_pin) {
function aw20216s_set_color (line 139) | void aw20216s_set_color(int index, uint8_t red, uint8_t green, uint8_t b...
function aw20216s_set_color_all (line 153) | void aw20216s_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function aw20216s_update_pwm_buffers (line 159) | void aw20216s_update_pwm_buffers(pin_t cs_pin, uint8_t index) {
function aw20216s_flush (line 166) | void aw20216s_flush(void) {
FILE: drivers/led/aw20216s.h
type aw20216s_led_t (line 57) | typedef struct aw20216s_led_t {
FILE: drivers/led/issi/is31fl3218-mono.c
type is31fl3218_driver_t (line 32) | typedef struct is31fl3218_driver_t {
function is31fl3218_write_register (line 47) | void is31fl3218_write_register(uint8_t reg, uint8_t data) {
function is31fl3218_write_pwm_buffer (line 57) | void is31fl3218_write_pwm_buffer(void) {
function is31fl3218_init (line 67) | void is31fl3218_init(void) {
function is31fl3218_set_value (line 101) | void is31fl3218_set_value(int index, uint8_t value) {
function is31fl3218_set_value_all (line 116) | void is31fl3218_set_value_all(uint8_t value) {
function is31fl3218_set_led_control_register (line 122) | void is31fl3218_set_led_control_register(uint8_t index, bool value) {
function is31fl3218_update_pwm_buffers (line 138) | void is31fl3218_update_pwm_buffers(void) {
function is31fl3218_update_led_control_registers (line 148) | void is31fl3218_update_led_control_registers(void) {
FILE: drivers/led/issi/is31fl3218-mono.h
type is31fl3218_led_t (line 38) | typedef struct is31fl3218_led_t {
FILE: drivers/led/issi/is31fl3218.c
type is31fl3218_driver_t (line 32) | typedef struct is31fl3218_driver_t {
function is31fl3218_write_register (line 47) | void is31fl3218_write_register(uint8_t reg, uint8_t data) {
function is31fl3218_write_pwm_buffer (line 57) | void is31fl3218_write_pwm_buffer(void) {
function is31fl3218_init (line 67) | void is31fl3218_init(void) {
function is31fl3218_set_color (line 101) | void is31fl3218_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3218_set_color_all (line 118) | void is31fl3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3218_set_led_control_register (line 124) | void is31fl3218_set_led_control_register(uint8_t index, bool red, bool g...
function is31fl3218_update_pwm_buffers (line 154) | void is31fl3218_update_pwm_buffers(void) {
function is31fl3218_update_led_control_registers (line 164) | void is31fl3218_update_led_control_registers(void) {
FILE: drivers/led/issi/is31fl3218.h
type is31fl3218_led_t (line 38) | typedef struct is31fl3218_led_t {
FILE: drivers/led/issi/is31fl3236-mono.c
type is31fl3236_driver_t (line 36) | typedef struct is31fl3236_driver_t {
function is31fl3236_write_register (line 50) | void is31fl3236_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3236_write_pwm_buffer (line 60) | void is31fl3236_write_pwm_buffer(uint8_t index) {
function is31fl3236_init_drivers (line 70) | void is31fl3236_init_drivers(void) {
function is31fl3236_init (line 91) | void is31fl3236_init(uint8_t index) {
function is31fl3236_set_value (line 115) | void is31fl3236_set_value(int index, uint8_t value) {
function is31fl3236_set_value_all (line 130) | void is31fl3236_set_value_all(uint8_t value) {
function is31fl3236_set_led_control_register (line 136) | void is31fl3236_set_led_control_register(uint8_t index, bool value) {
function is31fl3236_update_pwm_buffers (line 144) | void is31fl3236_update_pwm_buffers(uint8_t index) {
function is31fl3236_update_led_control_registers (line 154) | void is31fl3236_update_led_control_registers(uint8_t index) {
function is31fl3236_flush (line 164) | void is31fl3236_flush(void) {
FILE: drivers/led/issi/is31fl3236-mono.h
type is31fl3236_led_t (line 38) | typedef struct is31fl3236_led_t {
FILE: drivers/led/issi/is31fl3236.c
type is31fl3236_driver_t (line 36) | typedef struct is31fl3236_driver_t {
function is31fl3236_write_register (line 50) | void is31fl3236_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3236_write_pwm_buffer (line 60) | void is31fl3236_write_pwm_buffer(uint8_t index) {
function is31fl3236_init_drivers (line 70) | void is31fl3236_init_drivers(void) {
function is31fl3236_init (line 91) | void is31fl3236_init(uint8_t index) {
function is31fl3236_set_color (line 115) | void is31fl3236_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3236_set_color_all (line 132) | void is31fl3236_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3236_set_led_control_register (line 138) | void is31fl3236_set_led_control_register(uint8_t index, bool red, bool g...
function is31fl3236_update_pwm_buffers (line 148) | void is31fl3236_update_pwm_buffers(uint8_t index) {
function is31fl3236_update_led_control_registers (line 158) | void is31fl3236_update_led_control_registers(uint8_t index) {
function is31fl3236_flush (line 168) | void is31fl3236_flush(void) {
FILE: drivers/led/issi/is31fl3236.h
type is31fl3236_led_t (line 38) | typedef struct is31fl3236_led_t {
FILE: drivers/led/issi/is31fl3729-mono.c
type is31fl3729_driver_t (line 82) | typedef struct is31fl3729_driver_t {
function is31fl3729_write_register (line 96) | void is31fl3729_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3729_write_pwm_buffer (line 106) | void is31fl3729_write_pwm_buffer(uint8_t index) {
function is31fl3729_init_drivers (line 121) | void is31fl3729_init_drivers(void) {
function is31fl3729_init (line 142) | void is31fl3729_init(uint8_t index) {
function is31fl3729_set_value (line 158) | void is31fl3729_set_value(int index, uint8_t value) {
function is31fl3729_set_value_all (line 172) | void is31fl3729_set_value_all(uint8_t value) {
function is31fl3729_set_scaling_register (line 178) | void is31fl3729_set_scaling_register(uint8_t index, uint8_t value) {
function is31fl3729_update_pwm_buffers (line 191) | void is31fl3729_update_pwm_buffers(uint8_t index) {
function is31fl3729_update_scaling_registers (line 199) | void is31fl3729_update_scaling_registers(uint8_t index) {
function is31fl3729_flush (line 209) | void is31fl3729_flush(void) {
FILE: drivers/led/issi/is31fl3729-mono.h
type is31fl3729_led_t (line 54) | typedef struct is31fl3729_led_t {
FILE: drivers/led/issi/is31fl3729.c
type is31fl3729_driver_t (line 82) | typedef struct is31fl3729_driver_t {
function is31fl3729_write_register (line 96) | void is31fl3729_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3729_write_pwm_buffer (line 106) | void is31fl3729_write_pwm_buffer(uint8_t index) {
function is31fl3729_init_drivers (line 121) | void is31fl3729_init_drivers(void) {
function is31fl3729_init (line 142) | void is31fl3729_init(uint8_t index) {
function is31fl3729_set_color (line 158) | void is31fl3729_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3729_set_color_all (line 174) | void is31fl3729_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3729_set_scaling_register (line 180) | void is31fl3729_set_scaling_register(uint8_t index, uint8_t red, uint8_t...
function is31fl3729_update_pwm_buffers (line 197) | void is31fl3729_update_pwm_buffers(uint8_t index) {
function is31fl3729_update_scaling_registers (line 205) | void is31fl3729_update_scaling_registers(uint8_t index) {
function is31fl3729_flush (line 215) | void is31fl3729_flush(void) {
FILE: drivers/led/issi/is31fl3729.h
type is31fl3729_led_t (line 54) | typedef struct is31fl3729_led_t {
FILE: drivers/led/issi/is31fl3731-mono.c
type is31fl3731_driver_t (line 54) | typedef struct is31fl3731_driver_t {
function is31fl3731_write_register (line 68) | void is31fl3731_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3731_select_page (line 78) | void is31fl3731_select_page(uint8_t index, uint8_t page) {
function is31fl3731_write_pwm_buffer (line 82) | void is31fl3731_write_pwm_buffer(uint8_t index) {
function is31fl3731_init_drivers (line 98) | void is31fl3731_init_drivers(void) {
function is31fl3731_init (line 119) | void is31fl3731_init(uint8_t index) {
function is31fl3731_set_value (line 171) | void is31fl3731_set_value(int index, uint8_t value) {
function is31fl3731_set_value_all (line 186) | void is31fl3731_set_value_all(uint8_t value) {
function is31fl3731_set_led_control_register (line 192) | void is31fl3731_set_led_control_register(uint8_t index, bool value) {
function is31fl3731_update_pwm_buffers (line 208) | void is31fl3731_update_pwm_buffers(uint8_t index) {
function is31fl3731_update_led_control_registers (line 216) | void is31fl3731_update_led_control_registers(uint8_t index) {
function is31fl3731_flush (line 226) | void is31fl3731_flush(void) {
FILE: drivers/led/issi/is31fl3731-mono.h
type is31fl3731_led_t (line 73) | typedef struct is31fl3731_led_t {
FILE: drivers/led/issi/is31fl3731.c
type is31fl3731_driver_t (line 53) | typedef struct is31fl3731_driver_t {
function is31fl3731_write_register (line 67) | void is31fl3731_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3731_select_page (line 77) | void is31fl3731_select_page(uint8_t index, uint8_t page) {
function is31fl3731_write_pwm_buffer (line 81) | void is31fl3731_write_pwm_buffer(uint8_t index) {
function is31fl3731_init_drivers (line 97) | void is31fl3731_init_drivers(void) {
function is31fl3731_init (line 118) | void is31fl3731_init(uint8_t index) {
function is31fl3731_set_color (line 170) | void is31fl3731_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3731_set_color_all (line 187) | void is31fl3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3731_set_led_control_register (line 193) | void is31fl3731_set_led_control_register(uint8_t index, bool red, bool g...
function is31fl3731_update_pwm_buffers (line 223) | void is31fl3731_update_pwm_buffers(uint8_t index) {
function is31fl3731_update_led_control_registers (line 231) | void is31fl3731_update_led_control_registers(uint8_t index) {
function is31fl3731_flush (line 241) | void is31fl3731_flush(void) {
FILE: drivers/led/issi/is31fl3731.h
type is31fl3731_led_t (line 72) | typedef struct is31fl3731_led_t {
FILE: drivers/led/issi/is31fl3733-mono.c
type is31fl3733_driver_t (line 98) | typedef struct is31fl3733_driver_t {
function is31fl3733_write_register (line 112) | void is31fl3733_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3733_select_page (line 122) | void is31fl3733_select_page(uint8_t index, uint8_t page) {
function is31fl3733_write_pwm_buffer (line 127) | void is31fl3733_write_pwm_buffer(uint8_t index) {
function is31fl3733_init_drivers (line 143) | void is31fl3733_init_drivers(void) {
function is31fl3733_init (line 164) | void is31fl3733_init(uint8_t index) {
function is31fl3733_set_value (line 202) | void is31fl3733_set_value(int index, uint8_t value) {
function is31fl3733_set_value_all (line 217) | void is31fl3733_set_value_all(uint8_t value) {
function is31fl3733_set_led_control_register (line 223) | void is31fl3733_set_led_control_register(uint8_t index, bool value) {
function is31fl3733_update_pwm_buffers (line 239) | void is31fl3733_update_pwm_buffers(uint8_t index) {
function is31fl3733_update_led_control_registers (line 249) | void is31fl3733_update_led_control_registers(uint8_t index) {
function is31fl3733_flush (line 261) | void is31fl3733_flush(void) {
FILE: drivers/led/issi/is31fl3733-mono.h
type is31fl3733_led_t (line 78) | typedef struct is31fl3733_led_t {
FILE: drivers/led/issi/is31fl3733.c
type is31fl3733_driver_t (line 97) | typedef struct is31fl3733_driver_t {
function is31fl3733_write_register (line 111) | void is31fl3733_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3733_select_page (line 121) | void is31fl3733_select_page(uint8_t index, uint8_t page) {
function is31fl3733_write_pwm_buffer (line 126) | void is31fl3733_write_pwm_buffer(uint8_t index) {
function is31fl3733_init_drivers (line 142) | void is31fl3733_init_drivers(void) {
function is31fl3733_init (line 163) | void is31fl3733_init(uint8_t index) {
function is31fl3733_set_color (line 201) | void is31fl3733_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3733_set_color_all (line 218) | void is31fl3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3733_set_led_control_register (line 224) | void is31fl3733_set_led_control_register(uint8_t index, bool red, bool g...
function is31fl3733_update_pwm_buffers (line 254) | void is31fl3733_update_pwm_buffers(uint8_t index) {
function is31fl3733_update_led_control_registers (line 264) | void is31fl3733_update_led_control_registers(uint8_t index) {
function is31fl3733_flush (line 276) | void is31fl3733_flush(void) {
FILE: drivers/led/issi/is31fl3733.h
type is31fl3733_led_t (line 77) | typedef struct is31fl3733_led_t {
FILE: drivers/led/issi/is31fl3736-mono.c
type is31fl3736_driver_t (line 69) | typedef struct is31fl3736_driver_t {
function is31fl3736_write_register (line 83) | void is31fl3736_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3736_select_page (line 93) | void is31fl3736_select_page(uint8_t index, uint8_t page) {
function is31fl3736_write_pwm_buffer (line 98) | void is31fl3736_write_pwm_buffer(uint8_t index) {
function is31fl3736_init_drivers (line 114) | void is31fl3736_init_drivers(void) {
function is31fl3736_init (line 135) | void is31fl3736_init(uint8_t index) {
function is31fl3736_set_value (line 171) | void is31fl3736_set_value(int index, uint8_t value) {
function is31fl3736_set_value_all (line 186) | void is31fl3736_set_value_all(uint8_t value) {
function is31fl3736_set_led_control_register (line 192) | void is31fl3736_set_led_control_register(uint8_t index, bool value) {
function is31fl3736_update_pwm_buffers (line 214) | void is31fl3736_update_pwm_buffers(uint8_t index) {
function is31fl3736_update_led_control_registers (line 224) | void is31fl3736_update_led_control_registers(uint8_t index) {
function is31fl3736_flush (line 236) | void is31fl3736_flush(void) {
FILE: drivers/led/issi/is31fl3736-mono.h
type is31fl3736_led_t (line 75) | typedef struct is31fl3736_led_t {
FILE: drivers/led/issi/is31fl3736.c
type is31fl3736_driver_t (line 69) | typedef struct is31fl3736_driver_t {
function is31fl3736_write_register (line 83) | void is31fl3736_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3736_select_page (line 93) | void is31fl3736_select_page(uint8_t index, uint8_t page) {
function is31fl3736_write_pwm_buffer (line 98) | void is31fl3736_write_pwm_buffer(uint8_t index) {
function is31fl3736_init_drivers (line 114) | void is31fl3736_init_drivers(void) {
function is31fl3736_init (line 135) | void is31fl3736_init(uint8_t index) {
function is31fl3736_set_color (line 171) | void is31fl3736_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3736_set_color_all (line 188) | void is31fl3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3736_set_led_control_register (line 194) | void is31fl3736_set_led_control_register(uint8_t index, bool red, bool g...
function is31fl3736_update_pwm_buffers (line 231) | void is31fl3736_update_pwm_buffers(uint8_t index) {
function is31fl3736_update_led_control_registers (line 241) | void is31fl3736_update_led_control_registers(uint8_t index) {
function is31fl3736_flush (line 253) | void is31fl3736_flush(void) {
FILE: drivers/led/issi/is31fl3736.h
type is31fl3736_led_t (line 75) | typedef struct is31fl3736_led_t {
FILE: drivers/led/issi/is31fl3737-mono.c
type is31fl3737_driver_t (line 71) | typedef struct is31fl3737_driver_t {
function is31fl3737_write_register (line 85) | void is31fl3737_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3737_select_page (line 95) | void is31fl3737_select_page(uint8_t index, uint8_t page) {
function is31fl3737_write_pwm_buffer (line 100) | void is31fl3737_write_pwm_buffer(uint8_t index) {
function is31fl3737_init_drivers (line 116) | void is31fl3737_init_drivers(void) {
function is31fl3737_init (line 137) | void is31fl3737_init(uint8_t index) {
function is31fl3737_set_value (line 173) | void is31fl3737_set_value(int index, uint8_t value) {
function is31fl3737_set_value_all (line 188) | void is31fl3737_set_value_all(uint8_t value) {
function is31fl3737_set_led_control_register (line 194) | void is31fl3737_set_led_control_register(uint8_t index, bool value) {
function is31fl3737_update_pwm_buffers (line 210) | void is31fl3737_update_pwm_buffers(uint8_t index) {
function is31fl3737_update_led_control_registers (line 220) | void is31fl3737_update_led_control_registers(uint8_t index) {
function is31fl3737_flush (line 232) | void is31fl3737_flush(void) {
FILE: drivers/led/issi/is31fl3737-mono.h
type is31fl3737_led_t (line 65) | typedef struct is31fl3737_led_t {
FILE: drivers/led/issi/is31fl3737.c
type is31fl3737_driver_t (line 71) | typedef struct is31fl3737_driver_t {
function is31fl3737_write_register (line 85) | void is31fl3737_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3737_select_page (line 95) | void is31fl3737_select_page(uint8_t index, uint8_t page) {
function is31fl3737_write_pwm_buffer (line 100) | void is31fl3737_write_pwm_buffer(uint8_t index) {
function is31fl3737_init_drivers (line 116) | void is31fl3737_init_drivers(void) {
function is31fl3737_init (line 137) | void is31fl3737_init(uint8_t index) {
function is31fl3737_set_color (line 173) | void is31fl3737_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3737_set_color_all (line 190) | void is31fl3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3737_set_led_control_register (line 196) | void is31fl3737_set_led_control_register(uint8_t index, bool red, bool g...
function is31fl3737_update_pwm_buffers (line 226) | void is31fl3737_update_pwm_buffers(uint8_t index) {
function is31fl3737_update_led_control_registers (line 236) | void is31fl3737_update_led_control_registers(uint8_t index) {
function is31fl3737_flush (line 248) | void is31fl3737_flush(void) {
FILE: drivers/led/issi/is31fl3737.h
type is31fl3737_led_t (line 65) | typedef struct is31fl3737_led_t {
FILE: drivers/led/issi/is31fl3741-mono.c
type is31fl3741_driver_t (line 77) | typedef struct is31fl3741_driver_t {
function is31fl3741_write_register (line 95) | void is31fl3741_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3741_select_page (line 105) | void is31fl3741_select_page(uint8_t index, uint8_t page) {
function is31fl3741_write_pwm_buffer (line 110) | void is31fl3741_write_pwm_buffer(uint8_t index) {
function is31fl3741_init_drivers (line 142) | void is31fl3741_init_drivers(void) {
function is31fl3741_init (line 163) | void is31fl3741_init(uint8_t index) {
function get_pwm_value (line 188) | uint8_t get_pwm_value(uint8_t driver, uint16_t reg) {
function set_pwm_value (line 196) | void set_pwm_value(uint8_t driver, uint16_t reg, uint8_t value) {
function is31fl3741_set_value (line 204) | void is31fl3741_set_value(int index, uint8_t value) {
function is31fl3741_set_value_all (line 219) | void is31fl3741_set_value_all(uint8_t value) {
function set_scaling_value (line 225) | void set_scaling_value(uint8_t driver, uint16_t reg, uint8_t value) {
function is31fl3741_set_led_control_register (line 233) | void is31fl3741_set_led_control_register(uint8_t index, bool value) {
function is31fl3741_update_pwm_buffers (line 242) | void is31fl3741_update_pwm_buffers(uint8_t index) {
function is31fl3741_set_pwm_buffer (line 250) | void is31fl3741_set_pwm_buffer(const is31fl3741_led_t *pled, uint8_t val...
function is31fl3741_update_led_control_registers (line 255) | void is31fl3741_update_led_control_registers(uint8_t index) {
function is31fl3741_set_scaling_registers (line 273) | void is31fl3741_set_scaling_registers(const is31fl3741_led_t *pled, uint...
function is31fl3741_flush (line 278) | void is31fl3741_flush(void) {
FILE: drivers/led/issi/is31fl3741-mono.h
type is31fl3741_led_t (line 67) | typedef struct is31fl3741_led_t {
FILE: drivers/led/issi/is31fl3741.c
type is31fl3741_driver_t (line 77) | typedef struct is31fl3741_driver_t {
function is31fl3741_write_register (line 95) | void is31fl3741_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3741_select_page (line 105) | void is31fl3741_select_page(uint8_t index, uint8_t page) {
function is31fl3741_write_pwm_buffer (line 110) | void is31fl3741_write_pwm_buffer(uint8_t index) {
function is31fl3741_init_drivers (line 142) | void is31fl3741_init_drivers(void) {
function is31fl3741_init (line 163) | void is31fl3741_init(uint8_t index) {
function get_pwm_value (line 188) | uint8_t get_pwm_value(uint8_t driver, uint16_t reg) {
function set_pwm_value (line 196) | void set_pwm_value(uint8_t driver, uint16_t reg, uint8_t value) {
function is31fl3741_set_color (line 204) | void is31fl3741_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3741_set_color_all (line 221) | void is31fl3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function set_scaling_value (line 227) | void set_scaling_value(uint8_t driver, uint16_t reg, uint8_t value) {
function is31fl3741_set_led_control_register (line 235) | void is31fl3741_set_led_control_register(uint8_t index, bool red, bool g...
function is31fl3741_update_pwm_buffers (line 246) | void is31fl3741_update_pwm_buffers(uint8_t index) {
function is31fl3741_set_pwm_buffer (line 254) | void is31fl3741_set_pwm_buffer(const is31fl3741_led_t *pled, uint8_t red...
function is31fl3741_update_led_control_registers (line 261) | void is31fl3741_update_led_control_registers(uint8_t index) {
function is31fl3741_set_scaling_registers (line 279) | void is31fl3741_set_scaling_registers(const is31fl3741_led_t *pled, uint...
function is31fl3741_flush (line 286) | void is31fl3741_flush(void) {
FILE: drivers/led/issi/is31fl3741.h
type is31fl3741_led_t (line 67) | typedef struct is31fl3741_led_t {
FILE: drivers/led/issi/is31fl3742a-mono.c
type is31fl3742a_driver_t (line 70) | typedef struct is31fl3742a_driver_t {
function is31fl3742a_write_register (line 84) | void is31fl3742a_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3742a_select_page (line 94) | void is31fl3742a_select_page(uint8_t index, uint8_t page) {
function is31fl3742a_write_pwm_buffer (line 99) | void is31fl3742a_write_pwm_buffer(uint8_t index) {
function is31fl3742a_init_drivers (line 115) | void is31fl3742a_init_drivers(void) {
function is31fl3742a_init (line 136) | void is31fl3742a_init(uint8_t index) {
function is31fl3742a_set_value (line 166) | void is31fl3742a_set_value(int index, uint8_t value) {
function is31fl3742a_set_value_all (line 181) | void is31fl3742a_set_value_all(uint8_t value) {
function is31fl3742a_set_scaling_register (line 187) | void is31fl3742a_set_scaling_register(uint8_t index, uint8_t value) {
function is31fl3742a_update_pwm_buffers (line 195) | void is31fl3742a_update_pwm_buffers(uint8_t index) {
function is31fl3742a_update_scaling_registers (line 205) | void is31fl3742a_update_scaling_registers(uint8_t index) {
function is31fl3742a_flush (line 217) | void is31fl3742a_flush(void) {
FILE: drivers/led/issi/is31fl3742a-mono.h
type is31fl3742a_led_t (line 67) | typedef struct is31fl3742a_led_t {
FILE: drivers/led/issi/is31fl3742a.c
type is31fl3742a_driver_t (line 70) | typedef struct is31fl3742a_driver_t {
function is31fl3742a_write_register (line 84) | void is31fl3742a_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3742a_select_page (line 94) | void is31fl3742a_select_page(uint8_t index, uint8_t page) {
function is31fl3742a_write_pwm_buffer (line 99) | void is31fl3742a_write_pwm_buffer(uint8_t index) {
function is31fl3742a_init_drivers (line 115) | void is31fl3742a_init_drivers(void) {
function is31fl3742a_init (line 136) | void is31fl3742a_init(uint8_t index) {
function is31fl3742a_set_color (line 166) | void is31fl3742a_set_color(int index, uint8_t red, uint8_t green, uint8_...
function is31fl3742a_set_color_all (line 183) | void is31fl3742a_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3742a_set_scaling_register (line 189) | void is31fl3742a_set_scaling_register(uint8_t index, uint8_t red, uint8_...
function is31fl3742a_update_pwm_buffers (line 199) | void is31fl3742a_update_pwm_buffers(uint8_t index) {
function is31fl3742a_update_scaling_registers (line 209) | void is31fl3742a_update_scaling_registers(uint8_t index) {
function is31fl3742a_flush (line 221) | void is31fl3742a_flush(void) {
FILE: drivers/led/issi/is31fl3742a.h
type is31fl3742a_led_t (line 67) | typedef struct is31fl3742a_led_t {
FILE: drivers/led/issi/is31fl3743a-mono.c
type is31fl3743a_driver_t (line 92) | typedef struct is31fl3743a_driver_t {
function is31fl3743a_write_register (line 106) | void is31fl3743a_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3743a_select_page (line 116) | void is31fl3743a_select_page(uint8_t index, uint8_t page) {
function is31fl3743a_write_pwm_buffer (line 121) | void is31fl3743a_write_pwm_buffer(uint8_t index) {
function is31fl3743a_init_drivers (line 137) | void is31fl3743a_init_drivers(void) {
function is31fl3743a_init (line 158) | void is31fl3743a_init(uint8_t index) {
function is31fl3743a_set_value (line 190) | void is31fl3743a_set_value(int index, uint8_t value) {
function is31fl3743a_set_value_all (line 205) | void is31fl3743a_set_value_all(uint8_t value) {
function is31fl3743a_set_scaling_register (line 211) | void is31fl3743a_set_scaling_register(uint8_t index, uint8_t value) {
function is31fl3743a_update_pwm_buffers (line 219) | void is31fl3743a_update_pwm_buffers(uint8_t index) {
function is31fl3743a_update_scaling_registers (line 229) | void is31fl3743a_update_scaling_registers(uint8_t index) {
function is31fl3743a_flush (line 241) | void is31fl3743a_flush(void) {
FILE: drivers/led/issi/is31fl3743a-mono.h
type is31fl3743a_led_t (line 77) | typedef struct is31fl3743a_led_t {
FILE: drivers/led/issi/is31fl3743a.c
type is31fl3743a_driver_t (line 92) | typedef struct is31fl3743a_driver_t {
function is31fl3743a_write_register (line 106) | void is31fl3743a_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3743a_select_page (line 116) | void is31fl3743a_select_page(uint8_t index, uint8_t page) {
function is31fl3743a_write_pwm_buffer (line 121) | void is31fl3743a_write_pwm_buffer(uint8_t index) {
function is31fl3743a_init_drivers (line 137) | void is31fl3743a_init_drivers(void) {
function is31fl3743a_init (line 158) | void is31fl3743a_init(uint8_t index) {
function is31fl3743a_set_color (line 190) | void is31fl3743a_set_color(int index, uint8_t red, uint8_t green, uint8_...
function is31fl3743a_set_color_all (line 207) | void is31fl3743a_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3743a_set_scaling_register (line 213) | void is31fl3743a_set_scaling_register(uint8_t index, uint8_t red, uint8_...
function is31fl3743a_update_pwm_buffers (line 223) | void is31fl3743a_update_pwm_buffers(uint8_t index) {
function is31fl3743a_update_scaling_registers (line 233) | void is31fl3743a_update_scaling_registers(uint8_t index) {
function is31fl3743a_flush (line 245) | void is31fl3743a_flush(void) {
FILE: drivers/led/issi/is31fl3743a.h
type is31fl3743a_led_t (line 77) | typedef struct is31fl3743a_led_t {
FILE: drivers/led/issi/is31fl3745-mono.c
type is31fl3745_driver_t (line 92) | typedef struct is31fl3745_driver_t {
function is31fl3745_write_register (line 106) | void is31fl3745_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3745_select_page (line 116) | void is31fl3745_select_page(uint8_t index, uint8_t page) {
function is31fl3745_write_pwm_buffer (line 121) | void is31fl3745_write_pwm_buffer(uint8_t index) {
function is31fl3745_init_drivers (line 137) | void is31fl3745_init_drivers(void) {
function is31fl3745_init (line 158) | void is31fl3745_init(uint8_t index) {
function is31fl3745_set_value (line 190) | void is31fl3745_set_value(int index, uint8_t value) {
function is31fl3745_set_value_all (line 205) | void is31fl3745_set_value_all(uint8_t value) {
function is31fl3745_set_scaling_register (line 211) | void is31fl3745_set_scaling_register(uint8_t index, uint8_t value) {
function is31fl3745_update_pwm_buffers (line 219) | void is31fl3745_update_pwm_buffers(uint8_t index) {
function is31fl3745_update_scaling_registers (line 229) | void is31fl3745_update_scaling_registers(uint8_t index) {
function is31fl3745_flush (line 241) | void is31fl3745_flush(void) {
FILE: drivers/led/issi/is31fl3745-mono.h
type is31fl3745_led_t (line 77) | typedef struct is31fl3745_led_t {
FILE: drivers/led/issi/is31fl3745.c
type is31fl3745_driver_t (line 92) | typedef struct is31fl3745_driver_t {
function is31fl3745_write_register (line 106) | void is31fl3745_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3745_select_page (line 116) | void is31fl3745_select_page(uint8_t index, uint8_t page) {
function is31fl3745_write_pwm_buffer (line 121) | void is31fl3745_write_pwm_buffer(uint8_t index) {
function is31fl3745_init_drivers (line 137) | void is31fl3745_init_drivers(void) {
function is31fl3745_init (line 158) | void is31fl3745_init(uint8_t index) {
function is31fl3745_set_color (line 190) | void is31fl3745_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function is31fl3745_set_color_all (line 207) | void is31fl3745_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3745_set_scaling_register (line 213) | void is31fl3745_set_scaling_register(uint8_t index, uint8_t red, uint8_t...
function is31fl3745_update_pwm_buffers (line 223) | void is31fl3745_update_pwm_buffers(uint8_t index) {
function is31fl3745_update_scaling_registers (line 233) | void is31fl3745_update_scaling_registers(uint8_t index) {
function is31fl3745_flush (line 245) | void is31fl3745_flush(void) {
FILE: drivers/led/issi/is31fl3745.h
type is31fl3745_led_t (line 77) | typedef struct is31fl3745_led_t {
FILE: drivers/led/issi/is31fl3746a-mono.c
type is31fl3746a_driver_t (line 70) | typedef struct is31fl3746a_driver_t {
function is31fl3746a_write_register (line 84) | void is31fl3746a_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3746a_select_page (line 94) | void is31fl3746a_select_page(uint8_t index, uint8_t page) {
function is31fl3746a_write_pwm_buffer (line 99) | void is31fl3746a_write_pwm_buffer(uint8_t index) {
function is31fl3746a_init_drivers (line 115) | void is31fl3746a_init_drivers(void) {
function is31fl3746a_init (line 136) | void is31fl3746a_init(uint8_t index) {
function is31fl3746a_set_value (line 167) | void is31fl3746a_set_value(int index, uint8_t value) {
function is31fl3746a_set_value_all (line 182) | void is31fl3746a_set_value_all(uint8_t value) {
function is31fl3746a_set_scaling_register (line 188) | void is31fl3746a_set_scaling_register(uint8_t index, uint8_t value) {
function is31fl3746a_update_pwm_buffers (line 196) | void is31fl3746a_update_pwm_buffers(uint8_t index) {
function is31fl3746a_update_scaling_registers (line 206) | void is31fl3746a_update_scaling_registers(uint8_t index) {
function is31fl3746a_flush (line 218) | void is31fl3746a_flush(void) {
FILE: drivers/led/issi/is31fl3746a-mono.h
type is31fl3746a_led_t (line 79) | typedef struct is31fl3746a_led_t {
FILE: drivers/led/issi/is31fl3746a.c
type is31fl3746a_driver_t (line 70) | typedef struct is31fl3746a_driver_t {
function is31fl3746a_write_register (line 84) | void is31fl3746a_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function is31fl3746a_select_page (line 94) | void is31fl3746a_select_page(uint8_t index, uint8_t page) {
function is31fl3746a_write_pwm_buffer (line 99) | void is31fl3746a_write_pwm_buffer(uint8_t index) {
function is31fl3746a_init_drivers (line 115) | void is31fl3746a_init_drivers(void) {
function is31fl3746a_init (line 136) | void is31fl3746a_init(uint8_t index) {
function is31fl3746a_set_color (line 167) | void is31fl3746a_set_color(int index, uint8_t red, uint8_t green, uint8_...
function is31fl3746a_set_color_all (line 184) | void is31fl3746a_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function is31fl3746a_set_scaling_register (line 190) | void is31fl3746a_set_scaling_register(uint8_t index, uint8_t red, uint8_...
function is31fl3746a_update_pwm_buffers (line 200) | void is31fl3746a_update_pwm_buffers(uint8_t index) {
function is31fl3746a_update_scaling_registers (line 210) | void is31fl3746a_update_scaling_registers(uint8_t index) {
function is31fl3746a_flush (line 222) | void is31fl3746a_flush(void) {
FILE: drivers/led/issi/is31fl3746a.h
type is31fl3746a_led_t (line 79) | typedef struct is31fl3746a_led_t {
FILE: drivers/led/snled27351-mono.c
type snled27351_driver_t (line 60) | typedef struct snled27351_driver_t {
function snled27351_write_register (line 74) | void snled27351_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function snled27351_select_page (line 84) | void snled27351_select_page(uint8_t index, uint8_t page) {
function snled27351_write_pwm_buffer (line 88) | void snled27351_write_pwm_buffer(uint8_t index) {
function snled27351_init_drivers (line 104) | void snled27351_init_drivers(void) {
function snled27351_init (line 125) | void snled27351_init(uint8_t index) {
function snled27351_set_value (line 172) | void snled27351_set_value(int index, uint8_t value) {
function snled27351_set_value_all (line 186) | void snled27351_set_value_all(uint8_t value) {
function snled27351_set_led_control_register (line 192) | void snled27351_set_led_control_register(uint8_t index, bool value) {
function snled27351_update_pwm_buffers (line 208) | void snled27351_update_pwm_buffers(uint8_t index) {
function snled27351_update_led_control_registers (line 218) | void snled27351_update_led_control_registers(uint8_t index) {
function snled27351_flush (line 230) | void snled27351_flush(void) {
function snled27351_sw_return_normal (line 236) | void snled27351_sw_return_normal(uint8_t index) {
function snled27351_sw_shutdown (line 243) | void snled27351_sw_shutdown(uint8_t index) {
FILE: drivers/led/snled27351-mono.h
type snled27351_led_t (line 118) | typedef struct snled27351_led_t {
FILE: drivers/led/snled27351.c
type snled27351_driver_t (line 60) | typedef struct snled27351_driver_t {
function snled27351_write_register (line 74) | void snled27351_write_register(uint8_t index, uint8_t reg, uint8_t data) {
function snled27351_select_page (line 84) | void snled27351_select_page(uint8_t index, uint8_t page) {
function snled27351_write_pwm_buffer (line 88) | void snled27351_write_pwm_buffer(uint8_t index) {
function snled27351_init_drivers (line 104) | void snled27351_init_drivers(void) {
function snled27351_init (line 125) | void snled27351_init(uint8_t index) {
function snled27351_set_color (line 172) | void snled27351_set_color(int index, uint8_t red, uint8_t green, uint8_t...
function snled27351_set_color_all (line 188) | void snled27351_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
function snled27351_set_led_control_register (line 194) | void snled27351_set_led_control_register(uint8_t index, bool red, bool g...
function snled27351_update_pwm_buffers (line 224) | void snled27351_update_pwm_buffers(uint8_t index) {
function snled27351_update_led_control_registers (line 234) | void snled27351_update_led_control_registers(uint8_t index) {
function snled27351_flush (line 246) | void snled27351_flush(void) {
function snled27351_sw_return_normal (line 252) | void snled27351_sw_return_normal(uint8_t index) {
function snled27351_sw_shutdown (line 259) | void snled27351_sw_shutdown(uint8_t index) {
FILE: drivers/led/snled27351.h
type snled27351_led_t (line 118) | typedef struct snled27351_led_t {
FILE: drivers/led/ws2812.c
function ws2812_rgb_to_rgbw (line 7) | void ws2812_rgb_to_rgbw(ws2812_led_t *led) {
FILE: drivers/led/ws2812.h
type ws2812_led_t (line 73) | typedef struct PACKED ws2812_led_t
FILE: drivers/oled/oled_driver.c
function oled_send_cmd (line 191) | __attribute__((weak)) bool oled_send_cmd(const uint8_t *data, uint16_t s...
function oled_send_cmd_P (line 212) | __attribute__((weak)) bool oled_send_cmd_P(const uint8_t *data, uint16_t...
function oled_send_data (line 238) | __attribute__((weak)) bool oled_send_data(const uint8_t *data, uint16_t ...
function oled_driver_init (line 258) | __attribute__((weak)) void oled_driver_init(void) {
function InvertCharacter (line 280) | static void InvertCharacter(uint8_t *cursor) {
function oled_init (line 288) | bool oled_init(oled_rotation_t rotation) {
function oled_rotation_t (line 374) | __attribute__((weak)) oled_rotation_t oled_init_kb(oled_rotation_t rotat...
function oled_rotation_t (line 377) | __attribute__((weak)) oled_rotation_t oled_init_user(oled_rotation_t rot...
function oled_clear (line 381) | void oled_clear(void) {
function calc_bounds (line 387) | static void calc_bounds(uint8_t update_start, uint8_t *cmd_array) {
function calc_bounds_90 (line 406) | static void calc_bounds_90(uint8_t update_start, uint8_t *cmd_array) {
function crot (line 436) | uint8_t crot(uint8_t a, int8_t n) {
function rotate_90 (line 442) | static void rotate_90(const uint8_t *src, uint8_t *dest) {
function oled_render_dirty (line 451) | void oled_render_dirty(bool all) {
function oled_set_cursor (line 537) | void oled_set_cursor(uint8_t col, uint8_t line) {
function oled_advance_page (line 548) | void oled_advance_page(bool clearPageRemainder) {
function oled_advance_char (line 570) | void oled_advance_char(void) {
function oled_write_char (line 589) | void oled_write_char(const char data, bool invert) {
function oled_write (line 634) | void oled_write(const char *data, bool invert) {
function oled_write_ln (line 642) | void oled_write_ln(const char *data, bool invert) {
function oled_pan (line 647) | void oled_pan(bool left) {
function oled_buffer_reader_t (line 665) | oled_buffer_reader_t oled_read_raw(uint16_t start_index) {
function oled_write_raw_byte (line 673) | void oled_write_raw_byte(const char data, uint16_t index) {
function oled_write_raw (line 680) | void oled_write_raw(const char *data, uint16_t size) {
function oled_write_pixel (line 691) | void oled_write_pixel(uint8_t x, uint8_t y, bool on) {
function oled_write_P (line 712) | void oled_write_P(const char *data, bool invert) {
function oled_write_ln_P (line 720) | void oled_write_ln_P(const char *data, bool invert) {
function oled_write_raw_P (line 725) | void oled_write_raw_P(const char *data, uint16_t size) {
function is_oled_on (line 785) | bool is_oled_on(void) {
function oled_set_brightness (line 789) | uint8_t oled_set_brightness(uint8_t level) {
function oled_get_brightness (line 805) | uint8_t oled_get_brightness(void) {
function oled_scroll_set_area (line 812) | void oled_scroll_set_area(uint8_t start_line, uint8_t end_line) {
function oled_scroll_set_speed (line 817) | void oled_scroll_set_speed(uint8_t speed) {
function oled_scroll_right (line 834) | bool oled_scroll_right(void) {
function oled_scroll_left (line 852) | bool oled_scroll_left(void) {
function oled_scroll_off (line 870) | bool oled_scroll_off(void) {
function is_oled_scrolling (line 887) | bool is_oled_scrolling(void) {
function oled_invert (line 891) | bool oled_invert(bool invert) {
function oled_max_chars (line 915) | uint8_t oled_max_chars(void) {
function oled_max_lines (line 922) | uint8_t oled_max_lines(void) {
function oled_task (line 929) | void oled_task(void) {
function oled_task_kb (line 973) | __attribute__((weak)) bool oled_task_kb(void) {
function oled_task_user (line 976) | __attribute__((weak)) bool oled_task_user(void) {
FILE: drivers/oled/oled_driver.h
type oled_buffer_reader_t (line 324) | typedef struct __attribute__((__packed__)) {
type oled_rotation_t (line 330) | typedef enum {
FILE: drivers/painter/comms/qp_comms_dummy.c
function dummy_comms_init (line 8) | static bool dummy_comms_init(painter_device_t device) {
function dummy_comms_start (line 13) | static bool dummy_comms_start(painter_device_t device) {
function dummy_comms_stop (line 18) | static void dummy_comms_stop(painter_device_t device) {
function dummy_comms_send (line 22) | uint32_t dummy_comms_send(painter_device_t device, const void *data, uin...
FILE: drivers/painter/comms/qp_comms_i2c.c
function qp_comms_i2c_send_raw (line 12) | static uint32_t qp_comms_i2c_send_raw(painter_device_t device, const voi...
function qp_comms_i2c_init (line 25) | bool qp_comms_i2c_init(painter_device_t device) {
function qp_comms_i2c_start (line 30) | bool qp_comms_i2c_start(painter_device_t device) {
function qp_comms_i2c_send_data (line 34) | uint32_t qp_comms_i2c_send_data(painter_device_t device, const void *dat...
function qp_comms_i2c_stop (line 38) | void qp_comms_i2c_stop(painter_device_t device) {}
function qp_comms_i2c_cmddata_send_command (line 46) | void qp_comms_i2c_cmddata_send_command(painter_device_t device, uint8_t ...
function qp_comms_i2c_cmddata_send_data (line 51) | uint32_t qp_comms_i2c_cmddata_send_data(painter_device_t device, const v...
function qp_comms_i2c_bulk_command_sequence (line 61) | void qp_comms_i2c_bulk_command_sequence(painter_device_t device, const u...
FILE: drivers/painter/comms/qp_comms_i2c.h
type qp_comms_i2c_config_t (line 15) | typedef struct qp_comms_i2c_config_t {
FILE: drivers/painter/comms/qp_comms_spi.c
function qp_comms_spi_init (line 12) | bool qp_comms_spi_init(painter_device_t device) {
function qp_comms_spi_start (line 26) | bool qp_comms_spi_start(painter_device_t device) {
function qp_comms_spi_send_data (line 33) | uint32_t qp_comms_spi_send_data(painter_device_t device, const void *dat...
function qp_comms_spi_stop (line 48) | void qp_comms_spi_stop(painter_device_t device) {
function qp_comms_spi_dc_reset_init (line 67) | bool qp_comms_spi_dc_reset_init(painter_device_t device) {
function qp_comms_spi_dc_reset_send_data (line 93) | uint32_t qp_comms_spi_dc_reset_send_data(painter_device_t device, const ...
function qp_comms_spi_dc_reset_send_command (line 100) | void qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t...
function qp_comms_spi_dc_reset_bulk_command_sequence (line 107) | void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device...
FILE: drivers/painter/comms/qp_comms_spi.h
type qp_comms_spi_config_t (line 15) | typedef struct qp_comms_spi_config_t {
type qp_comms_spi_dc_reset_config_t (line 34) | typedef struct qp_comms_spi_dc_reset_config_t {
FILE: drivers/painter/gc9xxx/qp_gc9107.c
function qp_gc9107_init (line 19) | __attribute__((weak)) bool qp_gc9107_init(painter_device_t device, paint...
function painter_device_t (line 80) | painter_device_t qp_gc9107_make_spi_device(uint16_t panel_width, uint16_...
FILE: drivers/painter/gc9xxx/qp_gc9a01.c
function qp_gc9a01_init (line 21) | __attribute__((weak)) bool qp_gc9a01_init(painter_device_t device, paint...
function painter_device_t (line 93) | painter_device_t qp_gc9a01_make_spi_device(uint16_t panel_width, uint16_...
FILE: drivers/painter/generic/qp_surface.h
type surface_painter_device_t (line 30) | struct surface_painter_device_t
type surface_painter_device_t (line 31) | typedef struct surface_painter_device_t surface_painter_device_t;
FILE: drivers/painter/generic/qp_surface_common.c
function qp_surface_increment_pixdata_location (line 16) | void qp_surface_increment_pixdata_location(surface_viewport_data_t *view...
function qp_surface_update_dirty (line 32) | void qp_surface_update_dirty(surface_dirty_data_t *dirty, uint16_t x, ui...
function qp_surface_init (line 55) | bool qp_surface_init(painter_device_t device, painter_rotation_t rotatio...
function qp_surface_power (line 69) | bool qp_surface_power(painter_device_t device, bool power_on) {
function qp_surface_clear (line 74) | bool qp_surface_clear(painter_device_t device) {
function qp_surface_flush (line 80) | bool qp_surface_flush(painter_device_t device) {
function qp_surface_viewport (line 89) | bool qp_surface_viewport(painter_device_t device, uint16_t left, uint16_...
function qp_surface_draw (line 108) | bool qp_surface_draw(painter_device_t surface, painter_device_t target, ...
FILE: drivers/painter/generic/qp_surface_internal.h
type surface_painter_driver_vtable_t (line 13) | typedef struct surface_painter_driver_vtable_t {
type surface_dirty_data_t (line 19) | typedef struct surface_dirty_data_t {
type surface_viewport_data_t (line 27) | typedef struct surface_viewport_data_t {
type surface_painter_device_t (line 40) | typedef struct surface_painter_device_t {
FILE: drivers/painter/generic/qp_surface_mono1bpp.c
function setpixel_mono1bpp (line 14) | static inline void setpixel_mono1bpp(surface_painter_device_t *surface, ...
function append_pixel_mono1bpp (line 43) | static inline void append_pixel_mono1bpp(surface_painter_device_t *surfa...
function stream_pixdata_mono1bpp (line 48) | static inline void stream_pixdata_mono1bpp(surface_painter_device_t *sur...
function qp_surface_pixdata_mono1bpp (line 57) | static bool qp_surface_pixdata_mono1bpp(painter_device_t device, const v...
function qp_surface_palette_convert_mono1bpp (line 65) | static bool qp_surface_palette_convert_mono1bpp(painter_device_t device,...
function qp_surface_append_pixels_mono1bpp (line 73) | static bool qp_surface_append_pixels_mono1bpp(painter_device_t device, u...
function mono1bpp_target_pixdata_transfer (line 87) | static bool mono1bpp_target_pixdata_transfer(painter_driver_t *surface_d...
function qp_surface_append_pixdata_mono1bpp (line 91) | static bool qp_surface_append_pixdata_mono1bpp(painter_device_t device, ...
FILE: drivers/painter/generic/qp_surface_rgb565.c
function setpixel_rgb565 (line 14) | static inline void setpixel_rgb565(surface_painter_device_t *surface, ui...
function append_pixel_rgb565 (line 33) | static inline void append_pixel_rgb565(surface_painter_device_t *surface...
function stream_pixdata_rgb565 (line 38) | static inline void stream_pixdata_rgb565(surface_painter_device_t *surfa...
function qp_surface_pixdata_rgb565 (line 45) | static bool qp_surface_pixdata_rgb565(painter_device_t device, const voi...
function qp_surface_palette_convert_rgb565_swapped (line 53) | static bool qp_surface_palette_convert_rgb565_swapped(painter_device_t d...
function qp_surface_append_pixels_rgb565 (line 63) | static bool qp_surface_append_pixels_rgb565(painter_device_t device, uin...
function rgb565_target_pixdata_transfer (line 71) | static bool rgb565_target_pixdata_transfer(painter_driver_t *surface_dri...
function qp_surface_append_pixdata_rgb565 (line 122) | static bool qp_surface_append_pixdata_rgb565(painter_device_t device, ui...
FILE: drivers/painter/ili9xxx/qp_ili9163.c
function qp_ili9163_init (line 23) | __attribute__((weak)) bool qp_ili9163_init(painter_device_t device, pain...
function painter_device_t (line 92) | painter_device_t qp_ili9163_make_spi_device(uint16_t panel_width, uint16...
FILE: drivers/painter/ili9xxx/qp_ili9341.c
function qp_ili9341_init (line 23) | __attribute__((weak)) bool qp_ili9341_init(painter_device_t device, pain...
function painter_device_t (line 99) | painter_device_t qp_ili9341_make_spi_device(uint16_t panel_width, uint16...
FILE: drivers/painter/ili9xxx/qp_ili9486.c
function qp_ili9486_init (line 25) | bool qp_ili9486_init(painter_device_t device, painter_rotation_t rotatio...
function qp_comms_spi_dc_reset_send_command_odd_cs_pulse (line 74) | static void qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_devi...
function qp_comms_spi_send_data_odd_cs_pulse (line 83) | static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t dev...
function qp_ili9486_send_data_toggling (line 113) | static uint32_t qp_ili9486_send_data_toggling(painter_device_t device, c...
function qp_comms_spi_send_command_sequence_odd_cs_pulse (line 127) | static void qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_devi...
function qp_ili9486_viewport (line 145) | static bool qp_ili9486_viewport(painter_device_t device, uint16_t left, ...
function painter_device_t (line 253) | painter_device_t qp_ili9486_make_spi_device(uint16_t panel_width, uint16...
function painter_device_t (line 286) | painter_device_t qp_ili9486_make_spi_waveshare_device(uint16_t panel_wid...
FILE: drivers/painter/ili9xxx/qp_ili9488.c
function qp_ili9488_init (line 23) | __attribute__((weak)) bool qp_ili9488_init(painter_device_t device, pain...
function painter_device_t (line 92) | painter_device_t qp_ili9488_make_spi_device(uint16_t panel_width, uint16...
FILE: drivers/painter/ld7032/qp_ld7032.c
type ld7032_comms_with_command_vtable_t (line 16) | typedef struct ld7032_comms_with_command_vtable_t {
function ld7032_comms_i2c_send_command_and_data (line 28) | void ld7032_comms_i2c_send_command_and_data(painter_device_t device, uin...
function ld7032_comms_i2c_bulk_command_sequence (line 33) | void ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, con...
function ld7032_comms_i2c_send_command_and_databuf (line 49) | uint32_t ld7032_comms_i2c_send_command_and_databuf(painter_device_t devi...
function qp_ld7032_power (line 58) | bool qp_ld7032_power(painter_device_t device, bool power_on) {
function qp_ld7032_clear (line 68) | bool qp_ld7032_clear(painter_device_t device) {
function ld7032_flush_0 (line 79) | void ld7032_flush_0(painter_device_t device, surface_dirty_data_t *dirty...
function ld7032_flush_90 (line 111) | void ld7032_flush_90(painter_device_t device, surface_dirty_data_t *dirt...
type ld7032_device_t (line 158) | typedef struct ld7032_device_t {
function qp_ld7032_init (line 170) | __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, paint...
function qp_ld7032_flush (line 256) | bool qp_ld7032_flush(painter_device_t device) {
function painter_device_t (line 318) | painter_device_t qp_ld7032_make_spi_device(uint16_t panel_width, uint16_...
function painter_device_t (line 377) | painter_device_t qp_ld7032_make_i2c_device(uint16_t panel_width, uint16_...
FILE: drivers/painter/ld7032/qp_ld7032_opcodes.h
type ld7032_opcodes (line 4) | typedef enum {
FILE: drivers/painter/oled_panel/qp_oled_panel.c
function qp_oled_panel_power (line 14) | bool qp_oled_panel_power(painter_device_t device, bool power_on) {
function qp_oled_panel_clear (line 22) | bool qp_oled_panel_clear(painter_device_t device) {
function qp_oled_panel_passthru_pixdata (line 32) | bool qp_oled_panel_passthru_pixdata(painter_device_t device, const void ...
function qp_oled_panel_passthru_viewport (line 37) | bool qp_oled_panel_passthru_viewport(painter_device_t device, uint16_t l...
function qp_oled_panel_passthru_palette_convert (line 42) | bool qp_oled_panel_passthru_palette_convert(painter_device_t device, int...
function qp_oled_panel_passthru_append_pixels (line 47) | bool qp_oled_panel_passthru_append_pixels(painter_device_t device, uint8...
function qp_oled_panel_passthru_append_pixdata (line 52) | bool qp_oled_panel_passthru_append_pixdata(painter_device_t device, uint...
function qp_oled_panel_page_column_flush_rot0 (line 61) | void qp_oled_panel_page_column_flush_rot0(painter_device_t device, surfa...
function qp_oled_panel_page_column_flush_rot90 (line 94) | void qp_oled_panel_page_column_flush_rot90(painter_device_t device, surf...
function qp_oled_panel_page_column_flush_rot180 (line 128) | void qp_oled_panel_page_column_flush_rot180(painter_device_t device, sur...
function qp_oled_panel_page_column_flush_rot270 (line 163) | void qp_oled_panel_page_column_flush_rot270(painter_device_t device, sur...
FILE: drivers/painter/oled_panel/qp_oled_panel.h
type oled_panel_painter_driver_vtable_t (line 21) | typedef struct oled_panel_painter_driver_vtable_t {
type oled_panel_painter_device_t (line 35) | typedef struct oled_panel_painter_device_t {
FILE: drivers/painter/sh1106/qp_sh1106.c
type sh1106_device_t (line 16) | typedef struct sh1106_device_t {
function qp_sh1106_init (line 28) | __attribute__((weak)) bool qp_sh1106_init(painter_device_t device, paint...
function qp_sh1106_flush (line 79) | bool qp_sh1106_flush(painter_device_t device) {
function painter_device_t (line 137) | painter_device_t qp_sh1106_make_spi_device(uint16_t panel_width, uint16_...
function painter_device_t (line 181) | painter_device_t qp_sh1106_make_i2c_device(uint16_t panel_width, uint16_...
FILE: drivers/painter/sh1107/qp_sh1107.c
type sh1107_device_t (line 13) | typedef struct sh1107_device_t {
function qp_sh1107_init (line 25) | __attribute__((weak)) bool qp_sh1107_init(painter_device_t device, paint...
function qp_sh1107_flush (line 81) | bool qp_sh1107_flush(painter_device_t device) {
function painter_device_t (line 139) | painter_device_t qp_sh1107_make_spi_device(uint16_t panel_width, uint16_...
function painter_device_t (line 183) | painter_device_t qp_sh1107_make_i2c_device(uint16_t panel_width, uint16_...
FILE: drivers/painter/ssd1351/qp_ssd1351.c
function qp_ssd1351_init (line 23) | __attribute__((weak)) bool qp_ssd1351_init(painter_device_t device, pain...
function painter_device_t (line 96) | painter_device_t qp_ssd1351_make_spi_device(uint16_t panel_width, uint16...
FILE: drivers/painter/st77xx/qp_st7735.c
function st7735_automatic_viewport_offsets (line 27) | static inline void st7735_automatic_viewport_offsets(painter_device_t de...
function qp_st7735_init (line 52) | __attribute__((weak)) bool qp_st7735_init(painter_device_t device, paint...
function painter_device_t (line 118) | painter_device_t qp_st7735_make_spi_device(uint16_t panel_width, uint16_...
FILE: drivers/painter/st77xx/qp_st7789.c
function st7789_automatic_viewport_offsets (line 26) | static inline void st7789_automatic_viewport_offsets(painter_device_t de...
function qp_st7789_init (line 51) | __attribute__((weak)) bool qp_st7789_init(painter_device_t device, paint...
function painter_device_t (line 115) | painter_device_t qp_st7789_make_spi_device(uint16_t panel_width, uint16_...
FILE: drivers/painter/tft_panel/qp_tft_panel.c
function qp_tft_panel_power (line 14) | bool qp_tft_panel_power(painter_device_t device, bool power_on) {
function qp_tft_panel_clear (line 22) | bool qp_tft_panel_clear(painter_device_t device) {
function qp_tft_panel_flush (line 29) | bool qp_tft_panel_flush(painter_device_t device) {
function qp_tft_panel_viewport (line 35) | bool qp_tft_panel_viewport(painter_device_t device, uint16_t left, uint1...
function qp_tft_panel_pixdata (line 82) | bool qp_tft_panel_pixdata(painter_device_t device, const void *pixel_dat...
function qp_tft_panel_palette_convert_rgb565_swapped (line 91) | bool qp_tft_panel_palette_convert_rgb565_swapped(painter_device_t device...
function qp_tft_panel_palette_convert_rgb888 (line 100) | bool qp_tft_panel_palette_convert_rgb888(painter_device_t device, int16_...
function qp_tft_panel_append_pixels_rgb565 (line 113) | bool qp_tft_panel_append_pixels_rgb565(painter_device_t device, uint8_t ...
function qp_tft_panel_append_pixels_rgb888 (line 121) | bool qp_tft_panel_append_pixels_rgb888(painter_device_t device, uint8_t ...
function qp_tft_panel_append_pixdata (line 130) | bool qp_tft_panel_append_pixdata(painter_device_t device, uint8_t *targe...
FILE: drivers/painter/tft_panel/qp_tft_panel.h
type tft_panel_dc_reset_painter_driver_vtable_t (line 16) | typedef struct tft_panel_dc_reset_painter_driver_vtable_t {
type tft_panel_dc_reset_painter_device_t (line 36) | typedef struct tft_panel_dc_reset_painter_device_t {
FILE: drivers/ps2/ps2.h
function wait_clock_lo (line 97) | static inline uint16_t wait_clock_lo(uint16_t us) {
function wait_clock_hi (line 105) | static inline uint16_t wait_clock_hi(uint16_t us) {
function wait_data_lo (line 113) | static inline uint16_t wait_data_lo(uint16_t us) {
function wait_data_hi (line 121) | static inline uint16_t wait_data_hi(uint16_t us) {
function idle (line 131) | static inline void idle(void) {
function inhibit (line 137) | static inline void inhibit(void) {
FILE: drivers/ps2/ps2_busywait.c
function ps2_host_init (line 58) | void ps2_host_init(void) {
function ps2_host_send (line 68) | uint8_t ps2_host_send(uint8_t data) {
function ps2_host_recv_response (line 124) | uint8_t ps2_host_recv_response(void) {
function ps2_host_recv (line 136) | uint8_t ps2_host_recv(void) {
function ps2_host_set_led (line 183) | void ps2_host_set_led(uint8_t led) {
FILE: drivers/ps2/ps2_interrupt.c
function palCallback (line 75) | void palCallback(void *arg) {
function ps2_host_init (line 94) | void ps2_host_init(void) {
function ps2_host_send (line 102) | uint8_t ps2_host_send(uint8_t data) {
function ps2_host_recv_response (line 160) | uint8_t ps2_host_recv_response(void) {
function ps2_host_recv (line 170) | uint8_t ps2_host_recv(void) {
function ps2_interrupt_service_routine (line 180) | void ps2_interrupt_service_routine(void) {
function ISR (line 251) | ISR(PS2_INT_VECT) {
function ps2_host_set_led (line 257) | void ps2_host_set_led(uint8_t led) {
function pbuf_enqueue (line 269) | static inline void pbuf_enqueue(uint8_t data) {
function pbuf_dequeue (line 291) | static inline uint8_t pbuf_dequeue(void) {
function pbuf_has_data (line 314) | bool pbuf_has_data(void) {
function pbuf_clear (line 331) | static inline void pbuf_clear(void) {
FILE: drivers/ps2/ps2_mouse.c
function ps2_mouse_init (line 42) | void ps2_mouse_init(void) {
function ps2_mouse_init_user (line 70) | __attribute__((weak)) void ps2_mouse_init_user(void) {}
function ps2_mouse_moved_user (line 72) | __attribute__((weak)) void ps2_mouse_moved_user(report_mouse_t *mouse_re...
function ps2_mouse_task (line 74) | void ps2_mouse_task(void) {
function ps2_mouse_disable_data_reporting (line 134) | void ps2_mouse_disable_data_reporting(void) {
function ps2_mouse_enable_data_reporting (line 138) | void ps2_mouse_enable_data_reporting(void) {
function ps2_mouse_set_remote_mode (line 142) | void ps2_mouse_set_remote_mode(void) {
function ps2_mouse_set_stream_mode (line 147) | void ps2_mouse_set_stream_mode(void) {
function ps2_mouse_set_scaling_2_1 (line 152) | void ps2_mouse_set_scaling_2_1(void) {
function ps2_mouse_set_scaling_1_1 (line 156) | void ps2_mouse_set_scaling_1_1(void) {
function ps2_mouse_set_resolution (line 160) | void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution) {
function ps2_mouse_set_sample_rate (line 164) | void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate) {
function ps2_mouse_convert_report_to_hid (line 174) | static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse...
function ps2_mouse_clear_report (line 229) | static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report) {
function ps2_mouse_print_report (line 237) | static inline void ps2_mouse_print_report(report_mouse_t *mouse_report) {
function ps2_mouse_enable_scrolling (line 252) | static inline void ps2_mouse_enable_scrolling(void) {
function ps2_mouse_scroll_button_task (line 265) | static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_re...
FILE: drivers/ps2/ps2_mouse.h
type ps2_mouse_mode_e (line 65) | enum ps2_mouse_mode_e {
type ps2_mouse_command_e (line 120) | enum ps2_mouse_command_e {
type ps2_mouse_resolution_t (line 138) | typedef enum ps2_mouse_resolution_e {
type ps2_mouse_sample_rate_t (line 145) | typedef enum ps2_mouse_sample_rate_e {
FILE: drivers/sensors/adns5050.c
function adns5050_init (line 58) | void adns5050_init(void) {
function adns5050_sync (line 83) | void adns5050_sync(void) {
function adns5050_cs_select (line 89) | void adns5050_cs_select(void) {
function adns5050_cs_deselect (line 93) | void adns5050_cs_deselect(void) {
function adns5050_serial_read (line 97) | uint8_t adns5050_serial_read(void) {
function adns5050_serial_write (line 114) | void adns5050_serial_write(uint8_t data) {
function adns5050_read_reg (line 141) | uint8_t adns5050_read_reg(uint8_t reg_addr) {
function adns5050_write_reg (line 164) | void adns5050_write_reg(uint8_t reg_addr, uint8_t data) {
function report_adns5050_t (line 171) | report_adns5050_t adns5050_read_burst(void) {
function convert_twoscomp (line 204) | int8_t convert_twoscomp(uint8_t data) {
function adns5050_set_cpi (line 212) | void adns5050_set_cpi(uint16_t cpi) {
function adns5050_get_cpi (line 218) | uint16_t adns5050_get_cpi(void) {
function adns5050_check_signature (line 223) | bool adns5050_check_signature(void) {
function adns5050_power_down (line 231) | void adns5050_power_down(void) {
function report_mouse_t (line 238) | report_mouse_t adns5050_get_report(report_mouse_t mouse_report) {
FILE: drivers/sensors/adns5050.h
type report_adns5050_t (line 68) | typedef struct {
FILE: drivers/sensors/adns9800.c
function adns9800_srom_get_length (line 87) | uint16_t __attribute__((weak)) adns9800_srom_get_length(void) {
function adns9800_srom_get_byte (line 91) | uint8_t __attribute__((weak)) adns9800_srom_get_byte(uint16_t position) {
function adns9800_spi_start (line 95) | void adns9800_spi_start(void) {
function adns9800_write (line 99) | void adns9800_write(uint8_t reg_addr, uint8_t data) {
function adns9800_read (line 107) | uint8_t adns9800_read(uint8_t reg_addr) {
function adns9800_init (line 118) | void adns9800_init(void) {
function config_adns9800_t (line 183) | config_adns9800_t adns9800_get_config(void) {
function adns9800_set_config (line 188) | void adns9800_set_config(config_adns9800_t config) {
function adns9800_get_cpi (line 193) | uint16_t adns9800_get_cpi(void) {
function adns9800_set_cpi (line 198) | void adns9800_set_cpi(uint16_t cpi) {
function convertDeltaToInt (line 203) | static int16_t convertDeltaToInt(uint8_t high, uint8_t low) {
function report_adns9800_t (line 213) | report_adns9800_t adns9800_get_report(void) {
function report_mouse_t (line 247) | report_mouse_t adns9800_get_report_driver(report_mouse_t mouse_report) {
FILE: drivers/sensors/adns9800.h
type config_adns9800_t (line 54) | typedef struct {
type report_adns9800_t (line 59) | typedef struct {
FILE: drivers/sensors/analog_joystick.c
function axisCoordinate (line 54) | int16_t axisCoordinate(pin_t pin, uint16_t origin, uint8_t axis) {
function axisToMouseComponent (line 99) | int8_t axisToMouseComponent(pin_t pin, int16_t origin, uint8_t maxSpeed,...
function report_analog_joystick_t (line 124) | report_analog_joystick_t analog_joystick_read(void) {
function analog_joystick_init (line 138) | void analog_joystick_init(void) {
function report_mouse_t (line 157) | report_mouse_t analog_joystick_get_report(report_mouse_t mouse_report) {
FILE: drivers/sensors/analog_joystick.h
type report_analog_joystick_t (line 48) | typedef struct {
FILE: drivers/sensors/azoteq_iqs5xx.c
function i2c_status_t (line 120) | i2c_status_t azoteq_iqs5xx_end_session(void) {
function i2c_status_t (line 125) | i2c_status_t azoteq_iqs5xx_get_base_data(azoteq_iqs5xx_base_data_t *base...
function i2c_status_t (line 133) | i2c_status_t azoteq_iqs5xx_get_report_rate(azoteq_iqs5xx_report_rate_t *...
function i2c_status_t (line 146) | i2c_status_t azoteq_iqs5xx_set_report_rate(uint16_t report_rate_ms, azot...
function i2c_status_t (line 162) | i2c_status_t azoteq_iqs5xx_set_reati(bool enabled, bool end_session) {
function i2c_status_t (line 175) | i2c_status_t azoteq_iqs5xx_set_event_mode(bool enabled, bool end_session) {
function i2c_status_t (line 195) | i2c_status_t azoteq_iqs5xx_set_gesture_config(bool end_session) {
function i2c_status_t (line 227) | i2c_status_t azoteq_iqs5xx_set_xy_config(bool flip_x, bool flip_y, bool ...
function i2c_status_t (line 249) | i2c_status_t azoteq_iqs5xx_reset_suspend(bool reset, bool suspend, bool ...
function azoteq_iqs5xx_set_cpi (line 263) | void azoteq_iqs5xx_set_cpi(uint16_t cpi) {
function azoteq_iqs5xx_get_cpi (line 272) | uint16_t azoteq_iqs5xx_get_cpi(void) {
function azoteq_iqs5xx_get_product (line 283) | uint16_t azoteq_iqs5xx_get_product(void) {
function azoteq_iqs5xx_setup_resolution (line 292) | void azoteq_iqs5xx_setup_resolution(void) {
function azoteq_iqs5xx_init (line 324) | void azoteq_iqs5xx_init(void) {
function report_mouse_t (line 354) | report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report) {
FILE: drivers/sensors/azoteq_iqs5xx.h
type azoteq_iqs5xx_product_numbers_t (line 12) | typedef enum {
type azoteq_iqs5xx_charging_modes_t (line 18) | typedef enum {
type azoteq_iqs5xx_report_rate_t (line 26) | typedef struct {
type azoteq_iqs5xx_gesture_events_0_t (line 31) | typedef struct PACKED {
type azoteq_iqs5xx_gesture_events_1_t (line 41) | typedef struct PACKED {
type azoteq_iqs5xx_system_info_0_t (line 48) | typedef struct PACKED {
type azoteq_iqs5xx_system_info_1_t (line 57) | typedef struct PACKED {
type azoteq_iqs5xx_relative_xy_t (line 67) | typedef struct {
type azoteq_iqs5xx_base_data_t (line 72) | typedef struct {
type azoteq_iqs5xx_report_data_t (line 85) | typedef struct {
type azoteq_iqs5xx_system_config_0_t (line 93) | typedef struct PACKED {
type azoteq_iqs5xx_system_config_1_t (line 104) | typedef struct PACKED {
type azoteq_iqs5xx_xy_config_0_t (line 115) | typedef struct PACKED {
type azoteq_iqs5xx_system_control_1_t (line 123) | typedef struct PACKED {
type azoteq_iqs5xx_single_finger_gesture_enable_t (line 129) | typedef struct PACKED {
type azoteq_iqs5xx_multi_finger_gesture_enable_t (line 139) | typedef struct PACKED {
type azoteq_iqs5xx_gesture_config_t (line 146) | typedef struct PACKED {
type azoteq_iqs5xx_resolution_t (line 165) | typedef struct {
FILE: drivers/sensors/cirque_pinnacle.c
function ClipCoordinates (line 33) | void ClipCoordinates(pinnacle_data_t* coordinates) {
function cirque_pinnacle_get_scale (line 47) | uint16_t cirque_pinnacle_get_scale(void) {
function cirque_pinnacle_set_scale (line 50) | void cirque_pinnacle_set_scale(uint16_t scale) {
function cirque_pinnacle_scale_data (line 55) | void cirque_pinnacle_scale_data(pinnacle_data_t* coordinates, uint16_t x...
function cirque_pinnacle_clear_flags (line 91) | void cirque_pinnacle_clear_flags(void) {
function cirque_pinnacle_enable_feed (line 97) | void cirque_pinnacle_enable_feed(bool feedEnable) {
function ERA_ReadBytes (line 112) | void ERA_ReadBytes(uint16_t address, uint8_t* data, uint16_t count) {
function ERA_WriteByte (line 137) | void ERA_WriteByte(uint16_t address, uint8_t data) {
function cirque_pinnacle_set_adc_attenuation (line 159) | bool cirque_pinnacle_set_adc_attenuation(uint8_t adcGain) {
function cirque_pinnacle_tune_edge_sensitivity (line 177) | void cirque_pinnacle_tune_edge_sensitivity(void) {
function cirque_pinnacle_calibrate (line 190) | void cirque_pinnacle_calibrate(void) {
function cirque_pinnacle_cursor_smoothing (line 208) | void cirque_pinnacle_cursor_smoothing(bool enable) {
function cirque_pinnacle_connected (line 221) | bool cirque_pinnacle_connected(void) {
function cirque_pinnacle_init (line 235) | void cirque_pinnacle_init(void) {
function pinnacle_data_t (line 298) | pinnacle_data_t cirque_pinnacle_read_data(void) {
function cirque_pinnacle_enable_cursor_glide (line 364) | void cirque_pinnacle_enable_cursor_glide(bool enable) {
function cirque_pinnacle_configure_cursor_glide (line 368) | void cirque_pinnacle_configure_cursor_glide(float trigger_px) {
function auto_mouse_activation (line 378) | bool auto_mouse_activation(report_mouse_t mouse_report) {
function report_mouse_t (line 383) | report_mouse_t cirque_pinnacle_get_report(report_mouse_t mouse_report) {
function cirque_pinnacle_get_cpi (line 455) | uint16_t cirque_pinnacle_get_cpi(void) {
function cirque_pinnacle_set_cpi (line 458) | void cirque_pinnacle_set_cpi(uint16_t cpi) {
function report_mouse_t (line 471) | report_mouse_t cirque_pinnacle_get_report(report_mouse_t mouse_report) {
FILE: drivers/sensors/cirque_pinnacle.h
type pinnacle_data_t (line 97) | typedef struct {
FILE: drivers/sensors/cirque_pinnacle_gestures.c
function report_mouse_t (line 34) | static report_mouse_t trackpad_tap(report_mouse_t mouse_report, pinnacle...
function cirque_pinnacle_enable_tap (line 51) | void cirque_pinnacle_enable_tap(bool enable) {
function atan2_16 (line 66) | static inline uint16_t atan2_16(int32_t dy, int32_t dx) {
function circular_scroll_t (line 90) | static circular_scroll_t circular_scroll(pinnacle_data_t touchData) {
function cirque_pinnacle_enable_circular_scroll (line 194) | void cirque_pinnacle_enable_circular_scroll(bool enable) {
function cirque_pinnacle_configure_circular_scroll (line 198) | void cirque_pinnacle_configure_circular_scroll(uint8_t outer_ring_pct, u...
function cirque_pinnacle_gestures (line 207) | bool cirque_pinnacle_gestures(report_mouse_t* mouse_report, pinnacle_dat...
FILE: drivers/sensors/cirque_pinnacle_gestures.h
type cirque_pinnacle_features_t (line 22) | typedef struct {
type trackpad_tap_context_t (line 37) | typedef struct {
type circular_scroll_status_t (line 50) | typedef enum {
type circular_scroll_t (line 57) | typedef struct {
type circular_scroll_config_t (line 63) | typedef struct {
type circular_scroll_context_t (line 71) | typedef struct {
FILE: drivers/sensors/cirque_pinnacle_i2c.c
function RAP_ReadBytes (line 14) | void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) {
function RAP_Write (line 26) | void RAP_Write(uint8_t address, uint8_t data) {
FILE: drivers/sensors/cirque_pinnacle_spi.c
function RAP_ReadBytes (line 14) | void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) {
function RAP_Write (line 33) | void RAP_Write(uint8_t address, uint8_t data) {
FILE: drivers/sensors/navigator.c
function report_mouse_t (line 39) | report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
FILE: drivers/sensors/navigator_trackpad.c
function i2c_status_t (line 38) | i2c_status_t cirque_gen6_read_report(uint8_t *data, uint16_t cnt) {
function cirque_gen6_clear (line 44) | void cirque_gen6_clear(void) {
function cirque_gen6_read_memory (line 54) | uint8_t cirque_gen6_read_memory(uint32_t addr, uint8_t *data, uint16_t c...
function cirque_gen6_write_memory (line 96) | uint8_t cirque_gen6_write_memory(uint32_t addr, uint8_t *data, uint16_t ...
function cirque_gen6_read_reg (line 122) | uint8_t cirque_gen6_read_reg(uint32_t addr) {
function cirque_gen6_read_reg_16 (line 132) | uint16_t cirque_gen6_read_reg_16(uint32_t addr) {
function cirque_gen6_read_reg_32 (line 142) | uint32_t cirque_gen6_read_reg_32(uint32_t addr) {
function cirque_gen6_write_reg (line 152) | uint8_t cirque_gen6_write_reg(uint32_t addr, uint8_t data) {
function cirque_gen6_write_reg_16 (line 156) | uint8_t cirque_gen6_write_reg_16(uint32_t addr, uint16_t data) {
function cirque_gen6_write_reg_32 (line 161) | uint8_t cirque_gen6_write_reg_32(uint32_t addr, uint32_t data) {
function cirque_gen6_set_relative_mode (line 166) | uint8_t cirque_gen6_set_relative_mode(void) {
function cirque_gen6_set_ptp_mode (line 172) | uint8_t cirque_gen6_set_ptp_mode(void) {
function cirque_gen6_swap_xy (line 179) | uint8_t cirque_gen6_swap_xy(bool set) {
function cirque_gen6_invert_y (line 189) | uint8_t cirque_gen6_invert_y(bool set) {
function cirque_gen6_invert_x (line 199) | uint8_t cirque_gen6_invert_x(bool set) {
function cirque_gen6_enable_logical_scaling (line 209) | uint8_t cirque_gen6_enable_logical_scaling(bool set) {
function cirque_gen6_get_gpio_state (line 219) | bool cirque_gen6_get_gpio_state(uint8_t num) {
function cirque_gen_6_read_callback (line 224) | uint32_t cirque_gen_6_read_callback(uint32_t trigger_time, void *cb_arg) {
function dump_ptp_report (line 262) | void dump_ptp_report(void) {
function navigator_trackpad_device_init (line 276) | void navigator_trackpad_device_init(void) {
function report_mouse_t (line 352) | report_mouse_t navigator_trackpad_get_report(report_mouse_t mouse_report) {
function set_cirque_cpi (line 424) | void set_cirque_cpi(void) {
function navigator_trackpad_get_cpi (line 463) | uint16_t navigator_trackpad_get_cpi(void) {
function restore_cpi (line 467) | void restore_cpi(uint8_t cpi) {
function navigator_trackpad_set_cpi (line 472) | void navigator_trackpad_set_cpi(uint16_t cpi) {
FILE: drivers/sensors/navigator_trackpad.h
type cgen6_report_t (line 90) | typedef struct {
type finger_data_t (line 103) | typedef struct {
type cgen6_report_t (line 110) | typedef struct {
type cgen6_report_t (line 118) | typedef struct {
FILE: drivers/sensors/paw3204.c
type cpi_values (line 39) | enum cpi_values {
function paw3204_init (line 61) | void paw3204_init(void) {
function paw3204_serial_read (line 74) | uint8_t paw3204_serial_read(void) {
function paw3204_serial_write (line 91) | void paw3204_serial_write(uint8_t data) {
function report_paw3204_t (line 108) | report_paw3204_t paw3204_read(void) {
function paw3204_write_reg (line 118) | void paw3204_write_reg(uint8_t reg_addr, uint8_t data) {
function paw3204_read_reg (line 123) | uint8_t paw3204_read_reg(uint8_t reg_addr) {
function paw3204_set_cpi (line 129) | void paw3204_set_cpi(uint16_t cpi) {
function paw3204_get_cpi (line 149) | uint16_t paw3204_get_cpi(void) {
function read_pid_paw3204 (line 178) | uint8_t read_pid_paw3204(void) {
function report_mouse_t (line 182) | report_mouse_t paw3204_get_report(report_mouse_t mouse_report) {
FILE: drivers/sensors/paw3204.h
type report_paw3204_t (line 38) | typedef struct {
FILE: drivers/sensors/pimoroni_trackball.c
function pimoroni_trackball_get_cpi (line 43) | uint16_t pimoroni_trackball_get_cpi(void) {
function pimoroni_trackball_set_cpi (line 56) | void pimoroni_trackball_set_cpi(uint16_t cpi) {
function pimoroni_trackball_set_rgbw (line 64) | void pimoroni_trackball_set_rgbw(uint8_t r, uint8_t g, uint8_t b, uint8_...
function i2c_status_t (line 71) | i2c_status_t read_pimoroni_trackball(pimoroni_data_t *data) {
function pimoroni_trackball_device_init (line 85) | __attribute__((weak)) void pimoroni_trackball_device_init(void) {
function pimoroni_trackball_get_offsets (line 90) | int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t pos...
function mouse_xy_report_t (line 103) | mouse_xy_report_t pimoroni_trackball_adapt_values(xy_clamp_range_t *offs...
function report_mouse_t (line 117) | report_mouse_t pimoroni_trackball_get_report(report_mouse_t mouse_report) {
FILE: drivers/sensors/pimoroni_trackball.h
type pimoroni_data_t (line 45) | typedef struct {
FILE: drivers/sensors/pmw3320.c
function pmw3320_init (line 33) | void pmw3320_init(void) {
function pmw3320_sync (line 64) | void pmw3320_sync(void) {
function pmw3320_cs_select (line 70) | void pmw3320_cs_select(void) {
function pmw3320_cs_deselect (line 74) | void pmw3320_cs_deselect(void) {
function pmw3320_serial_read (line 78) | uint8_t pmw3320_serial_read(void) {
function pmw3320_serial_write (line 95) | void pmw3320_serial_write(uint8_t data) {
function pmw3320_read_reg (line 123) | uint8_t pmw3320_read_reg(uint8_t reg_addr) {
function pmw3320_write_reg (line 142) | void pmw3320_write_reg(uint8_t reg_addr, uint8_t data) {
function report_pmw3320_t (line 149) | report_pmw3320_t pmw3320_read_burst(void) {
function convert_twoscomp (line 175) | int8_t convert_twoscomp(uint8_t data) {
function pmw3320_get_cpi (line 182) | uint16_t pmw3320_get_cpi(void) {
function pmw3320_set_cpi (line 188) | void pmw3320_set_cpi(uint16_t cpi) {
function pmw3320_check_signature (line 195) | bool pmw3320_check_signature(void) {
function report_mouse_t (line 202) | report_mouse_t pmw3320_get_report(report_mouse_t mouse_report) {
FILE: drivers/sensors/pmw3320.h
type report_pmw3320_t (line 53) | typedef struct {
FILE: drivers/sensors/pmw3360.c
function pmw33xx_get_cpi (line 12) | uint16_t pmw33xx_get_cpi(uint8_t sensor) {
function pmw33xx_set_cpi (line 24) | void pmw33xx_set_cpi(uint8_t sensor, uint16_t cpi) {
FILE: drivers/sensors/pmw3389.c
function pmw33xx_get_cpi (line 11) | uint16_t pmw33xx_get_cpi(uint8_t sensor) {
function pmw33xx_set_cpi (line 20) | void pmw33xx_set_cpi(uint8_t sensor, uint16_t cpi) {
FILE: drivers/sensors/pmw33xx_common.c
function pmw33xx_srom_get_length (line 36) | uint16_t __attribute__((weak)) pmw33xx_srom_get_length(void) {
function pmw33xx_srom_get_byte (line 40) | uint8_t __attribute__((weak)) pmw33xx_srom_get_byte(uint16_t position) {
function pmw33xx_set_cpi_all_sensors (line 44) | void pmw33xx_set_cpi_all_sensors(uint16_t cpi) {
function pmw33xx_spi_start (line 50) | bool pmw33xx_spi_start(uint8_t sensor) {
function pmw33xx_write (line 60) | bool pmw33xx_write(uint8_t sensor, uint8_t reg_addr, uint8_t data) {
function pmw33xx_read (line 85) | uint8_t pmw33xx_read(uint8_t sensor, uint8_t reg_addr) {
function pmw33xx_check_signature (line 105) | bool pmw33xx_check_signature(uint8_t sensor) {
function pmw33xx_upload_firmware (line 114) | bool pmw33xx_upload_firmware(uint8_t sensor) {
function pmw33xx_init (line 145) | bool pmw33xx_init(uint8_t sensor) {
function pmw33xx_report_t (line 200) | pmw33xx_report_t pmw33xx_read_burst(uint8_t sensor) {
function pmw33xx_init_wrapper (line 239) | void pmw33xx_init_wrapper(void) {
function pmw33xx_set_cpi_wrapper (line 243) | void pmw33xx_set_cpi_wrapper(uint16_t cpi) {
function pmw33xx_get_cpi_wrapper (line 247) | uint16_t pmw33xx_get_cpi_wrapper(void) {
function report_mouse_t (line 251) | report_mouse_t pmw33xx_get_report(report_mouse_t mouse_report) {
FILE: drivers/sensors/pmw33xx_common.h
type pmw33xx_report_t (line 26) | typedef struct __attribute__((packed)) {
FILE: drivers/spi_master.h
type spi_status_t (line 30) | typedef int16_t spi_status_t;
type spi_start_config_t (line 43) | typedef struct spi_start_config_t {
FILE: drivers/usb2422.c
type USB2422_VID_Type (line 23) | typedef union {
type USB2422_PID_Type (line 32) | typedef union {
type USB2422_DID_Type (line 41) | typedef union {
type USB2422_CFG1_Type (line 50) | typedef union {
type USB2422_CFG2_Type (line 64) | typedef union {
type USB2422_CFG3_Type (line 76) | typedef union {
type USB2422_NRD_Type (line 87) | typedef union {
type USB2422_PDS_Type (line 98) | typedef union {
type USB2422_PDB_Type (line 110) | typedef union {
type USB2422_MAXPS_Type (line 121) | typedef union {
type USB2422_MAXPB_Type (line 129) | typedef union {
type USB2422_HCMCS_Type (line 137) | typedef union {
type USB2422_HCMCB_Type (line 145) | typedef union {
type USB2422_PWRT_Type (line 153) | typedef union {
type USB2422_LANGID_LSB_Type (line 161) | typedef union {
type USB2422_LANGID_MSB_Type (line 169) | typedef union {
type USB2422_MFRSL_Type (line 177) | typedef union {
type USB2422_PRDSL_Type (line 185) | typedef union {
type USB2422_SERSL_Type (line 193) | typedef union {
type USB2422_MFRSTR_Type (line 201) | typedef uint16_t USB2422_MFRSTR_Type;
type USB2422_PRDSTR_Type (line 204) | typedef uint16_t USB2422_PRDSTR_Type;
type USB2422_SERSTR_Type (line 207) | typedef uint16_t USB2422_SERSTR_Type;
type USB2422_BCEN_Type (line 211) | typedef union {
type USB2422_BOOSTUP_Type (line 222) | typedef union {
type USB2422_BOOSTDOWN_Type (line 231) | typedef union {
type USB2422_PRTSP_Type (line 241) | typedef union {
type USB2422_PRTR12_Type (line 252) | typedef union {
type USB2422_STCD_Type (line 267) | typedef union {
type Usb2422_t (line 278) | typedef struct {
function USB2422_strcpy (line 321) | static void USB2422_strcpy(const char* str, USB2422_MFRSTR_Type* dest, u...
function USB2422_write_block (line 329) | static void USB2422_write_block(void) {
function USB2422_init (line 347) | void USB2422_init(void) {
function USB2422_configure (line 358) | void USB2422_configure(void) {
function USB2422_reset (line 388) | void USB2422_reset(void) {
function USB2422_active (line 396) | bool USB2422_active(void) {
FILE: drivers/usbpd.h
type usbpd_allowance_t (line 19) | typedef enum {
FILE: drivers/wear_leveling/wear_leveling_flash_spi.c
function backing_store_init (line 15) | bool backing_store_init(void) {
function backing_store_unlock (line 21) | bool backing_store_unlock(void) {
function backing_store_erase (line 27) | bool backing_store_erase(void) {
function backing_store_write (line 45) | bool backing_store_write(uint32_t address, backing_store_int_t value) {
function backing_store_lock (line 49) | bool backing_store_lock(void) {
function backing_store_read (line 55) | bool backing_store_read(uint32_t address, backing_store_int_t *value) {
function backing_store_read_bulk (line 59) | bool backing_store_read_bulk(uint32_t address, backing_store_int_t *valu...
function backing_store_write_bulk (line 72) | bool backing_store_write_bulk(uint32_t address, backing_store_int_t *val...
FILE: layouts/default/ortho_5x4/default_ortho_5x4/keymap.c
type custom_keycodes (line 6) | enum custom_keycodes {
function process_record_user (line 54) | bool process_record_user(uint16_t keycode, keyrecord_t *record) {
FILE: layouts/default/ortho_6x4/default_ortho_6x4/keymap.c
type custom_keycodes (line 6) | enum custom_keycodes {
function process_record_user (line 60) | bool process_record_user(uint16_t keycode, keyrecord_t *record) {
FILE: lib/fnv/fnv.h
type Fnv32_t (line 88) | typedef uint32_t Fnv32_t;
type Fnv64_t (line 126) | typedef uint64_t Fnv64_t;
type Fnv64_t (line 128) | typedef struct {
type fnv_type (line 174) | enum fnv_type {
type test_vector (line 188) | struct test_vector {
type fnv0_32_test_vector (line 192) | struct fnv0_32_test_vector {
type fnv1_32_test_vector (line 196) | struct fnv1_32_test_vector {
type fnv1a_32_test_vector (line 200) | struct fnv1a_32_test_vector {
type fnv0_64_test_vector (line 204) | struct fnv0_64_test_vector {
type fnv1_64_test_vector (line 208) | struct fnv1_64_test_vector {
type fnv1a_64_test_vector (line 212) | struct fnv1a_64_test_vector {
type test_vector (line 238) | struct test_vector
type fnv0_32_test_vector (line 239) | struct fnv0_32_test_vector
type fnv1_32_test_vector (line 240) | struct fnv1_32_test_vector
type fnv1a_32_test_vector (line 241) | struct fnv1a_32_test_vector
type fnv0_64_test_vector (line 242) | struct fnv0_64_test_vector
type fnv1_64_test_vector (line 243) | struct fnv1_64_test_vector
type fnv1a_64_test_vector (line 244) | struct fnv1a_64_test_vector
type fnv_type (line 245) | enum fnv_type
FILE: lib/fnv/fnv32.c
function test_fnv32 (line 100) | static int
function main (line 230) | int
FILE: lib/fnv/fnv64.c
function test_fnv64 (line 100) | static int
function main (line 341) | int
FILE: lib/fnv/hash_32.c
function Fnv32_t (line 90) | Fnv32_t
function Fnv32_t (line 133) | Fnv32_t
FILE: lib/fnv/hash_32a.c
function Fnv32_t (line 81) | Fnv32_t
function Fnv32_t (line 121) | Fnv32_t
FILE: lib/fnv/hash_64.c
function Fnv64_t (line 112) | Fnv64_t
function Fnv64_t (line 222) | Fnv64_t
FILE: lib/fnv/hash_64a.c
function Fnv64_t (line 95) | Fnv64_t
function Fnv64_t (line 201) | Fnv64_t
FILE: lib/fnv/have_ulong64.c
function main (line 42) | int
FILE: lib/fnv/test_fnv.c
type test_vector (line 95) | struct test_vector
type fnv0_32_test_vector (line 294) | struct fnv0_32_test_vector
type fnv1_32_test_vector (line 502) | struct fnv1_32_test_vector
type fnv1a_32_test_vector (line 710) | struct fnv1a_32_test_vector
type fnv0_64_test_vector (line 919) | struct fnv0_64_test_vector
type fnv0_64_test_vector (line 1126) | struct fnv0_64_test_vector
type fnv1_64_test_vector (line 1336) | struct fnv1_64_test_vector
type fnv1_64_test_vector (line 1543) | struct fnv1_64_test_vector
type fnv1a_64_test_vector (line 1753) | struct fnv1a_64_test_vector
type fnv1a_64_test_vector (line 1960) | struct fnv1a_64_test_vector
function unknown_hash_type (line 2179) | void
function print_fnv32 (line 2196) | void
function print_fnv64 (line 2216) | void
FILE: lib/lib8tion/lib8tion.c
function test1abs (line 128) | void test1abs( int8_t i)
function testabs (line 135) | void testabs()
function testmul8 (line 145) | void testmul8()
function testscale8 (line 165) | void testscale8()
function testqadd8 (line 200) | void testqadd8()
function testnscale8x3 (line 217) | void testnscale8x3()
FILE: lib/lib8tion/lib8tion.h
type fract8 (line 328) | typedef uint8_t fract8;
type sfract7 (line 332) | typedef int8_t sfract7;
type fract16 (line 336) | typedef uint16_t fract16;
type sfract15 (line 340) | typedef int16_t sfract15;
type accum88 (line 347) | typedef uint16_t accum88;
type saccum78 (line 348) | typedef int16_t saccum78;
type accum1616 (line 349) | typedef uint32_t accum1616;
type saccum1516 (line 350) | typedef int32_t saccum1516;
type accum124 (line 351) | typedef uint16_t accum124;
type saccum114 (line 352) | typedef int32_t saccum114;
function LIB8STATIC (line 377) | LIB8STATIC float sfract15ToFloat( sfract15 y)
function LIB8STATIC (line 386) | LIB8STATIC sfract15 floatToSfract15( float f)
function LIB8STATIC (line 427) | LIB8STATIC uint8_t lerp8by8( uint8_t a, uint8_t b, fract8 frac)
function LIB8STATIC (line 444) | LIB8STATIC uint16_t lerp16by16( uint16_t a, uint16_t b, fract16 frac)
function LIB8STATIC (line 461) | LIB8STATIC uint16_t lerp16by8( uint16_t a, uint16_t b, fract8 frac)
function LIB8STATIC (line 478) | LIB8STATIC int16_t lerp15by8( int16_t a, int16_t b, fract8 frac)
function LIB8STATIC (line 495) | LIB8STATIC int16_t lerp15by16( int16_t a, int16_t b, fract16 frac)
function LIB8STATIC (line 527) | LIB8STATIC uint8_t map8( uint8_t in, uint8_t rangeStart, uint8_t rangeEnd)
function LIB8STATIC (line 544) | LIB8STATIC uint8_t ease8InOutQuad( uint8_t i)
function LIB8STATIC (line 562) | LIB8STATIC uint8_t ease8InOutQuad(uint8_t val) {
function LIB8STATIC (line 589) | LIB8STATIC uint16_t ease16InOutQuad( uint16_t i)
function LIB8STATIC (line 606) | LIB8STATIC fract8 ease8InOutCubic( fract8 i)
function LIB8STATIC (line 635) | LIB8STATIC fract8 ease8InOutApprox( fract8 i)
function LIB8STATIC (line 656) | LIB8STATIC uint8_t ease8InOutApprox( fract8 i)
function LIB8STATIC (line 700) | LIB8STATIC uint8_t triwave8(uint8_t in)
function LIB8STATIC (line 721) | LIB8STATIC uint8_t quadwave8(uint8_t in)
function LIB8STATIC (line 728) | LIB8STATIC uint8_t cubicwave8(uint8_t in)
function LIB8STATIC (line 757) | LIB8STATIC uint8_t squarewave8( uint8_t in, uint8_t pulsewidth)
function LIB8STATIC (line 834) | LIB8STATIC uint16_t beat88( accum88 beats_per_minute_88, uint32_t timebase)
function LIB8STATIC (line 848) | LIB8STATIC uint16_t beat16( accum88 beats_per_minute, uint32_t timebase)
function LIB8STATIC (line 856) | LIB8STATIC uint8_t beat8( accum88 beats_per_minute, uint32_t timebase)
function LIB8STATIC (line 867) | LIB8STATIC uint16_t beatsin88( accum88 beats_per_minute_88, uint16_t low...
function LIB8STATIC (line 879) | LIB8STATIC uint16_t beatsin16(accum88 beats_per_minute, uint16_t lowest,...
function LIB8STATIC (line 891) | LIB8STATIC uint8_t beatsin8( accum88 beats_per_minute, uint8_t lowest, u...
function LIB8STATIC (line 904) | LIB8STATIC uint16_t seconds16(void)
function LIB8STATIC (line 914) | LIB8STATIC uint16_t minutes16(void)
function LIB8STATIC (line 924) | LIB8STATIC uint8_t hours8(void)
FILE: lib/lib8tion/math8.h
function LIB8STATIC_ALWAYS_INLINE (line 23) | LIB8STATIC_ALWAYS_INLINE uint8_t qadd8( uint8_t i, uint8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 56) | LIB8STATIC_ALWAYS_INLINE int8_t qadd7( int8_t i, int8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 88) | LIB8STATIC_ALWAYS_INLINE uint8_t qsub8( uint8_t i, uint8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 117) | LIB8STATIC_ALWAYS_INLINE uint8_t add8( uint8_t i, uint8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 132) | LIB8STATIC_ALWAYS_INLINE uint16_t add8to16( uint8_t i, uint16_t j)
function LIB8STATIC_ALWAYS_INLINE (line 152) | LIB8STATIC_ALWAYS_INLINE uint8_t sub8( uint8_t i, uint8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 169) | LIB8STATIC_ALWAYS_INLINE uint8_t avg8( uint8_t i, uint8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 190) | LIB8STATIC_ALWAYS_INLINE uint16_t avg16( uint16_t i, uint16_t j)
function LIB8STATIC_ALWAYS_INLINE (line 217) | LIB8STATIC_ALWAYS_INLINE int8_t avg7( int8_t i, int8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 238) | LIB8STATIC_ALWAYS_INLINE int16_t avg15( int16_t i, int16_t j)
function LIB8STATIC_ALWAYS_INLINE (line 270) | LIB8STATIC_ALWAYS_INLINE uint8_t mod8( uint8_t a, uint8_t m)
function LIB8STATIC (line 297) | LIB8STATIC uint8_t addmod8( uint8_t a, uint8_t b, uint8_t m)
function LIB8STATIC (line 326) | LIB8STATIC uint8_t submod8( uint8_t a, uint8_t b, uint8_t m)
function LIB8STATIC_ALWAYS_INLINE (line 345) | LIB8STATIC_ALWAYS_INLINE uint8_t mul8( uint8_t i, uint8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 370) | LIB8STATIC_ALWAYS_INLINE uint8_t qmul8( uint8_t i, uint8_t j)
function LIB8STATIC_ALWAYS_INLINE (line 404) | LIB8STATIC_ALWAYS_INLINE int8_t abs8( int8_t i)
function LIB8STATIC (line 429) | LIB8STATIC uint8_t sqrt16(uint16_t x)
function LIB8STATIC (line 465) | LIB8STATIC uint8_t blend8( uint8_t a, uint8_t b, uint8_t amountOfB)
function LIB8STATIC (line 536) | LIB8STATIC uint8_t blend8( uint8_t a, uint8_t b, uint8_t amountOfB)
FILE: lib/lib8tion/random8.h
function LIB8STATIC (line 19) | LIB8STATIC uint8_t random8(void)
function LIB8STATIC (line 29) | LIB8STATIC uint16_t random16(void)
function LIB8STATIC (line 37) | LIB8STATIC uint8_t random8_max(uint8_t lim)
function LIB8STATIC (line 47) | LIB8STATIC uint8_t random8_min_max(uint8_t min, uint8_t lim)
function LIB8STATIC (line 56) | LIB8STATIC uint16_t random16_max(uint16_t lim)
function LIB8STATIC (line 67) | LIB8STATIC uint16_t random16_min_max( uint16_t min, uint16_t lim)
function LIB8STATIC (line 75) | LIB8STATIC void random16_set_seed(uint16_t seed)
function LIB8STATIC (line 81) | LIB8STATIC uint16_t random16_get_seed(void)
function LIB8STATIC (line 87) | LIB8STATIC void random16_add_entropy(uint16_t entropy)
FILE: lib/lib8tion/scale8.h
function LIB8STATIC_ALWAYS_INLINE (line 20) | LIB8STATIC_ALWAYS_INLINE uint8_t scale8( uint8_t i, fract8 scale)
function LIB8STATIC_ALWAYS_INLINE (line 98) | LIB8STATIC_ALWAYS_INLINE uint8_t scale8_video( uint8_t i, fract8 scale)
function LIB8STATIC_ALWAYS_INLINE (line 146) | LIB8STATIC_ALWAYS_INLINE uint8_t scale8_LEAVING_R1_DIRTY( uint8_t i, fra...
function LIB8STATIC_ALWAYS_INLINE (line 189) | LIB8STATIC_ALWAYS_INLINE uint8_t scale8_video_LEAVING_R1_DIRTY( uint8_t ...
function LIB8STATIC_ALWAYS_INLINE (line 233) | LIB8STATIC_ALWAYS_INLINE void cleanup_R1(void)
function LIB8STATIC_ALWAYS_INLINE (line 246) | LIB8STATIC_ALWAYS_INLINE uint16_t scale16by8( uint16_t i, fract8 scale )
function LIB8STATIC (line 315) | LIB8STATIC uint16_t scale16( uint16_t i, fract16 scale )
function LIB8STATIC (line 491) | LIB8STATIC uint8_t dim8_raw( uint8_t x)
function LIB8STATIC (line 497) | LIB8STATIC uint8_t dim8_video( uint8_t x)
function LIB8STATIC (line 503) | LIB8STATIC uint8_t dim8_lin( uint8_t x )
function LIB8STATIC (line 515) | LIB8STATIC uint8_t brighten8_raw( uint8_t x)
function LIB8STATIC (line 522) | LIB8STATIC uint8_t brighten8_video( uint8_t x)
function LIB8STATIC (line 529) | LIB8STATIC uint8_t brighten8_lin( uint8_t x )
FILE: lib/lib8tion/trig8.h
function LIB8STATIC (line 30) | LIB8STATIC int16_t sin16_avr( uint16_t theta )
function LIB8STATIC (line 88) | LIB8STATIC int16_t sin16_C( uint16_t theta )
function LIB8STATIC (line 120) | LIB8STATIC int16_t cos16( uint16_t theta)
function LIB8STATIC (line 159) | LIB8STATIC uint8_t sin8_avr( uint8_t theta)
function LIB8STATIC (line 217) | LIB8STATIC uint8_t sin8_C( uint8_t theta)
function LIB8STATIC (line 253) | LIB8STATIC uint8_t cos8( uint8_t theta)
function LIB8STATIC (line 260) | LIB8STATIC uint8_t atan2_8(int16_t dy, int16_t dx)
FILE: lib/python/kle2xy.py
class KLE2xy (line 8) | class KLE2xy(list):
method __init__ (line 11) | def __init__(self, layout=None, name='', invert_y=True):
method width (line 25) | def width(self):
method height (line 31) | def height(self):
method size (line 37) | def size(self):
method attrs (line 42) | def attrs(self, properties):
method parse_layout (line 49) | def parse_layout(self, layout): # noqa FIXME(skullydazed): flake8 sa...
FILE: lib/python/qmk/build_targets.py
class BuildTarget (line 21) | class BuildTarget:
method __init__ (line 22) | def __init__(self, keyboard: str, keymap: str, json: Union[dict, Dotty...
method __str__ (line 32) | def __str__(self):
method __repr__ (line 35) | def __repr__(self):
method __lt__ (line 40) | def __lt__(self, __value: object) -> bool:
method __eq__ (line 43) | def __eq__(self, __value: object) -> bool:
method __hash__ (line 48) | def __hash__(self) -> int:
method configure (line 51) | def configure(self, parallel: int = None, clean: bool = None, compiled...
method keyboard (line 60) | def keyboard(self) -> str:
method keymap (line 64) | def keymap(self) -> str:
method json (line 68) | def json(self) -> dict:
method dotty (line 76) | def dotty(self) -> Dotty:
method extra_args (line 80) | def extra_args(self) -> Dict[str, str]:
method extra_args (line 84) | def extra_args(self, ex_args: Dict[str, str]):
method target_name (line 88) | def target_name(self, **env_vars) -> str:
method _all_vars (line 97) | def _all_vars(self, **env_vars) -> Dict[str, str]:
method _intermediate_output (line 103) | def _intermediate_output(self, **env_vars) -> Path:
method _common_make_args (line 106) | def _common_make_args(self, dry_run: bool = False, build_target: str =...
method prepare_build (line 145) | def prepare_build(self, build_target: str = None, dry_run: bool = Fals...
method compile_command (line 148) | def compile_command(self, build_target: str = None, dry_run: bool = Fa...
method generate_compilation_database (line 151) | def generate_compilation_database(self, build_target: str = None, skip...
method compile (line 160) | def compile(self, build_target: str = None, dry_run: bool = False, **e...
class KeyboardKeymapBuildTarget (line 181) | class KeyboardKeymapBuildTarget(BuildTarget):
method __init__ (line 182) | def __init__(self, keyboard: str, keymap: str, json: dict = None):
method __repr__ (line 185) | def __repr__(self):
method _load_json (line 190) | def _load_json(self):
method prepare_build (line 193) | def prepare_build(self, build_target: str = None, dry_run: bool = Fals...
method compile_command (line 196) | def compile_command(self, build_target: str = None, dry_run: bool = Fa...
class JsonKeymapBuildTarget (line 217) | class JsonKeymapBuildTarget(BuildTarget):
method __init__ (line 218) | def __init__(self, json_path):
method __repr__ (line 232) | def __repr__(self):
method _load_json (line 237) | def _load_json(self):
method prepare_build (line 240) | def prepare_build(self, build_target: str = None, dry_run: bool = Fals...
method compile_command (line 264) | def compile_command(self, build_target: str = None, dry_run: bool = Fa...
FILE: lib/python/qmk/c_parse.py
function _get_chunks (line 20) | def _get_chunks(it, size):
function preprocess_c_file (line 27) | def preprocess_c_file(file):
function strip_line_comment (line 35) | def strip_line_comment(string):
function strip_multiline_comment (line 41) | def strip_multiline_comment(string):
function c_source_files (line 47) | def c_source_files(dir_names):
function find_layouts (line 61) | def find_layouts(file):
function parse_config_h_file (line 114) | def parse_config_h_file(config_h_file, config_h=None):
function _default_key (line 156) | def _default_key(label=None):
function _parse_layout_macro (line 168) | def _parse_layout_macro(layout_macro):
function _parse_matrix_locations (line 178) | def _parse_matrix_locations(matrix, file, macro_name):
function _coerce_led_token (line 198) | def _coerce_led_token(_type, value):
function _validate_led_config (line 220) | def _validate_led_config(matrix, matrix_rows, matrix_cols, matrix_indexe...
function _parse_led_config (line 237) | def _parse_led_config(file, matrix_cols, matrix_rows):
function find_led_config (line 300) | def find_led_config(file, matrix_cols, matrix_rows):
FILE: lib/python/qmk/cli/__init__.py
function _get_default_distrib_path (line 18) | def _get_default_distrib_path():
function _install_deps (line 121) | def _install_deps(requirements):
function _run_cmd (line 141) | def _run_cmd(*command):
function _find_broken_requirements (line 152) | def _find_broken_requirements(requirements):
function _broken_module_imports (line 187) | def _broken_module_imports(requirements):
function _yesno (line 201) | def _yesno(*args):
function _eprint (line 207) | def _eprint(errmsg):
FILE: lib/python/qmk/cli/bux.py
function bux (line 10) | def bux(cli):
FILE: lib/python/qmk/cli/c2json.py
function c2json (line 27) | def c2json(cli):
FILE: lib/python/qmk/cli/cd.py
function cd (line 13) | def cd(cli):
FILE: lib/python/qmk/cli/chibios/confmigrate.py
function eprint (line 12) | def eprint(*args, **kwargs):
function collect_defines (line 42) | def collect_defines(filepath):
function check_diffs (line 57) | def check_diffs(input_defs, reference_defs):
function migrate_chconf_h (line 79) | def migrate_chconf_h(to_override, outfile):
function migrate_halconf_h (line 89) | def migrate_halconf_h(to_override, outfile):
function migrate_mcuconf_h (line 99) | def migrate_mcuconf_h(to_override, outfile):
function chibios_confmigrate (line 116) | def chibios_confmigrate(cli):
FILE: lib/python/qmk/cli/ci/validate_aliases.py
function _safe_keyboard_folder (line 8) | def _safe_keyboard_folder(target):
function _target_keyboard_exists (line 15) | def _target_keyboard_exists(target):
function _alias_not_self (line 28) | def _alias_not_self(alias):
function ci_validate_aliases (line 44) | def ci_validate_aliases(cli):
FILE: lib/python/qmk/cli/clean.py
function clean (line 11) | def clean(cli):
FILE: lib/python/qmk/cli/compile.py
function compile (line 29) | def compile(cli):
FILE: lib/python/qmk/cli/docs.py
function docs (line 12) | def docs(cli):
FILE: lib/python/qmk/cli/doctor/check.py
class CheckStatus (line 14) | class CheckStatus(Enum):
function _check_make_version (line 39) | def _check_make_version():
function _check_git_version (line 47) | def _check_git_version():
function _check_dos2unix_version (line 55) | def _check_dos2unix_version():
function _check_diff_version (line 63) | def _check_diff_version():
function _check_arm_gcc_version (line 74) | def _check_arm_gcc_version():
function _check_arm_gcc_installation (line 84) | def _check_arm_gcc_installation():
function _check_avr_gcc_version (line 114) | def _check_avr_gcc_version():
function _check_avr_gcc_installation (line 124) | def _check_avr_gcc_installation():
function _check_avrdude_version (line 154) | def _check_avrdude_version():
function _check_dfu_util_version (line 162) | def _check_dfu_util_version():
function _check_dfu_programmer_version (line 170) | def _check_dfu_programmer_version():
function check_binaries (line 178) | def check_binaries():
function check_binary_versions (line 203) | def check_binary_versions():
function check_submodules (line 230) | def check_submodules():
function is_in_path (line 242) | def is_in_path(command):
function is_executable (line 251) | def is_executable(command):
function release_info (line 268) | def release_info(file='/etc/os-release'):
FILE: lib/python/qmk/cli/doctor/linux.py
function _is_wsl (line 13) | def _is_wsl():
function _udev_rule (line 17) | def _udev_rule(vid, pid=None, *args):
function _generate_desired_rules (line 33) | def _generate_desired_rules(bootloader_vids_pids):
function _deprecated_udev_rule (line 45) | def _deprecated_udev_rule(vid, pid=None):
function check_udev_rules (line 56) | def check_udev_rules():
function check_systemd (line 114) | def check_systemd():
function check_modem_manager (line 120) | def check_modem_manager():
function os_test_linux (line 134) | def os_test_linux():
FILE: lib/python/qmk/cli/doctor/macos.py
function os_test_macos (line 8) | def os_test_macos():
FILE: lib/python/qmk/cli/doctor/main.py
function distrib_tests (line 18) | def distrib_tests():
function os_tests (line 72) | def os_tests():
function git_tests (line 91) | def git_tests():
function output_submodule_status (line 131) | def output_submodule_status():
function userspace_tests (line 149) | def userspace_tests(qmk_firmware):
function doctor (line 171) | def doctor(cli):
FILE: lib/python/qmk/cli/doctor/windows.py
function os_test_windows (line 8) | def os_test_windows():
FILE: lib/python/qmk/cli/find.py
function find (line 21) | def find(cli):
FILE: lib/python/qmk/cli/flash.py
function _list_bootloaders (line 20) | def _list_bootloaders():
function _flash_binary (line 46) | def _flash_binary(filename, mcu):
function flash (line 73) | def flash(cli):
FILE: lib/python/qmk/cli/format/c.py
function is_relative_to (line 17) | def is_relative_to(file, other):
function find_clang_format (line 23) | def find_clang_format():
function find_diffs (line 35) | def find_diffs(files):
function cformat_run (line 52) | def cformat_run(files):
function filter_files (line 73) | def filter_files(files, core_only=False):
function format_c (line 99) | def format_c(cli):
FILE: lib/python/qmk/cli/format/json.py
function _detect_json_format (line 16) | def _detect_json_format(file, json_data):
function _get_json_encoder (line 52) | def _get_json_encoder(file, json_data):
function format_json (line 77) | def format_json(cli):
FILE: lib/python/qmk/cli/format/python.py
function yapf_run (line 13) | def yapf_run(files):
function filter_files (line 25) | def filter_files(files):
function format_python (line 41) | def format_python(cli):
FILE: lib/python/qmk/cli/format/text.py
function _get_chunks (line 11) | def _get_chunks(it, size):
function dos2unix_run (line 18) | def dos2unix_run(files):
function format_text (line 32) | def format_text(cli):
FILE: lib/python/qmk/cli/generate/api.py
function _list_constants (line 22) | def _list_constants(output_folder):
function _resolve_keycode_specs (line 39) | def _resolve_keycode_specs(output_folder):
function _filtered_copy (line 59) | def _filtered_copy(src, dst):
function _filtered_keyboard_list (line 79) | def _filtered_keyboard_list():
function generate_api (line 95) | def generate_api(cli):
FILE: lib/python/qmk/cli/generate/autocorrect_data.py
function parse_file (line 53) | def parse_file(file_name: str) -> List[Tuple[str, str]]:
function make_trie (line 110) | def make_trie(autocorrections: List[Tuple[str, str]]) -> Dict[str, Any]:
function parse_file_lines (line 127) | def parse_file_lines(file_name: str) -> Iterator[Tuple[int, str, str]]:
function check_typo_against_dictionary (line 148) | def check_typo_against_dictionary(typo: str, line_number: int, correct_w...
function serialize_trie (line 168) | def serialize_trie(autocorrections: List[Tuple[str, str]], trie: Dict[st...
function encode_link (line 235) | def encode_link(link: Dict[str, Any]) -> List[int]:
function typo_len (line 244) | def typo_len(e: Tuple[str, str]) -> int:
function to_hex (line 248) | def to_hex(b: int) -> str:
function generate_autocorrect_data (line 258) | def generate_autocorrect_data(cli):
FILE: lib/python/qmk/cli/generate/community_modules.py
function _render_api_guard (line 16) | def _render_api_guard(lines, api):
function _render_api_header (line 24) | def _render_api_header(api):
function _render_keycodes (line 33) | def _render_keycodes(module_jsons):
function _render_api_declarations (line 59) | def _render_api_declarations(api, module, user_kb=True):
function _render_api_implementations (line 70) | def _render_api_implementations(api, module):
function _render_core_implementation (line 111) | def _render_core_implementation(api, modules):
function _generate_features_rules (line 134) | def _generate_features_rules(features_dict):
function _generate_modules_rules (line 143) | def _generate_modules_rules(keyboard, filename):
function generate_community_modules_rules_mk (line 178) | def generate_community_modules_rules_mk(cli):
function generate_community_modules_h (line 202) | def generate_community_modules_h(cli):
function generate_community_modules_c (line 255) | def generate_community_modules_c(cli):
function _generate_include_per_module (line 283) | def _generate_include_per_module(cli, include_file_name):
function generate_community_modules_introspection_h (line 305) | def generate_community_modules_introspection_h(cli):
function generate_community_modules_introspection_c (line 316) | def generate_community_modules_introspection_c(cli):
function generate_led_matrix_community_modules_inc (line 327) | def generate_led_matrix_community_modules_inc(cli):
function generate_rgb_matrix_community_modules_inc (line 338) | def generate_rgb_matrix_community_modules_inc(cli):
FILE: lib/python/qmk/cli/generate/compilation_database.py
function generate_compilation_database (line 7) | def generate_compilation_database(cli):
FILE: lib/python/qmk/cli/generate/config_h.py
function generate_define (line 17) | def generate_define(define, value=None):
function direct_pins (line 30) | def direct_pins(direct_pins, postfix):
function pin_array (line 42) | def pin_array(define, pins, postfix):
function matrix_pins (line 50) | def matrix_pins(matrix_pins, postfix=''):
function generate_matrix_size (line 67) | def generate_matrix_size(kb_info_json, config_h_lines):
function generate_config_items (line 75) | def generate_config_items(kb_info_json, config_h_lines):
function generate_encoder_config (line 115) | def generate_encoder_config(encoder_json, config_h_lines, postfix=''):
function generate_split_config (line 139) | def generate_split_config(kb_info_json, config_h_lines):
function generate_led_animations_config (line 158) | def generate_led_animations_config(feature, led_feature_json, config_h_l...
function generate_config_h (line 172) | def generate_config_h(cli):
FILE: lib/python/qmk/cli/generate/develop_pr_list.py
function _is_ignored (line 18) | def _is_ignored(title):
function _get_pr_info (line 25) | def _get_pr_info(cache, gh, pr_num):
function _try_open_cache (line 34) | def _try_open_cache(cli):
function _get_github (line 45) | def _get_github():
function generate_develop_pr_list (line 57) | def generate_develop_pr_list(cli):
FILE: lib/python/qmk/cli/generate/dfu_header.py
function generate_dfu_header (line 19) | def generate_dfu_header(cli):
FILE: lib/python/qmk/cli/generate/docs.py
function generate_docs (line 11) | def generate_docs(cli):
FILE: lib/python/qmk/cli/generate/info_json.py
function pruning_validator (line 20) | def pruning_validator(validator_class):
function strip_info_json (line 36) | def strip_info_json(kb_info_json):
function generate_info_json (line 55) | def generate_info_json(cli):
FILE: lib/python/qmk/cli/generate/keyboard_c.py
function _gen_led_configs (line 16) | def _gen_led_configs(info_data):
function _gen_led_config (line 28) | def _gen_led_config(info_data, config_type):
function _gen_matrix_mask (line 69) | def _gen_matrix_mask(info_data):
function _gen_joystick_axes (line 99) | def _gen_joystick_axes(info_data):
class LayoutKey (line 136) | class LayoutKey:
method from_json (line 147) | def from_json(key_json):
method cx (line 160) | def cx(self):
method cy (line 165) | def cy(self):
class Layout (line 170) | class Layout:
method __init__ (line 172) | def __init__(self, layout_json):
method is_symmetric (line 181) | def is_symmetric(self, tol: float = 0.02):
method widest_horizontal_gap (line 193) | def widest_horizontal_gap(self):
function _gen_chordal_hold_layout (line 207) | def _gen_chordal_hold_layout(info_data):
function generate_keyboard_c (line 260) | def generate_keyboard_c(cli):
FILE: lib/python/qmk/cli/generate/keyboard_h.py
function _generate_layouts (line 14) | def _generate_layouts(keyboard, kb_info_json):
function _generate_keycodes (line 68) | def _generate_keycodes(kb_info_json):
function generate_keyboard_h (line 102) | def generate_keyboard_h(cli):
FILE: lib/python/qmk/cli/generate/keycodes.py
function _translate_group (line 11) | def _translate_group(group):
function _render_key (line 21) | def _render_key(key):
function _render_label (line 34) | def _render_label(label):
function _generate_ranges (line 39) | def _generate_ranges(lines, keycodes):
function _generate_defines (line 52) | def _generate_defines(lines, keycodes):
function _generate_helpers (line 69) | def _generate_helpers(lines, keycodes):
function _generate_aliases (line 106) | def _generate_aliases(lines, keycodes):
function _generate_version (line 128) | def _generate_version(lines, keycodes, prefix=''):
function generate_keycodes (line 146) | def generate_keycodes(cli):
function generate_keycode_extras (line 169) | def generate_keycode_extras(cli):
FILE: lib/python/qmk/cli/generate/keymap_h.py
function _generate_keycodes_function (line 11) | def _generate_keycodes_function(keymap_json):
function generate_keymap_h (line 38) | def generate_keymap_h(cli):
FILE: lib/python/qmk/cli/generate/make_dependencies.py
function generate_make_dependencies (line 20) | def generate_make_dependencies(cli):
FILE: lib/python/qmk/cli/generate/rgb_breathe_table.py
function breathing_center (line 13) | def breathing_center(value):
function breathing_max (line 21) | def breathing_max(value):
function _generate_table (line 29) | def _generate_table(lines, center, maximum):
function generate_rgb_breathe_table (line 68) | def generate_rgb_breathe_table(cli):
FILE: lib/python/qmk/cli/generate/rules_mk.py
function generate_rule (line 17) | def generate_rule(rules_key, rules_value):
function process_mapping_rule (line 23) | def process_mapping_rule(kb_info_json, rules_key, info_dict):
function generate_features_rules (line 49) | def generate_features_rules(features_dict):
function generate_rules_mk (line 64) | def generate_rules_mk(cli):
FILE: lib/python/qmk/cli/generate/version_h.py
function generate_version_h (line 21) | def generate_version_h(cli):
FILE: lib/python/qmk/cli/git/submodule.py
function git_submodule (line 26) | def git_submodule(cli):
FILE: lib/python/qmk/cli/hello.py
function hello (line 10) | def hello(cli):
FILE: lib/python/qmk/cli/import/kbfirmware.py
function import_kbfirmware (line 10) | def import_kbfirmware(cli):
FILE: lib/python/qmk/cli/import/keyboard.py
function import_keyboard (line 10) | def import_keyboard(cli):
FILE: lib/python/qmk/cli/import/keymap.py
function import_keymap (line 10) | def import_keymap(cli):
FILE: lib/python/qmk/cli/info.py
function _strip_api_content (line 21) | def _strip_api_content(info_json):
function show_keymap (line 48) | def show_keymap(kb_info_json, title_caps=True):
function show_layouts (line 72) | def show_layouts(kb_info_json, title_caps=True):
function show_matrix (line 81) | def show_matrix(kb_info_json, title_caps=True):
function show_leds (line 105) | def show_leds(kb_info_json, title_caps=True):
function print_friendly_output (line 147) | def print_friendly_output(kb_info_json):
function print_text_output (line 166) | def print_text_output(kb_info_json):
function print_dotted_output (line 185) | def print_dotted_output(kb_info_json, prefix=''):
function print_parsed_rules_mk (line 203) | def print_parsed_rules_mk(keyboard_name):
function info (line 222) | def info(cli):
FILE: lib/python/qmk/cli/json2c.py
function json2c (line 15) | def json2c(cli):
FILE: lib/python/qmk/cli/kle2json.py
function kle2json (line 18) | def kle2json(cli):
FILE: lib/python/qmk/cli/license_check.py
function _simplify_text (line 17) | def _simplify_text(input):
function _preformat_license_texts (line 30) | def _preformat_license_texts():
function _determine_suffix_condition (line 37) | def _determine_suffix_condition(extensions):
function _determine_file_list (line 54) | def _determine_file_list(inputs, conditional):
function _detect_license_from_file_contents (line 68) | def _detect_license_from_file_contents(filename, absolute=False, short=F...
function license_check (line 119) | def license_check(cli):
FILE: lib/python/qmk/cli/lint.py
function _list_defaultish_keymaps (line 22) | def _list_defaultish_keymaps(kb):
function _get_readme_files (line 38) | def _get_readme_files(kb, km=None):
function _get_build_files (line 60) | def _get_build_files(kb, km=None):
function _get_code_files (line 82) | def _get_code_files(kb, km=None):
function _is_invalid_readme (line 105) | def _is_invalid_readme(file):
function _is_empty_rules (line 124) | def _is_empty_rules(file):
function _is_empty_include (line 133) | def _is_empty_include(file):
function _has_license (line 142) | def _has_license(file):
function _handle_json_errors (line 150) | def _handle_json_errors(kb, info):
function _handle_invalid_features (line 165) | def _handle_invalid_features(kb, info):
function _handle_invalid_config (line 176) | def _handle_invalid_config(kb, info):
function _chibios_conf_includenext_check (line 184) | def _chibios_conf_includenext_check(target):
function _rules_mk_assignment_only (line 193) | def _rules_mk_assignment_only(rules_mk):
function _handle_duplicating_code_defaults (line 219) | def _handle_duplicating_code_defaults(kb, info):
function keymap_check (line 245) | def keymap_check(kb, km):
function keyboard_check (line 281) | def keyboard_check(kb): # noqa C901
function lint (line 354) | def lint(cli):
FILE: lib/python/qmk/cli/list/keyboards.py
function list_keyboards (line 9) | def list_keyboards(cli):
FILE: lib/python/qmk/cli/list/keymaps.py
function list_keymaps (line 13) | def list_keymaps(cli):
FILE: lib/python/qmk/cli/list/layouts.py
function list_layouts (line 13) | def list_layouts(cli):
FILE: lib/python/qmk/cli/mass_compile.py
function mass_compile_targets (line 19) | def mass_compile_targets(targets: List[BuildTarget], clean: bool, dry_ru...
function mass_compile (line 138) | def mass_compile(cli):
FILE: lib/python/qmk/cli/migrate.py
function _candidate_files (line 15) | def _candidate_files(keyboard):
function migrate (line 31) | def migrate(cli):
FILE: lib/python/qmk/cli/new/keyboard.py
function mcu_type (line 30) | def mcu_type(mcu):
function layout_type (line 38) | def layout_type(layout):
function keyboard_name (line 46) | def keyboard_name(name):
function validate_keyboard_name (line 54) | def validate_keyboard_name(name):
function select_default_bootloader (line 61) | def select_default_bootloader(mcu):
function replace_placeholders (line 67) | def replace_placeholders(src, dest, tokens):
function replace_string (line 77) | def replace_string(src, token, value):
function augment_community_info (line 81) | def augment_community_info(config, src, dest):
function _question (line 113) | def _question(*args, **kwargs):
function prompt_heading_subheading (line 134) | def prompt_heading_subheading(heading, subheading):
function prompt_keyboard (line 139) | def prompt_keyboard():
function prompt_user (line 148) | def prompt_user():
function prompt_name (line 154) | def prompt_name(def_name):
function prompt_layout (line 160) | def prompt_layout():
function prompt_mcu_type (line 171) | def prompt_mcu_type():
function prompt_dev_board (line 183) | def prompt_dev_board():
function prompt_mcu (line 190) | def prompt_mcu():
function new_keyboard (line 206) | def new_keyboard(cli):
FILE: lib/python/qmk/cli/new/keymap.py
function _list_available_converters (line 23) | def _list_available_converters(kb_name):
function _set_converter (line 37) | def _set_converter(file, converter):
function validate_keymap_name (line 48) | def validate_keymap_name(name):
function prompt_keyboard (line 55) | def prompt_keyboard():
function prompt_user (line 63) | def prompt_user():
function prompt_converter (line 71) | def prompt_converter(kb_name):
function new_keymap (line 96) | def new_keymap(cli):
FILE: lib/python/qmk/cli/painter/convert_graphics.py
function painter_convert_graphics (line 18) | def painter_convert_graphics(cli):
FILE: lib/python/qmk/cli/painter/make_font.py
function painter_make_font_image (line 18) | def painter_make_font_image(cli):
function painter_convert_font_image (line 36) | def painter_convert_font_image(cli):
FILE: lib/python/qmk/cli/pytest.py
function pytest (line 12) | def pytest(cli):
FILE: lib/python/qmk/cli/resolve_alias.py
function resolve_alias (line 9) | def resolve_alias(cli):
FILE: lib/python/qmk/cli/test/c.py
function test_c (line 16) | def test_c(cli):
FILE: lib/python/qmk/cli/userspace/add.py
function userspace_add (line 18) | def userspace_add(cli):
FILE: lib/python/qmk/cli/userspace/compile.py
function _extra_arg_setter (line 15) | def _extra_arg_setter(target, extra_args):
function userspace_compile (line 26) | def userspace_compile(cli):
FILE: lib/python/qmk/cli/userspace/doctor.py
function userspace_doctor (line 10) | def userspace_doctor(cli):
FILE: lib/python/qmk/cli/userspace/list.py
function _extra_arg_setter (line 16) | def _extra_arg_setter(target, extra_args):
function userspace_list (line 22) | def userspace_list(cli):
FILE: lib/python/qmk/cli/userspace/path.py
function userspace_path (line 6) | def userspace_path(cli):
FILE: lib/python/qmk/cli/userspace/remove.py
function userspace_remove (line 18) | def userspace_remove(cli):
FILE: lib/python/qmk/cli/via2json.py
function _find_via_layout_macro (line 16) | def _find_via_layout_macro(keyboard_data):
function _convert_macros (line 23) | def _convert_macros(via_macros):
function _fix_macro_keys (line 68) | def _fix_macro_keys(keymap_data):
function _via_to_keymap (line 79) | def _via_to_keymap(via_backup, keyboard_data, keymap_layout):
function via2json (line 124) | def via2json(cli):
FILE: lib/python/qmk/commands.py
function find_make (line 18) | def find_make():
function get_make_parallel_args (line 29) | def get_make_parallel_args(parallel=1):
function parse_configurator_json (line 47) | def parse_configurator_json(configurator_file):
function parse_env_vars (line 72) | def parse_env_vars(args):
function build_environment (line 85) | def build_environment(args):
function in_virtualenv (line 94) | def in_virtualenv():
function dump_lines (line 102) | def dump_lines(output_file, lines, quiet=True, remove_repeated_newlines=...
FILE: lib/python/qmk/comment_remover.py
function _comment_stripper (line 10) | def _comment_stripper(match):
function comment_remover (line 17) | def comment_remover(text):
FILE: lib/python/qmk/community_modules.py
class ModuleAPI (line 16) | class ModuleAPI(AttrDict):
method __init__ (line 17) | def __init__(self, **kwargs):
function module_api_list (line 24) | def module_api_list():
function find_available_module_paths (line 45) | def find_available_module_paths():
function find_module_path (line 60) | def find_module_path(module):
function load_module_json (line 79) | def load_module_json(module):
function load_module_jsons (line 97) | def load_module_jsons(modules):
FILE: lib/python/qmk/compilation_database.py
function system_libs (line 20) | def system_libs(binary: str) -> List[Path]:
function cpu_defines (line 39) | def cpu_defines(binary: str, compiler_args: str) -> List[str]:
function parse_make_n (line 69) | def parse_make_n(f: Iterator[str]) -> List[Dict[str, str]]:
function write_compilation_database (line 105) | def write_compilation_database(keyboard: str = None, keymap: str = None,...
FILE: lib/python/qmk/converter.py
function kle2qmk (line 6) | def kle2qmk(kle):
FILE: lib/python/qmk/datetime.py
function current_date (line 12) | def current_date():
function current_datetime (line 19) | def current_datetime():
function current_time (line 26) | def current_time():
FILE: lib/python/qmk/decorators.py
function _get_subcommand_name (line 12) | def _get_subcommand_name():
function automagic_keyboard (line 21) | def automagic_keyboard(func):
function automagic_keymap (line 48) | def automagic_keymap(func):
function lru_cache (line 70) | def lru_cache(timeout=10, maxsize=128, typed=False):
FILE: lib/python/qmk/docs.py
function run_docs_command (line 20) | def run_docs_command(verb, cmd_args=None):
function prepare_docs_build_area (line 37) | def prepare_docs_build_area(is_production):
FILE: lib/python/qmk/errors.py
class NoSuchKeyboardError (line 1) | class NoSuchKeyboardError(Exception):
method __init__ (line 4) | def __init__(self, message):
class CppError (line 8) | class CppError(Exception):
method __init__ (line 11) | def __init__(self, message):
FILE: lib/python/qmk/flashers.py
class DelayedKeyboardInterrupt (line 31) | class DelayedKeyboardInterrupt:
method __enter__ (line 34) | def __enter__(self):
method handler (line 38) | def handler(self, sig, frame):
method __exit__ (line 41) | def __exit__(self, type, value, traceback):
function _check_dfu_programmer_version (line 48) | def _check_dfu_programmer_version():
function _find_usb_device (line 60) | def _find_usb_device(vid_hex, pid_hex):
function _find_uf2_devices (line 74) | def _find_uf2_devices():
function _find_bootloader (line 80) | def _find_bootloader():
function _find_serial_port (line 110) | def _find_serial_port(vid, pid):
function _flash_caterina (line 139) | def _flash_caterina(details, file):
function _flash_atmel_dfu (line 148) | def _flash_atmel_dfu(mcu, file):
function _flash_hid_bootloader (line 155) | def _flash_hid_bootloader(mcu, details, file):
function _flash_dfu_util (line 173) | def _flash_dfu_util(details, file):
function _flash_wb32_dfu_updater (line 185) | def _flash_wb32_dfu_updater(file):
function _flash_isp (line 194) | def _flash_isp(mcu, programmer, file):
function _flash_mdloader (line 201) | def _flash_mdloader(file):
function _flash_uf2 (line 205) | def _flash_uf2(file):
function flasher (line 213) | def flasher(mcu, file):
FILE: lib/python/qmk/git.py
function git_get_version (line 11) | def git_get_version(repo_dir='.', check_dir='.'):
function git_get_username (line 36) | def git_get_username():
function git_get_branch (line 45) | def git_get_branch():
function git_get_tag (line 57) | def git_get_tag():
function git_get_last_log_entry (line 65) | def git_get_last_log_entry(branch_name):
function git_get_common_ancestor (line 74) | def git_get_common_ancestor(branch_a, branch_b):
function git_get_remotes (line 84) | def git_get_remotes():
function git_is_dirty (line 101) | def git_is_dirty():
function git_check_repo (line 113) | def git_check_repo():
function git_check_deviation (line 124) | def git_check_deviation(active_branch):
function git_get_ignored_files (line 132) | def git_get_ignored_files(check_dir='.'):
function git_get_qmk_hash (line 141) | def git_get_qmk_hash():
FILE: lib/python/qmk/importers.py
function replace_placeholders (line 16) | def replace_placeholders(src, dest, tokens):
function _gen_dummy_keymap (line 26) | def _gen_dummy_keymap(name, info_data):
function _extract_kbfirmware_layout (line 40) | def _extract_kbfirmware_layout(kbf_data):
function _extract_kbfirmware_keymap (line 57) | def _extract_kbfirmware_keymap(kbf_data):
function import_keymap (line 80) | def import_keymap(keymap_data):
function import_keyboard (line 99) | def import_keyboard(info_data, keymap_data=None):
function import_kbfirmware (line 148) | def import_kbfirmware(kbfirmware_data):
FILE: lib/python/qmk/info.py
class LedFlags (line 25) | class LedFlags(IntFlag):
function _keyboard_in_layout_name (line 34) | def _keyboard_in_layout_name(keyboard, layout):
function _valid_community_layout (line 59) | def _valid_community_layout(layout):
function _get_key_left_position (line 65) | def _get_key_left_position(key):
function _find_invalid_encoder_index (line 70) | def _find_invalid_encoder_index(info_data):
function _validate_build_target (line 98) | def _validate_build_target(keyboard, info_data):
function _validate_layouts (line 124) | def _validate_layouts(keyboard, info_data): # noqa C901
function _validate_keycodes (line 195) | def _validate_keycodes(keyboard, info_data):
function _validate_encoders (line 205) | def _validate_encoders(keyboard, info_data):
function _validate (line 214) | def _validate(keyboard, info_data):
function info_json (line 233) | def info_json(keyboard, force_layout=None):
function _extract_features (line 288) | def _extract_features(info_data, rules):
function _extract_matrix_rules (line 315) | def _extract_matrix_rules(info_data, rules):
function _pin_name (line 333) | def _pin_name(pin):
function _extract_pins (line 350) | def _extract_pins(pins):
function _extract_2d_array (line 356) | def _extract_2d_array(raw):
function _extract_2d_int_array (line 379) | def _extract_2d_int_array(raw):
function _extract_direct_matrix (line 387) | def _extract_direct_matrix(direct_pins):
function _extract_audio (line 400) | def _extract_audio(info_data, config_c):
function _extract_encoders_values (line 413) | def _extract_encoders_values(config_c, postfix=''):
function _extract_encoders (line 439) | def _extract_encoders(info_data, config_c):
function _extract_split_encoders (line 459) | def _extract_split_encoders(info_data, config_c):
function _extract_secure_unlock (line 479) | def _extract_secure_unlock(info_data, config_c):
function _extract_split_handedness (line 494) | def _extract_split_handedness(info_data, config_c):
function _extract_split_serial (line 502) | def _extract_split_serial(info_data, config_c):
function _extract_split_transport (line 513) | def _extract_split_transport(info_data, config_c):
function _extract_split_right_pins (line 548) | def _extract_split_right_pins(info_data, config_c):
function _extract_matrix_info (line 577) | def _extract_matrix_info(info_data, config_c):
function _config_to_json (line 615) | def _config_to_json(key_type, config_value):
function _extract_config_h (line 661) | def _extract_config_h(info_data, config_c):
function _process_defaults (line 710) | def _process_defaults(info_data):
function _extract_rules_mk (line 730) | def _extract_rules_mk(info_data, rules):
function find_keyboard_c (line 784) | def find_keyboard_c(keyboard):
function _extract_led_config (line 800) | def _extract_led_config(info_data, keyboard):
function _matrix_size (line 847) | def _matrix_size(info_data):
function _joystick_axis_count (line 868) | def _joystick_axis_count(info_data):
function _matrix_masked (line 878) | def _matrix_masked(info_data):
function _check_matrix (line 897) | def _check_matrix(info_data):
function _search_keyboard_h (line 924) | def _search_keyboard_h(keyboard):
function _log_error (line 945) | def _log_error(info_data, message):
function _log_warning (line 952) | def _log_warning(info_data, message):
function arm_processor_rules (line 959) | def arm_processor_rules(info_data, rules):
function avr_processor_rules (line 974) | def avr_processor_rules(info_data, rules):
function unknown_processor_rules (line 988) | def unknown_processor_rules(info_data, rules):
function merge_info_jsons (line 1000) | def merge_info_jsons(keyboard, info_data):
function find_info_json (line 1057) | def find_info_json(keyboard):
function keymap_json_config (line 1078) | def keymap_json_config(keyboard, keymap, force_layout=None):
function keymap_json (line 1090) | def keymap_json(keyboard, keymap, force_layout=None):
function get_modules (line 1117) | def get_modules(keyboard, keymap_filename):
FILE: lib/python/qmk/json_encoders.py
class QMKJSONEncoder (line 9) | class QMKJSONEncoder(json.JSONEncoder):
method __init__ (line 15) | def __init__(self, *args, **kwargs):
method encode_decimal (line 22) | def encode_decimal(self, obj):
method encode_dict (line 30) | def encode_dict(self, obj, path):
method encode_dict_single_line (line 45) | def encode_dict_single_line(self, obj, path):
method encode_list (line 50) | def encode_list(self, obj, path):
method encode (line 69) | def encode(self, obj, path=[]):
method primitives_only (line 84) | def primitives_only(self, obj):
method indent_str (line 93) | def indent_str(self):
class InfoJSONEncoder (line 97) | class InfoJSONEncoder(QMKJSONEncoder):
method sort_layout (line 100) | def sort_layout(self, item):
method sort_dict (line 128) | def sort_dict(self, item):
class KeymapJSONEncoder (line 158) | class KeymapJSONEncoder(QMKJSONEncoder):
method encode_list (line 161) | def encode_list(self, obj, path):
method sort_dict (line 195) | def sort_dict(self, item):
class UserspaceJSONEncoder (line 222) | class UserspaceJSONEncoder(QMKJSONEncoder):
method sort_dict (line 225) | def sort_dict(self, item):
class CommunityModuleJSONEncoder (line 240) | class CommunityModuleJSONEncoder(QMKJSONEncoder):
method sort_dict (line 243) | def sort_dict(self, item):
FILE: lib/python/qmk/json_schema.py
function _dict_raise_on_duplicates (line 17) | def _dict_raise_on_duplicates(ordered_pairs):
function _json_load_impl (line 29) | def _json_load_impl(json_file, strict=True):
function json_load (line 49) | def json_load(json_file, strict=True):
function load_jsonschema (line 54) | def load_jsonschema(schema_name):
function compile_schema_store (line 69) | def compile_schema_store():
function create_validator (line 90) | def create_validator(schema):
function validate (line 99) | def validate(data, schema):
function deep_update (line 107) | def deep_update(origdict, newdict):
function merge_ordered_dicts (line 120) | def merge_ordered_dicts(dicts):
FILE: lib/python/qmk/keyboard.py
class AllKeyboards (line 57) | class AllKeyboards:
method __str__ (line 60) | def __str__(self):
method __repr__ (line 63) | def __repr__(self):
method __eq__ (line 66) | def __eq__(self, other):
function keyboard_alias_definitions (line 74) | def keyboard_alias_definitions():
function is_all_keyboards (line 78) | def is_all_keyboards(keyboard):
function find_keyboard_from_dir (line 86) | def find_keyboard_from_dir():
function find_readme (line 106) | def find_readme(keyboard):
function keyboard_folder (line 119) | def keyboard_folder(keyboard):
function keyboard_aliases (line 138) | def keyboard_aliases(keyboard):
function keyboard_folder_or_all (line 154) | def keyboard_folder_or_all(keyboard):
function _find_name (line 166) | def _find_name(path):
function keyboard_completer (line 172) | def keyboard_completer(prefix, action, parser, parsed_args):
function list_keyboards (line 179) | def list_keyboards():
function config_h (line 194) | def config_h(keyboard):
function rules_mk (line 214) | def rules_mk(keyboard):
function render_layout (line 234) | def render_layout(layout_data, render_ascii, key_labels=None):
function render_layouts (line 270) | def render_layouts(info_json, render_ascii):
function render_key_rect (line 282) | def render_key_rect(textpad, x, y, w, h, label, style):
function render_key_isoenter (line 311) | def render_key_isoenter(textpad, x, y, w, h, label, style):
function render_key_baenter (line 343) | def render_key_baenter(textpad, x, y, w, h, label, style):
function render_encoder (line 375) | def render_encoder(textpad, x, y, w, h, label, style):
FILE: lib/python/qmk/keycodes.py
function _find_versions (line 10) | def _find_versions(path, prefix):
function _potential_search_versions (line 19) | def _potential_search_versions(version, lang=None):
function _search_path (line 28) | def _search_path(lang=None):
function _search_prefix (line 32) | def _search_prefix(lang=None):
function _locate_files (line 36) | def _locate_files(path, prefix, versions):
function _process_files (line 51) | def _process_files(files):
function _validate (line 64) | def _validate(spec):
function load_spec (line 78) | def load_spec(version, lang=None):
function list_versions (line 102) | def list_versions(lang=None):
function list_languages (line 111) | def list_languages():
FILE: lib/python/qmk/keymap.py
function _generate_keymap_table (line 44) | def _generate_keymap_table(keymap_json):
function _generate_encodermap_table (line 56) | def _generate_encodermap_table(keymap_json):
function _generate_dipswitchmap_table (line 70) | def _generate_dipswitchmap_table(keymap_json):
function _generate_macros_function (line 83) | def _generate_macros_function(keymap_json):
function _strip_any (line 144) | def _strip_any(keycode):
function find_keymap_from_dir (line 153) | def find_keymap_from_dir(*args):
function keymap_completer (line 190) | def keymap_completer(prefix, action, parser, parsed_args):
function is_keymap_dir (line 209) | def is_keymap_dir(keymap, c=True, json=True, additional_files=None):
function generate_json (line 243) | def generate_json(keymap, keyboard, layout, layers, macros=None):
function generate_c (line 272) | def generate_c(keymap_json):
function write_file (line 323) | def write_file(keymap_filename, keymap_content):
function write_json (line 332) | def write_json(keyboard, keymap, layout, layers, macros=None):
function locate_keymap (line 357) | def locate_keymap(keyboard, keymap, force_layout=None):
function is_keymap_target (line 409) | def is_keymap_target(keyboard, keymap):
function list_keymaps (line 419) | def list_keymaps(keyboard, c=True, json=True, additional_files=None, ful...
function _c_preprocess (line 483) | def _c_preprocess(path, stdin=DEVNULL):
function _get_layers (line 502) | def _get_layers(keymap): # noqa C901 : until someone has a good idea ho...
function parse_keymap_c (line 622) | def parse_keymap_c(keymap_file, use_cpp=True):
function c2json (line 651) | def c2json(keyboard, keymap, keymap_file, use_cpp=True):
FILE: lib/python/qmk/makefile.py
function parse_rules_mk_file (line 6) | def parse_rules_mk_file(file, rules_mk=None):
FILE: lib/python/qmk/math.py
function compute (line 12) | def compute(expr):
function _eval (line 25) | def _eval(node):
FILE: lib/python/qmk/math_ops.py
function compute (line 12) | def compute(expr):
function _eval (line 25) | def _eval(node):
FILE: lib/python/qmk/painter.py
function _render_text (line 85) | def _render_text(values):
function _render_numeration (line 90) | def _render_numeration(metadata):
function _render_values (line 94) | def _render_values(metadata, key):
function _render_image_metadata (line 98) | def _render_image_metadata(metadata):
function command_args_str (line 141) | def command_args_str(cli, command_name):
function generate_subs (line 160) | def generate_subs(cli, out_bytes, *, font_metadata=None, image_metadata=...
function render_license (line 214) | def render_license(subs):
function render_header (line 230) | def render_header(subs):
function render_source (line 251) | def render_source(subs):
function render_bytes (line 256) | def render_bytes(bytes, newline_after=16):
function clean_output (line 267) | def clean_output(str):
function rescale_byte (line 273) | def rescale_byte(val, maxval):
function convert_requested_format (line 279) | def convert_requested_format(im, format):
function rgb_to565 (line 320) | def rgb_to565(r, g, b):
function convert_image_bytes (line 326) | def convert_image_bytes(im, format):
function compress_bytes_qmk_rle (line 409) | def compress_bytes_qmk_rle(bytearray):
FILE: lib/python/qmk/painter_qff.py
function o24 (line 17) | def o24(i):
class QFFGlyphInfo (line 24) | class QFFGlyphInfo(AttrDict):
method __init__ (line 25) | def __init__(self, *args, **kwargs):
method write (line 34) | def write(self, fp, include_code_point):
class QFFFontDescriptor (line 45) | class QFFFontDescriptor:
method __init__ (line 50) | def __init__(self):
method write (line 64) | def write(self, fp):
method is_transparent (line 82) | def is_transparent(self):
method is_transparent (line 86) | def is_transparent(self, val):
class QFFAsciiGlyphTableV1 (line 96) | class QFFAsciiGlyphTableV1:
method __init__ (line 100) | def __init__(self):
method add_glyph (line 108) | def add_glyph(self, glyph: QFFGlyphInfo):
method write (line 111) | def write(self, fp):
class QFFUnicodeGlyphTableV1 (line 121) | class QFFUnicodeGlyphTableV1:
method __init__ (line 124) | def __init__(self):
method add_glyph (line 132) | def add_glyph(self, glyph: QFFGlyphInfo):
method write (line 135) | def write(self, fp):
class QFFFontDataDescriptorV1 (line 146) | class QFFFontDataDescriptorV1:
method __init__ (line 149) | def __init__(self):
method write (line 154) | def write(self, fp):
function _generate_font_glyphs_list (line 163) | def _generate_font_glyphs_list(use_ascii, unicode_glyphs):
class QFFFont (line 180) | class QFFFont:
method __init__ (line 181) | def __init__(self, logger):
method _extract_glyphs (line 188) | def _extract_glyphs(self, format):
method _parse_image (line 207) | def _parse_image(self, img, include_ascii_glyphs: bool = True, unicode...
method generate_image (line 249) | def generate_image(self, ttf_file: Path, font_size: int, include_ascii...
method save_to_image (line 314) | def save_to_image(self, img_file: Path):
method read_from_image (line 323) | def read_from_image(self, img_file: Path, include_ascii_glyphs: bool =...
method save_to_qff (line 328) | def save_to_qff(self, format: Dict[str, Any], use_rle: bool, fp):
FILE: lib/python/qmk/painter_qgf.py
function o24 (line 16) | def o24(i):
function rgb888_to_qmk_hsv888 (line 21) | def rgb888_to_qmk_hsv888(e):
class QGFBlockHeader (line 29) | class QGFBlockHeader:
method write (line 32) | def write(self, fp):
class QGFGraphicsDescriptor (line 43) | class QGFGraphicsDescriptor:
method __init__ (line 48) | def __init__(self):
method write (line 58) | def write(self, fp):
method image_size (line 72) | def image_size(self):
method image_size (line 76) | def image_size(self, size):
class QGFFrameOffsetDescriptorV1 (line 83) | class QGFFrameOffsetDescriptorV1:
method __init__ (line 86) | def __init__(self, frame_count):
method write (line 92) | def write(self, fp):
class QGFFrameDescriptorV1 (line 104) | class QGFFrameDescriptorV1:
method __init__ (line 108) | def __init__(self):
method write (line 118) | def write(self, fp):
method is_transparent (line 129) | def is_transparent(self):
method is_transparent (line 133) | def is_transparent(self, val):
method is_delta (line 140) | def is_delta(self):
method is_delta (line 144) | def is_delta(self, val):
class QGFFramePaletteDescriptorV1 (line 154) | class QGFFramePaletteDescriptorV1:
method __init__ (line 157) | def __init__(self):
method write (line 163) | def write(self, fp):
class QGFFrameDeltaDescriptorV1 (line 177) | class QGFFrameDeltaDescriptorV1:
method __init__ (line 181) | def __init__(self):
method write (line 190) | def write(self, fp):
method bbox (line 200) | def bbox(self):
method bbox (line 204) | def bbox(self, bbox):
class QGFFrameDataDescriptorV1 (line 211) | class QGFFrameDataDescriptorV1:
method __init__ (line 214) | def __init__(self):
method write (line 219) | def write(self, fp):
class QGFImageFile (line 228) | class QGFImageFile(ImageFile.ImageFile):
method _open (line 233) | def _open(self):
function _accept (line 240) | def _accept(prefix):
function _for_all_frames (line 248) | def _for_all_frames(x: FunctionType, /, images):
function _compress_image (line 263) | def _compress_image(frame, last_frame, *, use_rle, use_deltas, format_, ...
function _write_frame (line 330) | def _write_frame(idx, frame, last_frame, *, fp, frame_offsets, metadata,...
function _save (line 396) | def _save(im, fp, _filename):
FILE: lib/python/qmk/path.py
function is_keyboard (line 12) | def is_keyboard(keyboard_name):
function under_qmk_firmware (line 29) | def under_qmk_firmware(path=Path(os.environ['ORIG_CWD'])):
function under_qmk_userspace (line 38) | def under_qmk_userspace(path=Path(os.environ['ORIG_CWD'])):
function is_under_qmk_firmware (line 49) | def is_under_qmk_firmware(path=Path(os.environ['ORIG_CWD'])):
function is_under_qmk_userspace (line 60) | def is_under_qmk_userspace(path=Path(os.environ['ORIG_CWD'])):
function keyboard (line 72) | def keyboard(keyboard_name):
function keymaps (line 78) | def keymaps(keyboard_name):
function keymap (line 119) | def keymap(keyboard_name, keymap_name):
function normpath (line 134) | def normpath(path):
function unix_style_path (line 147) | def unix_style_path(path):
class FileType (line 169) | class FileType(argparse.FileType):
method __init__ (line 170) | def __init__(self, *args, **kwargs):
method __call__ (line 176) | def __call__(self, string):
FILE: lib/python/qmk/search.py
class KeyboardKeymapDesc (line 22) | class KeyboardKeymapDesc:
method __hash__ (line 28) | def __hash__(self) -> int:
method __lt__ (line 31) | def __lt__(self, other) -> bool:
method load_data (line 34) | def load_data(self):
method dotty (line 39) | def dotty(self) -> Dotty:
method to_build_target (line 42) | def to_build_target(self) -> KeyboardKeymapBuildTarget:
class FilterFunction (line 50) | class FilterFunction:
method __init__ (line 68) | def __init__(self, key, value):
class Exists (line 73) | class Exists(FilterFunction):
method apply (line 76) | def apply(self, target_info: KeyboardKeymapDesc) -> bool:
class Absent (line 80) | class Absent(FilterFunction):
method apply (line 83) | def apply(self, target_info: KeyboardKeymapDesc) -> bool:
class Length (line 87) | class Length(FilterFunction):
method apply (line 90) | def apply(self, target_info: KeyboardKeymapDesc) -> bool:
class Contains (line 95) | class Contains(FilterFunction):
method apply (line 98) | def apply(self, target_info: KeyboardKeymapDesc) -> bool:
function _get_filter_class (line 103) | def _get_filter_class(func_name: str, key: str, value: str) -> Optional[...
function filter_help (line 115) | def filter_help() -> str:
function _set_log_level (line 120) | def _set_log_level(level):
function ignore_logging (line 134) | def ignore_logging():
function _all_keymaps (line 140) | def _all_keymaps(keyboard) -> List[KeyboardKeymapDesc]:
function _keymap_exists (line 148) | def _keymap_exists(keyboard, keymap):
function _load_keymap_info (line 155) | def _load_keymap_info(target: KeyboardKeymapDesc) -> KeyboardKeymapDesc:
function expand_make_targets (line 163) | def expand_make_targets(targets: List[Union[str, Tuple[str, Dict[str, st...
function _expand_keymap_target (line 183) | def _expand_keymap_target(target: KeyboardKeymapDesc, all_keyboards: Lis...
function expand_keymap_targets (line 215) | def expand_keymap_targets(targets: List[KeyboardKeymapDesc]) -> List[Key...
function _construct_build_target (line 225) | def _construct_build_target(e: KeyboardKeymapDesc):
function _filter_keymap_targets (line 229) | def _filter_keymap_targets(target_list: List[KeyboardKeymapDesc], filter...
function search_keymap_targets (line 309) | def search_keymap_targets(targets: List[Union[Tuple[str, str], Tuple[str...
function search_make_targets (line 324) | def search_make_targets(targets: List[Union[str, Tuple[str, Dict[str, st...
FILE: lib/python/qmk/submodules.py
function status (line 6) | def status():
function update (line 62) | def update(submodules=None):
FILE: lib/python/qmk/tests/attrdict.py
class AttrDict (line 1) | class AttrDict(dict):
method __init__ (line 6) | def __init__(self, *args, **kwargs):
FILE: lib/python/qmk/tests/test_cli_commands.py
function check_subcommand (line 9) | def check_subcommand(command, *args):
function check_subcommand_stdin (line 15) | def check_subcommand_stdin(file_to_read, command, *args):
function check_returncode (line 24) | def check_returncode(result, expected=[0]):
function test_format_c (line 34) | def test_format_c():
function test_format_c_all (line 39) | def test_format_c_all():
function test_compile (line 44) | def test_compile():
function test_compile_json (line 49) | def test_compile_json():
function test_flash (line 54) | def test_flash():
function test_flash_bootloaders (line 59) | def test_flash_bootloaders():
function test_kle2json (line 64) | def test_kle2json():
function test_doctor (line 70) | def test_doctor():
function test_hello (line 77) | def test_hello():
function test_format_python (line 83) | def test_format_python():
function test_list_keyboards (line 89) | def test_list_keyboards():
function test_list_keymaps (line 97) | def test_list_keymaps():
function test_list_keymaps_long (line 104) | def test_list_keymaps_long():
function test_list_keymaps_community (line 111) | def test_list_keymaps_community():
function test_list_keymaps_kb_only (line 117) | def test_list_keymaps_kb_only():
function test_list_keymaps_vendor_kb (line 123) | def test_list_keymaps_vendor_kb():
function test_list_keymaps_vendor_kb_rev (line 129) | def test_list_keymaps_vendor_kb_rev():
function test_list_keymaps_no_keyboard_found (line 135) | def test_list_keymaps_no_keyboard_found():
function test_json2c (line 141) | def test_json2c():
function test_json2c_macros (line 171) | def test_json2c_macros():
function test_json2c_stdin (line 179) | def test_json2c_stdin():
function test_json2c_no_json (line 209) | def test_json2c_no_json():
function test_info (line 215) | def test_info():
function test_info_keyboard_render (line 224) | def test_info_keyboard_render():
function test_info_keymap_render (line 237) | def test_info_keymap_render():
function test_info_matrix_render (line 249) | def test_info_matrix_render():
function test_c2json (line 264) | def test_c2json():
function test_c2json_stdin (line 270) | def test_c2json_stdin():
function test_clean (line 276) | def test_clean():
function test_generate_api (line 282) | def test_generate_api():
function test_generate_rgb_breathe_table (line 287) | def test_generate_rgb_breathe_table():
function test_generate_config_h (line 294) | def test_generate_config_h():
function test_generate_rules_mk (line 309) | def test_generate_rules_mk():
function test_generate_version_h (line 316) | def test_generate_version_h():
function test_format_json_keyboard (line 322) | def test_format_json_keyboard():
function test_format_json_keymap (line 328) | def test_format_json_keymap():
function test_format_json_keyboard_auto (line 334) | def test_format_json_keyboard_auto():
function test_format_json_keymap_auto (line 340) | def test_format_json_keymap_auto():
function test_find_exists (line 346) | def test_find_exists():
function test_find_absent (line 356) | def test_find_absent():
function test_find_length (line 366) | def test_find_length():
function test_find_contains (line 375) | def test_find_contains():
function test_find_multiple_conditions (line 384) | def test_find_multiple_conditions():
FILE: lib/python/qmk/tests/test_qmk_errors.py
function test_nosuchkeyboarderror (line 4) | def test_nosuchkeyboarderror():
FILE: lib/python/qmk/tests/test_qmk_keymap.py
function test_generate_c_pytest_basic (line 4) | def test_generate_c_pytest_basic():
function test_generate_json_pytest_basic (line 37) | def test_generate_json_pytest_basic():
function test_parse_keymap_c (line 42) | def test_parse_keymap_c():
FILE: lib/python/qmk/tests/test_qmk_path.py
function test_keymap_pytest_basic (line 7) | def test_keymap_pytest_basic():
function test_normpath (line 12) | def test_normpath():
FILE: lib/python/qmk/userspace.py
function qmk_userspace_paths (line 14) | def qmk_userspace_paths():
function qmk_userspace_validate (line 41) | def qmk_userspace_validate(path):
function detect_qmk_userspace (line 51) | def detect_qmk_userspace():
class UserspaceDefs (line 65) | class UserspaceDefs:
method __init__ (line 66) | def __init__(self, userspace_json: Path):
method save (line 100) | def save(self):
method add_target (line 130) | def add_target(self, keyboard=None, keymap=None, build_env=None, json_...
method remove_target (line 154) | def remove_target(self, keyboard=None, keymap=None, build_env=None, js...
method __load_v1 (line 178) | def __load_v1(self, json):
method __load_v1_1 (line 182) | def __load_v1_1(self, json):
method __load_v1_target (line 186) | def __load_v1_target(self, e):
method __load_v1_1_target (line 194) | def __load_v1_1_target(self, e):
class UserspaceValidationError (line 202) | class UserspaceValidationError(Exception):
method __init__ (line 203) | def __init__(self, *args, **kwargs):
method __str__ (line 207) | def __str__(self):
method exceptions (line 211) | def exceptions(self):
method add (line 214) | def add(self, schema, exception):
FILE: lib/python/qmk/util.py
function maybe_exit (line 17) | def maybe_exit(rc):
function maybe_exit_config (line 26) | def maybe_exit_config(should_exit: bool = True, should_reraise: bool = F...
function truthy (line 33) | def truthy(value, value_if_unknown=False):
function parallelize (line 55) | def parallelize():
function parallel_map (line 93) | def parallel_map(*args, **kwargs):
function triplet_to_bcd (line 104) | def triplet_to_bcd(ver: str):
FILE: lib/usbhost/USB_Host_Shield_2.0/BTD.h
function virtual (line 238) | virtual uint8_t GetAddress() {
function virtual (line 246) | virtual bool isReady() {
function virtual (line 255) | virtual bool DEVCLASSOK(uint8_t klass) {
function virtual (line 266) | virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
function registerBluetoothService (line 297) | int8_t registerBluetoothService(BluetoothService *pService) {
function pairWithWiimote (line 464) | void pairWithWiimote() {
function pairWithHID (line 480) | void pairWithHID() {
function readPollInterval (line 495) | uint8_t readPollInterval() {
function class (line 565) | class BluetoothService {
FILE: lib/usbhost/USB_Host_Shield_2.0/BTHID.h
function class (line 29) | class BTHID : public BluetoothService {
FILE: lib/usbhost/USB_Host_Shield_2.0/PS3BT.cpp
function String (line 141) | String PS3BT::getTemperature() {
FILE: lib/usbhost/USB_Host_Shield_2.0/PS3BT.h
function class (line 32) | class PS3BT : public BluetoothService {
FILE: lib/usbhost/USB_Host_Shield_2.0/PS3Enums.h
type StatusEnum (line 113) | enum StatusEnum {
FILE: lib/usbhost/USB_Host_Shield_2.0/PS3USB.h
function class (line 49) | class PS3USB : public USBDeviceConfig {
FILE: lib/usbhost/USB_Host_Shield_2.0/PS4BT.h
function connected (line 45) | bool connected() {
function virtual (line 65) | virtual void OnInitBTHID() {
function virtual (line 75) | virtual void ResetBTHID() {
function virtual (line 81) | virtual void sendOutputReport(PS4Output *output) { // Source: https://gi...
function HID_Command (line 117) | void HID_Command(uint8_t *data, uint8_t nbytes) {
FILE: lib/usbhost/USB_Host_Shield_2.0/PS4Parser.h
type touchpadXY (line 74) | struct touchpadXY {
type PS4Status (line 84) | struct PS4Status {
type PS4Data (line 92) | struct PS4Data {
type PS4Output (line 116) | struct PS4Output {
type DPADEnum (line 123) | enum DPADEnum {
function class (line 136) | class PS4Parser {
FILE: lib/usbhost/USB_Host_Shield_2.0/PS4USB.h
function connected (line 46) | bool connected() {
function attachOnInit (line 54) | void attachOnInit(void (*funcOnInit)(void)) {
function virtual (line 77) | virtual uint8_t OnInitSuccessful() {
function virtual (line 90) | virtual void sendOutputReport(PS4Output *output) { // Source: https://gi...
function virtual (line 122) | virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
FILE: lib/usbhost/USB_Host_Shield_2.0/PSBuzz.h
function class (line 43) | class PSBuzz : public HIDUniversal {
FILE: lib/usbhost/USB_Host_Shield_2.0/SPP.h
function operator (line 80) | operator bool() {
function flush (line 94) | void flush(void) {
FILE: lib/usbhost/USB_Host_Shield_2.0/Usb.cpp
function EpInfo (line 44) | EpInfo* USB::getEpInfoEntry(uint8_t addr, uint8_t ep) {
FILE: lib/usbhost/USB_Host_Shield_2.0/UsbCore.h
type MAX3421e (line 29) | typedef MAX3421e<P6, P3> MAX3421E;
type MAX3421e (line 32) | typedef MAX3421e<P20, P7> MAX3421E;
type MAX3421e (line 34) | typedef MAX3421e<P9, P8> MAX3421E;
type MAX3421e (line 37) | typedef MAX3421e<P53, P54> MAX3421E;
type MAX3421e (line 39) | typedef MAX3421e<P20, P19> MAX3421E;
type MAX3421e (line 41) | typedef MAX3421e<P3, P2> MAX3421E;
type MAX3421e (line 43) | typedef MAX3421e<P10, P9> MAX3421E;
function class (line 121) | class USBDeviceConfig {
type SETUP_PKT (line 163) | typedef struct {
function class (line 192) | class USBReadParser {
function class (line 197) | class USB : public MAX3421E {
function getDevDescr (line 272) | inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbyte...
function getConfDescr (line 277) | inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbyt...
function getStrDescr (line 282) | inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint...
function setAddr (line 287) | inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
function setConf (line 292) | inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
FILE: lib/usbhost/USB_Host_Shield_2.0/Wii.h
type HatEnum (line 36) | enum HatEnum {
type BalanceBoardEnum (line 44) | enum BalanceBoardEnum {
function class (line 56) | class WII : public BluetoothService {
FILE: lib/usbhost/USB_Host_Shield_2.0/XBOXOLD.h
function class (line 46) | class XBOXOLD : public USBDeviceConfig {
FILE: lib/usbhost/USB_Host_Shield_2.0/XBOXONE.h
function class (line 46) | class XBOXONE : public USBDeviceConfig {
FILE: lib/usbhost/USB_Host_Shield_2.0/XBOXRECV.h
function class (line 55) | class XBOXRECV : public USBDeviceConfig {
function attachOnInit (line 223) | void attachOnInit(void (*funcOnInit)(void)) {
FILE: lib/usbhost/USB_Host_Shield_2.0/XBOXUSB.h
function class (line 53) | class XBOXUSB : public USBDeviceConfig {
FILE: lib/usbhost/USB_Host_Shield_2.0/address.h
type EpInfo (line 32) | struct EpInfo {
type UsbDeviceAddress (line 57) | struct UsbDeviceAddress {
type UsbDevice (line 75) | struct UsbDevice {
function class (line 83) | class AddressPool {
function InitEntry (line 106) | void InitEntry(uint8_t index) {
function FreeAddressByIndex (line 135) | void FreeAddressByIndex(uint8_t index) {
function InitAllAddresses (line 155) | void InitAllAddresses() {
function virtual (line 180) | virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) {
function ForEachUsbDevice (line 191) | void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) {
function virtual (line 254) | virtual void FreeAddress(uint8_t addr) {
FILE: lib/usbhost/USB_Host_Shield_2.0/adk.h
function virtual (line 103) | virtual uint8_t Poll() {
function virtual (line 107) | virtual uint8_t GetAddress() {
function virtual (line 111) | virtual bool isReady() {
function virtual (line 115) | virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
function getProto (line 126) | inline uint8_t ADK::getProto(uint8_t* adkproto) {
function sendStr (line 131) | inline uint8_t ADK::sendStr(uint8_t index, const char* str) {
function switchAcc (line 136) | inline uint8_t ADK::switchAcc(void) {
FILE: lib/usbhost/USB_Host_Shield_2.0/avrpins.h
function Set (line 188) | static void Set() {
function Set (line 192) | static void Set(uint8_t val) {
function SetDir (line 198) | static void SetDir(uint8_t val) {
function Clear (line 204) | static void Clear() {
function Toggle (line 208) | static void Toggle() {
function SetDirRead (line 212) | static void SetDirRead() {
function SetDirWrite (line 216) | static void SetDirWrite() {
function IsSet (line 220) | static uint8_t IsSet() {
function WaiteForSet (line 224) | static void WaiteForSet() {
function WaiteForClear (line 229) | static void WaiteForClear() {
function Set (line 249) | static void Set() {
function Clear (line 253) | static void Clear() {
function Toggle (line 257) | static void Toggle() {
type TPin (line 264) | typedef TPin<Porta, 0 > Pa0;
type TPin (line 265) | typedef TPin<Porta, 1 > Pa1;
type TPin (line 266) | typedef TPin<Porta, 2 > Pa2;
type TPin (line 267) | typedef TPin<Porta, 3 > Pa3;
type TPin (line 268) | typedef TPin<Porta, 4 > Pa4;
type TPin (line 269) | typedef TPin<Porta, 5 > Pa5;
type TPin (line 270) | typedef TPin<Porta, 6 > Pa6;
type TPin (line 271) | typedef TPin<Porta, 7 > Pa7;
type TPin (line 275) | typedef TPin<Portb, 0 > Pb0;
type TPin (line 276) | typedef TPin<Portb, 1 > Pb1;
type TPin (line 277) | typedef TPin<Portb, 2 > Pb2;
type TPin (line 278) | typedef TPin<Portb, 3 > Pb3;
type TPin (line 279) | typedef TPin<Portb, 4 > Pb4;
type TPin (line 280) | typedef TPin<Portb, 5 > Pb5;
type TPin (line 281) | typedef TPin<Portb, 6 > Pb6;
type TPin (line 282) | typedef TPin<Portb, 7 > Pb7;
type TPin (line 286) | typedef TPin<Portc, 0 > Pc0;
type TPin (line 287) | typedef TPin<Portc, 1 > Pc1;
type TPin (line 288) | typedef TPin<Portc, 2 > Pc2;
type TPin (line 289) | typedef TPin<Portc, 3 > Pc3;
type TPin (line 290) | typedef TPin<Portc, 4 > Pc4;
type TPin (line 291) | typedef TPin<Portc, 5 > Pc5;
type TPin (line 292) | typedef TPin<Portc, 6 > Pc6;
type TPin (line 293) | typedef TPin<Portc, 7 > Pc7;
type TPin (line 297) | typedef TPin<Portd, 0 > Pd0;
type TPin (line 298) | typedef TPin<Portd, 1 > Pd1;
type TPin (line 299) | typedef TPin<Portd, 2 > Pd2;
type TPin (line 300) | typedef TPin<Portd, 3 > Pd3;
type TPin (line 301) | typedef TPin<Portd, 4 > Pd4;
type TPin (line 302) | typedef TPin<Portd, 5 > Pd5;
type TPin (line 303) | typedef TPin<Portd, 6 > Pd6;
type TPin (line 304) | typedef TPin<Portd, 7 > Pd7;
type TPin (line 308) | typedef TPin<Porte, 0 > Pe0;
type TPin (line 309) | typedef TPin<Porte, 1 > Pe1;
type TPin (line 310) | typedef TPin<Porte, 2 > Pe2;
type TPin (line 311) | typedef TPin<Porte, 3 > Pe3;
type TPin (line 312) | typedef TPin<Porte, 4 > Pe4;
type TPin (line 313) | typedef TPin<Porte, 5 > Pe5;
type TPin (line 314) | typedef TPin<Porte, 6 > Pe6;
type TPin (line 315) | typedef TPin<Porte, 7 > Pe7;
type TPin (line 319) | typedef TPin<Portf, 0 > Pf0;
type TPin (line 320) | typedef TPin<Portf, 1 > Pf1;
type TPin (line 321) | typedef TPin<Portf, 2 > Pf2;
type TPin (line 322) | typedef TPin<Portf, 3 > Pf3;
type TPin (line 323) | typedef TPin<Portf, 4 > Pf4;
type TPin (line 324) | typedef TPin<Portf, 5 > Pf5;
type TPin (line 325) | typedef TPin<Portf, 6 > Pf6;
type TPin (line 326) | typedef TPin<Portf, 7 > Pf7;
type TPin (line 330) | typedef TPin<Portg, 0 > Pg0;
type TPin (line 331) | typedef TPin<Portg, 1 > Pg1;
type TPin (line 332) | typedef TPin<Portg, 2 > Pg2;
type TPin (line 333) | typedef TPin<Portg, 3 > Pg3;
type TPin (line 334) | typedef TPin<Portg, 4 > Pg4;
type TPin (line 335) | typedef TPin<Portg, 5 > Pg5;
type TPin (line 336) | typedef TPin<Portg, 6 > Pg6;
type TPin (line 337) | typedef TPin<Portg, 7 > Pg7;
type TPin (line 341) | typedef TPin<Porth, 0 > Ph0;
type TPin (line 342) | typedef TPin<Porth, 1 > Ph1;
type TPin (line 343) | typedef TPin<Porth, 2 > Ph2;
type TPin (line 344) | typedef TPin<Porth, 3 > Ph3;
type TPin (line 345) | typedef TPin<Porth, 4 > Ph4;
type TPin (line 346) | typedef TPin<Porth, 5 > Ph5;
type TPin (line 347) | typedef TPin<Porth, 6 > Ph6;
type TPin (line 348) | typedef TPin<Porth, 7 > Ph7;
type TPin (line 352) | typedef TPin<Portj, 0 > Pj0;
type TPin (line 353) | typedef TPin<Portj, 1 > Pj1;
type TPin (line 354) | typedef TPin<Portj, 2 > Pj2;
type TPin (line 355) | typedef TPin<Portj, 3 > Pj3;
type TPin (line 356) | typedef TPin<Portj, 4 > Pj4;
type TPin (line 357) | typedef TPin<Portj, 5 > Pj5;
type TPin (line 358) | typedef TPin<Portj, 6 > Pj6;
type TPin (line 359) | typedef TPin<Portj, 7 > Pj7;
type TPin (line 363) | typedef TPin<Portk, 0 > Pk0;
type TPin (line 364) | typedef TPin<Portk, 1 > Pk1;
type TPin (line 365) | typedef TPin<Portk, 2 > Pk2;
type TPin (line 366) | typedef TPin<Portk, 3 > Pk3;
type TPin (line 367) | typedef TPin<Portk, 4 > Pk4;
type TPin (line 368) | typedef TPin<Portk, 5 > Pk5;
type TPin (line 369) | typedef TPin<Portk, 6 > Pk6;
type TPin (line 370) | typedef TPin<Portk, 7 > Pk7;
type TPin (line 374) | typedef TPin<Portl, 0 > Pl0;
type TPin (line 375) | typedef TPin<Portl, 1 > Pl1;
type TPin (line 376) | typedef TPin<Portl, 2 > Pl2;
type TPin (line 377) | typedef TPin<Portl, 3 > Pl3;
type TPin (line 378) | typedef TPin<Portl, 4 > Pl4;
type TPin (line 379) | typedef TPin<Portl, 5 > Pl5;
type TPin (line 380) | typedef TPin<Portl, 6 > Pl6;
type TPin (line 381) | typedef TPin<Portl, 7 > Pl7;
type TPin (line 385) | typedef TPin<Portq, 0 > Pq0;
type TPin (line 386) | typedef TPin<Portq, 1 > Pq1;
type TPin (line 387) | typedef TPin<Portq, 2 > Pq2;
type TPin (line 388) | typedef TPin<Portq, 3 > Pq3;
type TPin (line 389) | typedef TPin<Portq, 4 > Pq4;
type TPin (line 390) | typedef TPin<Portq, 5 > Pq5;
type TPin (line 391) | typedef TPin<Portq, 6 > Pq6;
type TPin (line 392) | typedef TPin<Portq, 7 > Pq7;
type TPin (line 396) | typedef TPin<Portr, 0 > Pr0;
type TPin (line 397) | typedef TPin<Portr, 1 > Pr1;
type TPin (line 398) | typedef TPin<Portr, 2 > Pr2;
type TPin (line 399) | typedef TPin<Portr, 3 > Pr3;
type TPin (line 400) | typedef TPin<Portr, 4 > Pr4;
type TPin (line 401) | typedef TPin<Portr, 5 > Pr5;
type TPin (line 402) | typedef TPin<Portr, 6 > Pr6;
type TPin (line 403) | typedef TPin<Portr, 7 > Pr7;
type TCom (line 407) | typedef TCom<Tccr0a, COM0A1> Tc0a;
type TCom (line 408) | typedef TCom<Tccr0a, COM0B1> Tc0b;
type TCom (line 412) | typedef TCom<Tccr1a, COM1A1> Tc1a;
type TCom (line 413) | typedef TCom<Tccr1a, COM1B1> Tc1b;
type TCom (line 417) | typedef TCom<Tccr2a, COM2A1> Tc2a;
type TCom (line 418) | typedef TCom<Tccr2a, COM2B1> Tc2b;
function SetDirRead (line 431) | static void SetDirRead() {
function SetDirWrite (line 436) | static void SetDirWrite() {
FILE: lib/usbhost/USB_Host_Shield_2.0/cdc_XR21B1411.h
function class (line 103) | class XR21B1411 : public ACM {
FILE: lib/usbhost/USB_Host_Shield_2.0/cdcacm.h
type CALL_MGMNT_FUNC_DESCR (line 86) | typedef struct {
type ACM_FUNC_DESCR (line 94) | typedef struct {
type TEL_RINGER_FUNC_DESCR (line 102) | typedef struct {
type LINE_CODING (line 110) | typedef struct {
type CLASS_NOTIFICATION (line 117) | typedef struct {
function class (line 128) | class CDCAsyncOper {
type tty_features (line 143) | typedef struct {
function available (line 206) | bool available(void) {
function virtual (line 210) | virtual uint8_t GetAddress() {
function virtual (line 214) | virtual bool isReady() {
function enhanced_status (line 218) | enhanced_status(void) {
function enhanced_features (line 222) | enhanced_features(void) {
function virtual (line 233) | virtual void autoflowRTS(bool s) {
function virtual (line 236) | virtual void autoflowDSR(bool s) {
function virtual (line 239) | virtual void autoflowXON(bool s) {
function virtual (line 242) | virtual void half_duplex(bool s) {
function virtual (line 245) | virtual void wide(bool s) {
FILE: lib/usbhost/USB_Host_Shield_2.0/cdcftdi.h
function class (line 79) | class FTDIAsyncOper {
function virtual (line 132) | virtual uint8_t GetAddress() {
function virtual (line 139) | virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
FILE: lib/usbhost/USB_Host_Shield_2.0/cdcprolific.cpp
type pl2303_type (line 34) | enum pl2303_type
FILE: lib/usbhost/USB_Host_Shield_2.0/cdcprolific.h
type tXO_State (line 104) | enum tXO_State {
type pl2303_type (line 112) | enum pl2303_type {
function class (line 122) | class PL2303 : public ACM {
function vendorRead (line 147) | inline uint8_t PL2303::vendorRead( uint8_t val_lo, uint8_t val_hi, uint1...
function vendorWrite (line 153) | inline uint8_t PL2303::vendorWrite( uint8_t val_lo, uint8_t val_hi, uint...
FILE: lib/usbhost/USB_Host_Shield_2.0/confdescparser.h
function class (line 23) | class UsbConfigXtracter {
FILE: lib/usbhost/USB_Host_Shield_2.0/controllerEnums.h
type LEDEnum (line 27) | enum LEDEnum {
type ColorsEnum (line 45) | enum ColorsEnum {
type RumbleEnum (line 66) | enum RumbleEnum {
type ButtonEnum (line 72) | enum ButtonEnum {
type AnalogHatEnum (line 151) | enum AnalogHatEnum {
type SensorEnum (line 166) | enum SensorEnum {
type AngleEnum (line 199) | enum AngleEnum {
FILE: lib/usbhost/USB_Host_Shield_2.0/examples/Bluetooth/BTHID/KeyboardParser.h
function class (line 4) | class KbdRptParser : public KeyboardReportParser {
function HandleLockingKeys (line 16) | uint8_t KbdRptParser::HandleLockingKeys(HID *hid, uint8_t key) {
function PrintKey (line 42) | void KbdRptParser::PrintKey(uint8_t m, uint8_t key) {
function OnKeyDown (line 60) | void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) {
function OnControlKeysChanged (line 69) | void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) {
function OnKeyUp (line 95) | void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) {
function OnKeyPressed (line 100) | void KbdRptParser::OnKeyPressed(uint8_t key) {
FILE: lib/usbhost/USB_Host_Shield_2.0/examples/Bluetooth/BTHID/MouseParser.h
function class (line 4) | class MouseRptParser : public MouseReportParser {
function OnMouseMove (line 15) | void MouseRptParser::OnMouseMove(MOUSEINFO *mi) {
function OnLeftButtonUp (line 22) | void MouseRptParser::OnLeftButtonUp(MOUSEINFO *mi) {
function OnLeftButtonDown (line 26) | void MouseRptParser::OnLeftButtonDown(MOUSEINFO *mi) {
function OnRightButtonUp (line 30) | void MouseRptParser::OnRightButtonUp(MOUSEINFO *mi) {
function OnRightButtonDown (line 34) | void MouseRptParser::OnRightButtonDown(MOUSEINFO *mi) {
function OnMiddleButtonUp (line 38) | void MouseRptParser::OnMiddleButtonUp(MOUSEINFO *mi) {
function OnMiddleButtonDown (line 42) | void MouseRptParser::OnMiddleButtonDown(MOUSEINFO *mi) {
FILE: lib/usbhost/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.h
type GamePadEventData (line 6) | struct GamePadEventData {
function class (line 10) | class JoystickEvents {
function class (line 20) | class JoystickReportParser : public HIDReportParser {
FILE: lib/usbhost/USB_Host_Shield_2.0/examples/HID/le3dp/le3dp_rptparser.h
type GamePadEventData (line 6) | struct GamePadEventData
function class (line 22) | class JoystickEvents
function class (line 30) | class JoystickReportParser : public HIDReportParser
FILE: lib/usbhost/USB_Host_Shield_2.0/examples/HID/scale/scale_rptparser.h
type ScaleEventData (line 18) | struct ScaleEventData
function class (line 27) | class ScaleEvents
function class (line 43) | class ScaleReportParser : public HIDReportParser
FILE: lib/usbhost/USB_Host_Shield_2.0/hexdump.h
function Initialize (line 34) | void Initialize() {
FILE: lib/usbhost/USB_Host_Shield_2.0/hid.h
type HidItemPrefix (line 119) | struct HidItemPrefix {
type MainItemIOFeature (line 125) | struct MainItemIOFeature {
function class (line 138) | class HIDReportParser {
function virtual (line 159) | virtual HIDReportParser* GetReportParser(uint8_t id) {
function USB (line 168) | const USB* GetUsb() {
function virtual (line 172) | virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {
FILE: lib/usbhost/USB_Host_Shield_2.0/hidboot.h
type MOUSEINFO (line 39) | struct MOUSEINFO {
function class (line 51) | class MouseReportParser : public HIDReportParser {
type MODIFIERKEYS (line 85) | struct MODIFIERKEYS {
type KBDINFO (line 96) | struct KBDINFO {
type KBDLEDS (line 112) | struct KBDLEDS {
function class (line 121) | class KeyboardReportParser : public HIDReportParser {
function virtual (line 172) | virtual void OnControlKeysChanged(uint8_t before, uint8_t after) {
function virtual (line 175) | virtual void OnKeyDown(uint8_t mod, uint8_t key) {
function virtual (line 178) | virtual void OnKeyUp(uint8_t mod, uint8_t key) {
function virtual (line 181) | virtual const uint8_t *getNumKeys() {
function virtual (line 185) | virtual const uint8_t *getSymKeysUp() {
function virtual (line 189) | virtual const uint8_t *getSymKeysLo() {
function virtual (line 193) | virtual const uint8_t *getPadKeys() {
function virtual (line 214) | virtual HIDReportParser* GetReportParser(uint8_t id) {
function virtual (line 221) | virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {
function virtual (line 231) | virtual uint8_t GetAddress() {
function virtual (line 235) | virtual bool isReady() {
function virtual (line 243) | virtual bool DEVCLASSOK(uint8_t klass) {
function virtual (line 247) | virtual bool DEVSUBCLASSOK(uint8_t subklass) {
FILE: lib/usbhost/USB_Host_Shield_2.0/hidescriptorparser.cpp
function else (line 1263) | else
FILE: lib/usbhost/USB_Host_Shield_2.0/hidescriptorparser.h
function class (line 22) | class ReportDescParserBase : public USBReadParser {
function class (line 145) | class ReportDescParser : public ReportDescParserBase {
function class (line 148) | class ReportDescParser2 : public ReportDescParserBase {
function class (line 170) | class UniversalReportParser : public HIDReportParser {
FILE: lib/usbhost/USB_Host_Shield_2.0/hiduniversal.cpp
function HIDReportParser (line 84) | HIDReportParser* HIDUniversal::GetReportParser(uint8_t id) {
FILE: lib/usbhost/USB_Host_Shield_2.0/hiduniversal.h
function class (line 24) | class HIDUniversal : public HID {
FILE: lib/usbhost/USB_Host_Shield_2.0/masstorage.h
type Capacity (line 179) | struct Capacity {
type BASICCDB (line 185) | struct BASICCDB {
type BASICCDB (line 194) | typedef BASICCDB BASICCDB_t;
type CDB6 (line 196) | struct CDB6 {
type CommandStatusWrapper (line 436) | struct CommandStatusWrapper {
type RequestSenseResponce (line 443) | struct RequestSenseResponce {
function virtual (line 492) | virtual uint8_t OnInit() {
function GetLastUsbError (line 498) | uint8_t GetLastUsbError() {
function GetbMaxLUN (line 502) | uint8_t GetbMaxLUN() {
function GetbTheLUN (line 506) | uint8_t GetbTheLUN() {
function virtual (line 528) | virtual uint8_t GetAddress() {
function virtual (line 535) | virtual bool DEVCLASSOK(uint8_t klass) {
FILE: lib/usbhost/USB_Host_Shield_2.0/max_LCD.h
function class (line 65) | class Max_LCD : public Print {
FILE: lib/usbhost/USB_Host_Shield_2.0/message.cpp
function E_Notifyc (line 24) | void E_Notifyc(char c, int lvl) {
function E_Notify (line 34) | void E_Notify(char const * msg, int lvl) {
function E_NotifyStr (line 42) | void E_NotifyStr(char const * msg, int lvl) {
function E_Notify (line 50) | void E_Notify(uint8_t b, int lvl) {
function E_Notify (line 60) | void E_Notify(double d, int lvl) {
function NotifyFailGetDevDescr (line 68) | void NotifyFailGetDevDescr(void) {
function NotifyFailSetDevTblEntry (line 72) | void NotifyFailSetDevTblEntry(void) {
function NotifyFailGetConfDescr (line 76) | void NotifyFailGetConfDescr(void) {
function NotifyFailSetConfDescr (line 80) | void NotifyFailSetConfDescr(void) {
function NotifyFailGetDevDescr (line 84) | void NotifyFailGetDevDescr(uint8_t reason) {
function NotifyFailSetDevTblEntry (line 89) | void NotifyFailSetDevTblEntry(uint8_t reason) {
function NotifyFailGetConfDescr (line 95) | void NotifyFailGetConfDescr(uint8_t reason) {
function NotifyFailSetConfDescr (line 100) | void NotifyFailSetConfDescr(uint8_t reason) {
function NotifyFailUnknownDevice (line 105) | void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID) {
function NotifyFail (line 112) | void NotifyFail(uint8_t rcode) {
FILE: lib/usbhost/USB_Host_Shield_2.0/parsetools.h
type MultiValueBuffer (line 23) | struct MultiValueBuffer {
function class (line 28) | class MultiByteValueParser {
function class (line 50) | class ByteSkipper {
function class (line 83) | class PTPListParser {
FILE: lib/usbhost/USB_Host_Shield_2.0/sink_parser.h
function Initialize (line 33) | void Initialize() {
function Parse (line 36) | void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &o...
FILE: lib/usbhost/USB_Host_Shield_2.0/usb_ch9.h
type USB_DEVICE_DESCRIPTOR (line 98) | typedef struct {
type USB_CONFIGURATION_DESCRIPTOR (line 116) | typedef struct {
type USB_INTERFACE_DESCRIPTOR (line 128) | typedef struct {
type USB_ENDPOINT_DESCRIPTOR (line 141) | typedef struct {
type USB_HID_DESCRIPTOR (line 151) | typedef struct {
type HID_CLASS_DESCRIPTOR_LEN_AND_TYPE (line 161) | typedef struct {
FILE: lib/usbhost/USB_Host_Shield_2.0/usbhost.h
function init (line 34) | static void init() {
function init (line 43) | static void init() {
function init (line 47) | static void init() {
function init (line 64) | static void init() {
function init (line 71) | static void init() {
type SPi (line 89) | typedef SPi< Pb1, Pb2, Pb3, Pb0 > spi;
type SPi (line 91) | typedef SPi< Pb5, Pb3, Pb4, Pb2 > spi;
type SPi (line 93) | typedef SPi< Pb7, Pb5, Pb6, Pb4 > spi;
type SPi (line 95) | typedef SPi< P13, P11, P12, P10 > spi;
type SPi (line 97) | typedef SPi< P76, P75, P74, P10 > spi;
type SPi (lin
Copy disabled (too large)
Download .json
Condensed preview — 2378 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (11,394K chars).
[
{
"path": ".clang-format",
"chars": 828,
"preview": "---\nBasedOnStyle: Google\nAlignAfterOpenBracket: Align\nAlignConsecutiveAssignments: 'true'\nAlignConsecutiveDeclarations: "
},
{
"path": ".clangd",
"chars": 259,
"preview": "CompileFlags:\n Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]\n Remove: [-W*, -m"
},
{
"path": ".editorconfig",
"chars": 871,
"preview": "# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs\n# editor"
},
{
"path": ".gitattributes",
"chars": 1903,
"preview": "# auto for anything unspecified\n* text=auto\n\n# sources\n*.c text eol=lf\n*.cc text eol=lf\n*.cxx text eol=lf\n*."
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 1260,
"preview": "name: Bug report\ndescription: Create a report to help us improve QMK Firmware.\ntitle: \"[Bug] \"\nlabels: [\"bug\", \"help wan"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 259,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: QMK Discord\n url: https://discord.gg/qmk\n about: Ask question"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1126,
"preview": "name: Feature request\ndescription: Suggest a new feature or changes to existing features.\ntitle: \"[Feature Request] \"\nla"
},
{
"path": ".github/ISSUE_TEMPLATE/other_issues.yml",
"chars": 932,
"preview": "name: Other issues\ndescription: Anything else that doesn't fall into the above categories.\nlabels: [\"help wanted\", \"ques"
},
{
"path": ".github/ISSUE_TEMPLATE/zzz_blank.md",
"chars": 188,
"preview": "---\nname: Blank issue\nabout: If you're 100% sure that you don't need one of the other issue templates, use\n this one in"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1405,
"preview": "<!--- Provide a general summary of your changes in the title above. -->\n\n<!--- Anything on lines wrapped in comments lik"
},
{
"path": ".github/dependabot.yml",
"chars": 175,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n labels: CI\n reviewers:\n - \"qm"
},
{
"path": ".github/labeler.yml",
"chars": 1205,
"preview": "core:\n - changed-files:\n - any-glob-to-any-file:\n - quantum/**\n - tmk_core/**\n - drivers/**\n - t"
},
{
"path": ".github/workflows/build.yml",
"chars": 647,
"preview": "name: Build firmware\non:\n push:\n paths-ignore:\n - '**.md'\n pull_request:\n paths-ignore:\n - '**.md'\n w"
},
{
"path": ".github/workflows/format.yml",
"chars": 1422,
"preview": "name: PR Lint Format\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - 'drivers/**'\n - 'lib/arm_at"
},
{
"path": ".github/workflows/lint.yml",
"chars": 2280,
"preview": "name: PR Lint keyboards\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - 'keyboards/**'\n\njobs:\n lin"
},
{
"path": ".github/workflows/regen.yml",
"chars": 736,
"preview": "name: PR Regenerate Files\n\npermissions:\n contents: read\n\non:\n pull_request:\n paths:\n - 'data/constants/**'\n -"
},
{
"path": ".github/workflows/unit_test.yml",
"chars": 580,
"preview": "name: Unit Tests\n\npermissions:\n contents: read\n\non:\n push:\n branches:\n - firmware[0-9]+\n pull_request:\n path"
},
{
"path": ".gitignore",
"chars": 1706,
"preview": "# Junk files\n*.bak\n*.swp\n*~\n.DS_Store\n._*\n\n# Merge files\n*.orig\n*.rej\n\n# Build artifacts\n.clang_complete\n.build/\n*.elf\n*"
},
{
"path": ".gitmodules",
"chars": 836,
"preview": "[submodule \"lib/chibios\"]\n\tpath = lib/chibios\n\turl = https://github.com/qmk/ChibiOS\n\tbranch = master\n[submodule \"lib/chi"
},
{
"path": "Doxyfile",
"chars": 8643,
"preview": "# Doxyfile 1.8.14\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org)"
},
{
"path": "LICENSE",
"chars": 18092,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
},
{
"path": "Makefile",
"chars": 18393,
"preview": "ifndef VERBOSE\n.SILENT:\nendif\n\n# Never run this makefile in parallel, as it could screw things up\n# It won't affect the "
},
{
"path": "builddefs/build_full_test.mk",
"chars": 1347,
"preview": "# Copyright 2017 Fred Sundvik\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the te"
},
{
"path": "builddefs/build_json.mk",
"chars": 1989,
"preview": "# Look for a json keymap file\nifneq (\"$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)\",\"\")\n KEYMAP_JSON := $(MAIN_KEYMA"
},
{
"path": "builddefs/build_keyboard.mk",
"chars": 24915,
"preview": "# Determine what keyboard we are building and setup the build environment.\n#\n# We support folders up to 5 levels deep be"
},
{
"path": "builddefs/build_layout.mk",
"chars": 1259,
"preview": "LAYOUTS_PATH := layouts\nLAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/))))\n\nifneq ($(QMK_US"
},
{
"path": "builddefs/build_test.mk",
"chars": 2330,
"preview": "ifndef VERBOSE\n.SILENT:\nendif\n\n.DEFAULT_GOAL := all\n\nOPT = g\n\ninclude paths.mk\ninclude $(BUILDDEFS_PATH)/support.mk\nincl"
},
{
"path": "builddefs/common_features.mk",
"chars": 37748,
"preview": "# Copyright 2017 Fred Sundvik\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the te"
},
{
"path": "builddefs/common_rules.mk",
"chars": 13116,
"preview": "# Hey Emacs, this is a -*- makefile -*-\n#----------------------------------------------------------------------------\n\n#"
},
{
"path": "builddefs/converters.mk",
"chars": 1432,
"preview": "ifneq (,$(filter $(MCU),atmega32u4))\n # TODO: opt in rather than assume everything uses a pro micro\n PIN_COMPATIBL"
},
{
"path": "builddefs/disable_features.mk",
"chars": 766,
"preview": "# Unconditionally disable features that a keyboard advertises it doesn't support\n\nFEATURE_NAMES :=\nFEATURE_NAMES += AUDI"
},
{
"path": "builddefs/docsgen/.gitignore",
"chars": 68,
"preview": "node_modules\n.vitepress/cache\n.vitepress/.temp\n.vitepress/dist\ndocs\n"
},
{
"path": "builddefs/docsgen/.vitepress/config.mts",
"chars": 5609,
"preview": "import { defineConfig } from \"vitepress\";\nimport { tabsMarkdownPlugin } from \"vitepress-plugin-tabs\";\nimport sidebar fro"
},
{
"path": "builddefs/docsgen/.vitepress/theme/QMKLayout.vue",
"chars": 810,
"preview": "<script setup>\nimport DefaultTheme from 'vitepress/theme'\nimport { useRouter } from 'vitepress'\nimport { onBeforeMount }"
},
{
"path": "builddefs/docsgen/.vitepress/theme/custom.css",
"chars": 372,
"preview": "/* Override <kbd> as vitepress doesn't put them with borders */\nkbd {\n border: 1px solid var(--vp-c-text-1);\n bord"
},
{
"path": "builddefs/docsgen/.vitepress/theme/index.ts",
"chars": 348,
"preview": "import type { Theme } from 'vitepress'\nimport DefaultTheme from 'vitepress/theme'\nimport { enhanceAppWithTabs } from 'vi"
},
{
"path": "builddefs/docsgen/build-docs.sh",
"chars": 171,
"preview": "#!/usr/bin/env bash\n\ncd \"$(dirname \"$(realpath \"${BASH_SOURCE[0]}\")\")\"\nyarn install\n[[ -e docs ]] || ln -sf ../../docs d"
},
{
"path": "builddefs/docsgen/package.json",
"chars": 334,
"preview": "{\n \"license\": \"GPL-2.0-or-later\",\n \"devDependencies\": {\n \"vite\": \"^5.4.18\",\n \"vitepress\": \"^1.1.0\",\n \"vitepre"
},
{
"path": "builddefs/docsgen/start-docs.sh",
"chars": 129,
"preview": "#!/usr/bin/env bash\n\ncd \"$(dirname \"$(realpath \"${BASH_SOURCE[0]}\")\")\"\nyarn install\nDEBUG='vitepress:*,vite:*' yarn run "
},
{
"path": "builddefs/generic_features.mk",
"chars": 1968,
"preview": "# Copyright 2021 QMK\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of th"
},
{
"path": "builddefs/message.mk",
"chars": 5819,
"preview": "COLOR ?= true\n\nifeq ($(COLOR),true)\n\tNO_COLOR=\\033[0m\n\tOK_COLOR=\\033[32;01m\n\tERROR_COLOR=\\033[31;01m\n\tWARN_COLOR=\\033[33"
},
{
"path": "builddefs/show_options.mk",
"chars": 3802,
"preview": "BUILD_OPTION_NAMES = \\\n BOOTMAGIC_ENABLE \\\n MOUSEKEY_ENABLE \\\n EXTRAKEY_ENABLE \\\n CONSOLE_ENABLE \\\n COMMAND_ENABLE "
},
{
"path": "builddefs/support.mk",
"chars": 556,
"preview": "# Helper to determine if a compiler option is supported\n# Args:\n# $(1) = option to test, if successful will be output\n"
},
{
"path": "builddefs/testlist.mk",
"chars": 852,
"preview": "TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f -name test.mk)))\nFULL_TESTS := $(notdir"
},
{
"path": "data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson",
"chars": 9384,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ² │ & │ é │ \" │ ' │ ( │ § │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson",
"chars": 15935,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ $ │ \" │ « │ » │ ( │ ) │ @ │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson",
"chars": 9415,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ' │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_canadian_french_0.0.1.hjson",
"chars": 10096,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ # │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson",
"chars": 16418,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ / │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson",
"chars": 7210,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson",
"chars": 10003,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ¸ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson",
"chars": 10794,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ; │ + │ ě │ š │ č │ ř │ ž │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_czech_mac_ansi_0.0.1.hjson",
"chars": 14351,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ \\ │ + │ ě │ š │ č │ ř │ ž │ ý "
},
{
"path": "data/constants/keycodes/extras/keycodes_czech_mac_iso_0.0.1.hjson",
"chars": 14352,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ │ + │ ě │ š │ č │ ř │ ž │ ý "
},
{
"path": "data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson",
"chars": 8976,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ½ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson",
"chars": 7210,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson",
"chars": 7617,
"preview": "{\n \"aliases\": {\n/* Dvorak for the French language\n * Version: 2\n *\n * The layout is designed by Francis Leboutte <dvo"
},
{
"path": "data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson",
"chars": 7238,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ $ │ & │ [ │ { │ } │ ( │ = │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson",
"chars": 9164,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ˇ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson",
"chars": 14843,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_farsi_0.0.1.hjson",
"chars": 15475,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ │ ۱ │ ۲ │ ۳ │ ۴ │ ۵ │ ۶ │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson",
"chars": 8978,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_french_0.0.1.hjson",
"chars": 9201,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ² │ & │ é │ \" │ ' │ ( │ - │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson",
"chars": 16311,
"preview": "{\n \"aliases\": {\n/* French AZERTY - AFNOR NF Z71-300\n *\n * A standard for the French keyboard\n *\n * The project was la"
},
{
"path": "data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson",
"chars": 16431,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ @ │ & │ é │ \" │ ' │ ( │ § │ è "
},
{
"path": "data/constants/keycodes/extras/keycodes_german_0.0.1.hjson",
"chars": 8958,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ^ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson",
"chars": 15912,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ ^ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 "
},
{
"path": "data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson",
"chars": 9761,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson",
"chars": 8734,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ; │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson",
"chars": 10744,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson",
"chars": 8894,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ° │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson",
"chars": 8853,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson",
"chars": 9520,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ \\ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson",
"chars": 16641,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ < │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 "
},
{
"path": "data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson",
"chars": 16651,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ \\ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 "
},
{
"path": "data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson",
"chars": 7949,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐\n * │Z↔H│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson",
"chars": 7408,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson",
"chars": 11297,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson",
"chars": 9371,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ ! │ - │ / │ ; │ : │ , │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson",
"chars": 9694,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ Ą │ Č │ Ę │ Ė │ Į │ Š │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson",
"chars": 4925,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ^ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson",
"chars": 2433,
"preview": "{\n \"aliases\": {\n \"KC_GRV\": {\n \"key\": \"NO_HALF\"\n }\n \"KC_MINS\": {\n \"key\": \"N"
},
{
"path": "data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson",
"chars": 7210,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson",
"chars": 8883,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ | │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson",
"chars": 2022,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ │Num│ │ │ │ │ │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson",
"chars": 1300,
"preview": "{\n \"aliases\": {\n \"DV_1\": {\n \"key\": \"PD_NUM\"\n }\n \"DV_Q\": {\n \"key\": \"PD_LS\"\n"
},
{
"path": "data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson",
"chars": 8846,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson",
"chars": 8882,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ \\ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson",
"chars": 15131,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 "
},
{
"path": "data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson",
"chars": 11446,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ „ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson",
"chars": 7432,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ Ё │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_russian_typewriter_0.0.1.hjson",
"chars": 7465,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ | │ № │ - │ / │ \" │ : │ , │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson",
"chars": 7798,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson",
"chars": 10106,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ‚ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson",
"chars": 10964,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ; │ + │ ľ │ š │ č │ ť │ ž │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson",
"chars": 10003,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ¸ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson",
"chars": 8975,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ º │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson",
"chars": 8975,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ º │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson",
"chars": 8603,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ | │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson",
"chars": 8978,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson",
"chars": 15562,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ < │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 "
},
{
"path": "data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson",
"chars": 15554,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 "
},
{
"path": "data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson",
"chars": 15562,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ < │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 "
},
{
"path": "data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson",
"chars": 15554,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐\n * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 "
},
{
"path": "data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson",
"chars": 9436,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson",
"chars": 9436,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson",
"chars": 12203,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ + │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson",
"chars": 9343,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ \" │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson",
"chars": 8754,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson",
"chars": 7517,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ' │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_us_0.0.1.hjson",
"chars": 3962,
"preview": "{\n \"aliases\": {\n/* Shifted symbols\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ~ │ ! │ @ │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson",
"chars": 14763,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson",
"chars": 12824,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson",
"chars": 14496,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson",
"chars": 7210,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson",
"chars": 7210,
"preview": "{\n \"aliases\": {\n/*\n * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐\n * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ "
},
{
"path": "data/constants/keycodes/keycodes_0.0.1.hjson",
"chars": 2313,
"preview": "{\n \"ranges\": {\n \"0x0000/0x00FF\": {\n \"define\": \"QK_BASIC\"\n },\n \"0x0100/0x1EFF\": {\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_audio.hjson",
"chars": 2507,
"preview": "{\n \"keycodes\": {\n \"0x7480\": {\n \"group\": \"audio\",\n \"key\": \"QK_AUDIO_ON\",\n \"ali"
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_basic.hjson",
"chars": 36257,
"preview": "{\n \"keycodes\": {\n \"0x0000\": {\n \"group\": \"internal\",\n \"key\": \"KC_NO\",\n \"label\""
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_joystick.hjson",
"chars": 5479,
"preview": "{\n \"keycodes\": {\n \"0x7400\": {\n \"group\": \"joystick\",\n \"key\": \"QK_JOYSTICK_BUTTON_0\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_lighting.hjson",
"chars": 3966,
"preview": "{\n \"keycodes\": {\n \"0x7800\": {\n \"group\": \"backlight\",\n \"key\": \"QK_BACKLIGHT_ON\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_macro.hjson",
"chars": 5064,
"preview": "{\n \"keycodes\": {\n\n \"0x7700\": {\n \"group\": \"macro\",\n \"key\": \"QK_MACRO_0\",\n \"ali"
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_magic.hjson",
"chars": 6007,
"preview": "{\n \"keycodes\": {\n \"0x7000\": {\n \"group\": \"magic\",\n \"key\": \"MAGIC_SWAP_CONTROL_CAPSLOCK\",\n"
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_midi.hjson",
"chars": 24580,
"preview": "{\n \"keycodes\": {\n \"0x7100\": {\n \"group\": \"midi\",\n \"key\": \"QK_MIDI_ON\",\n \"alias"
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson",
"chars": 5961,
"preview": "{\n \"keycodes\": {\n \"0x7440\": {\n \"group\": \"programmable_button\",\n \"key\": \"QK_PROGRAMMABLE_"
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_quantum.hjson",
"chars": 12079,
"preview": "{\n \"keycodes\": {\n \"0x7C00\": {\n \"group\": \"quantum\",\n \"key\": \"QK_BOOTLOADER\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_sequencer.hjson",
"chars": 869,
"preview": "{\n \"keycodes\": {\n \"0x7200\": {\n \"group\": \"sequencer\",\n \"key\": \"SQ_ON\"\n },\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_steno.hjson",
"chars": 417,
"preview": "{\n \"keycodes\": {\n \"0x74F0\": {\n \"group\": \"steno\",\n \"key\": \"QK_STENO_BOLT\"\n },\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.1_swap_hands.hjson",
"chars": 682,
"preview": "{\n \"keycodes\": {\n \"0x56F0\": {\n \"group\": \"swap_hands\",\n \"key\": \"SH_TG\"\n },\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.2.hjson",
"chars": 395,
"preview": "{\n \"ranges\": {\n \"0x7E00/0x00FF\": \"!delete!\",\n \"0x7F00/0x00FF\": \"!delete!\",\n\n \"0x7E00/0x003F\": {\n"
},
{
"path": "data/constants/keycodes/keycodes_0.0.2_basic.hjson",
"chars": 439,
"preview": "{\n \"keycodes\": {\n \"0x00C1\": {\n \"group\": \"media\",\n \"key\": \"KC_MISSION_CONTROL\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.2_kb.hjson",
"chars": 2834,
"preview": "{\n \"keycodes\": {\n \"0x7E00\": {\n \"group\": \"kb\",\n \"key\": \"QK_KB_0\"\n },\n \"0x7E"
},
{
"path": "data/constants/keycodes/keycodes_0.0.2_magic.hjson",
"chars": 6139,
"preview": "{\n \"keycodes\": {\n \"!reset!\":0,\n\n \"0x7000\": {\n \"group\": \"magic\",\n \"key\": \"QK_MAGIC"
},
{
"path": "data/constants/keycodes/keycodes_0.0.2_midi.hjson",
"chars": 24602,
"preview": "{\n \"keycodes\": {\n \"!reset!\":0,\n\n \"0x7100\": {\n \"group\": \"midi\",\n \"key\": \"QK_MIDI_O"
},
{
"path": "data/constants/keycodes/keycodes_0.0.2_quantum.hjson",
"chars": 365,
"preview": "{\n \"keycodes\": {\n \"0x7C77\": {\n \"group\": \"quantum\",\n \"key\": \"QK_TRI_LAYER_LOWER\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.2_sequencer.hjson",
"chars": 1617,
"preview": "{\n \"keycodes\": {\n \"!reset!\":0,\n\n \"0x7200\": {\n \"group\": \"sequencer\",\n \"key\": \"QK_S"
},
{
"path": "data/constants/keycodes/keycodes_0.0.2_swap_hands.hjson",
"chars": 1249,
"preview": "{\n \"keycodes\": {\n \"0x56F0\": {\n \"group\": \"swap_hands\",\n \"key\": \"QK_SWAP_HANDS_TOGGLE\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.2_user.hjson",
"chars": 2962,
"preview": "{\n \"keycodes\": {\n \"0x7E40\": {\n \"group\": \"user\",\n \"key\": \"QK_USER_0\"\n },\n \""
},
{
"path": "data/constants/keycodes/keycodes_0.0.3.hjson",
"chars": 0,
"preview": ""
},
{
"path": "data/constants/keycodes/keycodes_0.0.3_quantum.hjson",
"chars": 357,
"preview": "{\n \"keycodes\": {\n \"0x7C79\": {\n \"group\": \"quantum\",\n \"key\": \"QK_REPEAT_KEY\",\n \""
},
{
"path": "data/constants/keycodes/keycodes_0.0.4.hjson",
"chars": 191,
"preview": "{\n \"keycodes\": {\n \"0x7C7B\": {\n \"group\": \"quantum\",\n \"key\": \"QK_LAYER_LOCK\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.4_lighting.hjson",
"chars": 5895,
"preview": "{\n \"keycodes\": {\n \"0x7810\": {\n \"group\": \"led_matrix\",\n \"key\": \"QK_LED_MATRIX_ON\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.4_quantum.hjson",
"chars": 0,
"preview": ""
},
{
"path": "data/constants/keycodes/keycodes_0.0.5.hjson",
"chars": 0,
"preview": ""
},
{
"path": "data/constants/keycodes/keycodes_0.0.5_basic.hjson",
"chars": 4526,
"preview": "{\n \"keycodes\": {\n \"0x00CD\": {\n \"group\": \"mouse\",\n \"key\": \"QK_MOUSE_CURSOR_UP\",\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.6.hjson",
"chars": 111,
"preview": "{\n \"ranges\": {\n \"0x52E0/0x001F\": {\n \"define\": \"QK_PERSISTENT_DEF_LAYER\"\n }\n }\n}\n"
},
{
"path": "data/constants/keycodes/keycodes_0.0.6_connection.hjson",
"chars": 2710,
"preview": "{\n \"ranges\": {\n \"0x7780/0x003F\": {\n \"define\": \"QK_CONNECTION\"\n }\n }\n \"keycodes\": {\n "
},
{
"path": "data/constants/keycodes/keycodes_0.0.6_quantum.hjson",
"chars": 351,
"preview": "{\n \"keycodes\": {\n \"0x7C20\": \"!delete!\", // old QK_OUTPUT_AUTO\n \"0x7C21\": \"!delete!\", // old QK_OUTPUT_U"
},
{
"path": "data/constants/keycodes/keycodes_0.0.7.hjson",
"chars": 107,
"preview": "{\n \"ranges\": {\n \"0x77C0/0x003F\": {\n \"define\": \"QK_COMMUNITY_MODULE\"\n }\n }\n}\n"
},
{
"path": "data/constants/module_hooks/0.1.0.hjson",
"chars": 580,
"preview": "{\n keyboard_pre_init: {\n ret_type: void\n args: void\n }\n keyboard_post_init: {\n ret_type: v"
},
{
"path": "data/constants/module_hooks/1.0.0.hjson",
"chars": 539,
"preview": "{\n housekeeping_task: {\n ret_type: void\n args: void\n }\n suspend_power_down: {\n ret_type: v"
},
{
"path": "data/constants/module_hooks/1.1.0.hjson",
"chars": 1481,
"preview": "{\n pointing_device_init: {\n ret_type: void\n args: void\n guard: defined(POINTING_DEVICE_ENABLE)\n "
},
{
"path": "data/constants/module_hooks/1.1.1.hjson",
"chars": 78,
"preview": "{\n // This version exists to signify addition of LED/RGB effect support.\n}\n"
},
{
"path": "data/mappings/defaults.hjson",
"chars": 2614,
"preview": "{\n \"development_board\": {\n \"bit_c_pro\": {\n \"board\": \"QMK_PM2040\",\n \"bootloader\": \"rp2040"
},
{
"path": "data/mappings/info_config.hjson",
"chars": 18616,
"preview": "// This file maps keys between `config.h` and `info.json`. It is used by QMK\n// to correctly and consistently map back a"
},
{
"path": "data/mappings/info_defaults.hjson",
"chars": 1557,
"preview": "{\n \"bootmagic\": {\n \"matrix\": [0, 0]\n },\n \"backlight\": {\n \"default\": {\n \"on\": true\n "
},
{
"path": "data/mappings/info_rules.hjson",
"chars": 4059,
"preview": "// This file maps keys between `rules.mk` and `info.json`. It is used by QMK\n// to correctly and consistently map back a"
},
{
"path": "data/mappings/keyboard_aliases.hjson",
"chars": 1302,
"preview": "{\n // Format for each entry:\n // \"<alias>\": {\n // \"target\": \"<keyboard_folder>\"\n // }\n //\n\n /* Thi"
},
{
"path": "data/schemas/api_keyboard.jsonschema",
"chars": 733,
"preview": "{\n \"$id\": \"qmk.api.keyboard.v1\",\n \"allOf\": [\n {\"$ref\": \"./keyboard.jsonschema#\"},\n {\n \"pr"
},
{
"path": "data/schemas/community_module.jsonschema",
"chars": 687,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema#\",\n \"$id\": \"qmk.community_module.v1\",\n \"title\": \"Co"
},
{
"path": "data/schemas/definitions.jsonschema",
"chars": 5198,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema#\",\n \"$id\": \"qmk.definitions.v1\",\n \"title\": \"Common "
},
{
"path": "data/schemas/keyboard.jsonschema",
"chars": 42343,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema#\",\n \"$id\": \"qmk.keyboard.v1\",\n \"title\": \"Keyboard I"
},
{
"path": "data/schemas/keycodes.jsonschema",
"chars": 1557,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema#\",\n \"$id\": \"qmk.keycodes.v1\",\n \"title\": \"Keycode In"
},
{
"path": "data/schemas/keymap.jsonschema",
"chars": 2814,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema#\",\n \"$id\": \"qmk.keymap.v1\",\n \"title\": \"Keymap Infor"
},
{
"path": "data/schemas/user_repo_v0.jsonschema",
"chars": 314,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema#\",\n \"$id\": \"qmk.user_repo.v0\",\n \"title\": \"User Repo"
},
{
"path": "data/schemas/user_repo_v1.jsonschema",
"chars": 772,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema#\",\n \"$id\": \"qmk.user_repo.v1\",\n \"title\": \"User Repo"
},
{
"path": "data/schemas/user_repo_v1_1.jsonschema",
"chars": 849,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema#\",\n \"$id\": \"qmk.user_repo.v1_1\",\n \"title\": \"User Re"
},
{
"path": "data/templates/api/readme.md",
"chars": 271,
"preview": "# QMK Keyboard Metadata\n\nThis directory contains machine parsable data about keyboards supported by QMK. The latest vers"
},
{
"path": "data/templates/config-overrides/chibios/board.h",
"chars": 769,
"preview": "/* Copyright 2020 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * i"
},
{
"path": "data/templates/config-overrides/chibios/chconf.h",
"chars": 781,
"preview": "/* Copyright 2020 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * i"
},
{
"path": "data/templates/config-overrides/chibios/halconf.h",
"chars": 772,
"preview": "/* Copyright 2020 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * i"
},
{
"path": "data/templates/config-overrides/chibios/mcuconf.h",
"chars": 807,
"preview": "/* Copyright 2020 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * i"
},
{
"path": "data/templates/config-overrides/common/lv_conf.h",
"chars": 216,
"preview": "// Copyright 2022 Nick Brassel (@tzarc)\n// SPDX-License-Identifier: GPL-2.0-or-later\n#pragma once\n\n// #define LV_DITHER_"
},
{
"path": "data/templates/keyboard/keyboard.json",
"chars": 444,
"preview": "{\n \"keyboard_name\": \"%KEYBOARD%\",\n \"maintainer\": \"%USER_NAME%\",\n \"manufacturer\": \"%REAL_NAME%\",\n \"diode_dire"
},
{
"path": "data/templates/keyboard/readme.md",
"chars": 1121,
"preview": "# %KEYBOARD%\n\n\n\n*A short description of the keyboard/project*\n\n* Keyboard Main"
},
{
"path": "doxygen-todo",
"chars": 278,
"preview": "tmk_core/protocol\ntmk_core/protocol/chibios\ntmk_core/protocol/lufa\ntmk_core/protocol/midi\ntmk_core/protocol/midi/byteque"
},
{
"path": "drivers/backlight/backlight_software.c",
"chars": 1365,
"preview": "#include \"backlight.h\"\n#include \"backlight_driver_common.h\"\n#include \"util.h\"\n\n#ifdef BACKLIGHT_BREATHING\n# error \"Ba"
},
{
"path": "drivers/battery/battery.c",
"chars": 988,
"preview": "// Copyright 2025 QMK\n// SPDX-License-Identifier: GPL-2.0-or-later\n\n#include \"battery_driver.h\"\n#include \"battery.h\"\n#in"
},
{
"path": "drivers/battery/battery.h",
"chars": 732,
"preview": "// Copyright 2025 QMK\n// SPDX-License-Identifier: GPL-2.0-or-later\n\n#pragma once\n\n#include <stdint.h>\n\n/**\n * \\file\n *\n "
},
{
"path": "drivers/battery/battery_adc.c",
"chars": 1368,
"preview": "// Copyright 2025 QMK\n// SPDX-License-Identifier: GPL-2.0-or-later\n\n#include \"analog.h\"\n#include \"gpio.h\"\n\n#ifndef BATTE"
},
{
"path": "drivers/battery/battery_driver.h",
"chars": 537,
"preview": "// Copyright 2025 QMK\n// SPDX-License-Identifier: GPL-2.0-or-later\n\n#pragma once\n\n#include <stdint.h>\n\n/**\n * \\file\n *\n "
},
{
"path": "drivers/bluetooth/bluefruit_le.cpp",
"chars": 20165,
"preview": "#include \"bluefruit_le.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <alloca.h>\n#include \"debug.h\"\n#include \"timer"
},
{
"path": "drivers/bluetooth/bluefruit_le.h",
"chars": 1544,
"preview": "/* Bluetooth Low Energy Protocol for QMK.\n * Author: Wez Furlong, 2016\n * Supports the Adafruit BLE board built around t"
},
{
"path": "drivers/bluetooth/bluetooth.c",
"chars": 889,
"preview": "// Copyright 2025 QMK\n// SPDX-License-Identifier: GPL-2.0-or-later\n\n#include \"bluetooth.h\"\n\n__attribute__((weak)) void b"
},
{
"path": "drivers/bluetooth/bluetooth.h",
"chars": 2161,
"preview": "/*\n * Copyright 2022\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of"
},
{
"path": "drivers/bluetooth/bluetooth_drivers.c",
"chars": 1865,
"preview": "/*\n * Copyright 2022\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of"
},
{
"path": "drivers/bluetooth/outputselect.h",
"chars": 1078,
"preview": "/*\nCopyright 2017 Priyadi Iman Nurcahyo\nThis program is free software: you can redistribute it and/or modify\nit under th"
},
{
"path": "drivers/bluetooth/ringbuffer.hpp",
"chars": 1259,
"preview": "#pragma once\n// A simple ringbuffer holding Size elements of type T\ntemplate <typename T, uint8_t Size>\nclass RingBuffer"
},
{
"path": "drivers/bluetooth/rn42.c",
"chars": 2835,
"preview": "/* Copyright 2021\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of th"
},
{
"path": "drivers/bluetooth/rn42.h",
"chars": 878,
"preview": "/* Copyright 2021\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of th"
},
{
"path": "drivers/eeprom/eeprom_custom.c-template",
"chars": 1856,
"preview": "/* Copyright 2019 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_driver.c",
"chars": 2454,
"preview": "/* Copyright 2019 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_driver.h",
"chars": 851,
"preview": "/* Copyright 2019 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_i2c.c",
"chars": 5194,
"preview": "/* Copyright 2019 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_i2c.h",
"chars": 4383,
"preview": "/* Copyright 2019 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_spi.c",
"chars": 6777,
"preview": "/* Copyright 2020 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_spi.h",
"chars": 2903,
"preview": "/* Copyright 2020 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_transient.c",
"chars": 1931,
"preview": "/* Copyright 2019 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_transient.h",
"chars": 993,
"preview": "/* Copyright 2019 Nick Brassel (tzarc)\n *\n * This program is free software: you can redistribute it and/or modify\n * it "
},
{
"path": "drivers/eeprom/eeprom_wear_leveling.c",
"chars": 719,
"preview": "// Copyright 2022 Nick Brassel (@tzarc)\n// SPDX-License-Identifier: GPL-2.0-or-later\n#include <stdint.h>\n#include <strin"
}
]
// ... and 2178 more files (download for full content)
About this extraction
This page contains the full source code of the zsa/qmk_firmware GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2378 files (9.8 MB), approximately 2.7M tokens, and a symbol index with 6659 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.