Compare commits

...
Author SHA1 Message Date
QMK Bot 2957f60dc1 Merge remote-tracking branch 'origin/master' into develop 2022-03-24 20:14:36 +00:00
Simon dc9eb21332 add the ability to change the pwm frequency for the IS31FL3737B (#16718) 2022-03-24 18:08:22 +00:00
QMK Bot 706bceeff8 Merge remote-tracking branch 'origin/master' into develop 2022-03-24 17:02:32 +00:00
QMK Bot 1ac1f92000 Merge remote-tracking branch 'origin/master' into develop 2022-03-24 05:24:12 +00:00
QMK Bot 7e69348335 Merge remote-tracking branch 'origin/master' into develop 2022-03-23 18:43:36 +00:00
QMK Bot 5342caf172 Merge remote-tracking branch 'origin/master' into develop 2022-03-23 16:40:54 +00:00
QMK Bot eca8782b54 Merge remote-tracking branch 'origin/master' into develop 2022-03-23 06:02:29 +00:00
QMK Bot 5ee6f9c9c1 Merge remote-tracking branch 'origin/master' into develop 2022-03-23 05:07:00 +00:00
QMK Bot dae932fc31 Merge remote-tracking branch 'origin/master' into develop 2022-03-22 16:39:32 +00:00
Joel Challis 23f365f8bc Ignore transport defaults if SPLIT_KEYBOARD is unset (#16706)
* Ignore transport defaults if SPLIT_KEYBOARD is unset

* keep exists check
2022-03-22 10:48:13 +00:00
Joel Challis 4f8cc32cf5 Extend 'qmk info' to handle keymap level overrides (#16702) 2022-03-21 11:57:41 +01:00
QMK Bot aea9005236 Merge remote-tracking branch 'origin/master' into develop 2022-03-21 08:06:10 +00:00
QMK Bot b19d7399ca Merge remote-tracking branch 'origin/master' into develop 2022-03-20 17:24:36 +00:00
QMK Bot 9216dd3917 Merge remote-tracking branch 'origin/master' into develop 2022-03-20 17:06:27 +00:00
QMK Bot 4dae5ff37d Merge remote-tracking branch 'origin/master' into develop 2022-03-20 17:03:16 +00:00
Ryan cfe28937d5 MS Sculpt Mobile refactor (#16038) 2022-03-20 15:19:46 +11:00
QMK Bot 729d7c2b2e Merge remote-tracking branch 'origin/master' into develop 2022-03-19 20:59:03 +00:00
QMK Bot 223bc47658 Merge remote-tracking branch 'origin/master' into develop 2022-03-19 17:41:15 +00:00
QMK Bot 5dcee0199e Merge remote-tracking branch 'origin/master' into develop 2022-03-19 16:38:09 +00:00
QMK Bot 32d6c122e9 Merge remote-tracking branch 'origin/master' into develop 2022-03-19 11:53:10 +00:00
QMK Bot 98e783cc3c Format code according to conventions (#16686) 2022-03-19 11:52:03 +00:00
Ryan 9ee2effe8e HD44780 driver rework (#16370) 2022-03-19 17:57:22 +11:00
QMK Bot 86b5c6b5c3 Merge remote-tracking branch 'origin/master' into develop 2022-03-19 06:53:09 +00:00
QMK Bot c39eeaa1c8 Merge remote-tracking branch 'origin/master' into develop 2022-03-18 18:49:56 +00:00
QMK Bot a900f9251a Merge remote-tracking branch 'origin/master' into develop 2022-03-18 17:25:20 +00:00
QMK Bot 3a08deb7fe Merge remote-tracking branch 'origin/master' into develop 2022-03-18 16:02:57 +00:00
zvecr bffb209eee Merge remote-tracking branch 'origin/master' into develop 2022-03-18 01:15:23 +00:00
02655690f4 [Core] Add compile/make macro to core (#15959)
* [Core] Add KC_MAKE keycode to core

fix linting

fix testing error

work around test idiocyncracies

fix more lint

something something stupid tests

add doc

* updates based on feedback

* Add bad names

* Fixup docs

* semantics but cleaner

Co-authored-by: precondition <57645186+precondition@users.noreply.github.com>

* Hide oneshot checks behind preprocessors

* Move no-compile option around

* Fix formatting

* make shift optional

* Make opt in

* fix formatting

* update send string function name

Co-authored-by: Joel Challis <git@zvecr.com>

Co-authored-by: precondition <57645186+precondition@users.noreply.github.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2022-03-17 21:19:34 +00:00
QMK Bot 2749346a53 Merge remote-tracking branch 'origin/master' into develop 2022-03-16 23:45:35 +00:00
QMK Bot 4e863dbdef Merge remote-tracking branch 'origin/master' into develop 2022-03-16 15:34:51 +00:00
QMK Bot 024bda1dd3 Merge remote-tracking branch 'origin/master' into develop 2022-03-16 04:09:30 +00:00
QMK Bot 78f7c7bb0d Merge remote-tracking branch 'origin/master' into develop 2022-03-16 03:58:24 +00:00
QMK Bot d802e1c805 Merge remote-tracking branch 'origin/master' into develop 2022-03-16 03:15:02 +00:00
QMK Bot db6d432d6a Merge remote-tracking branch 'origin/master' into develop 2022-03-16 03:13:51 +00:00
QMK Bot b2e870e4a2 Merge remote-tracking branch 'origin/master' into develop 2022-03-16 00:07:19 +00:00
QMK Bot 919df5934b Merge remote-tracking branch 'origin/master' into develop 2022-03-15 23:28:31 +00:00
QMK Bot d37ed07c47 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 22:58:50 +00:00
QMK Bot 8e1f505ab2 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 22:49:10 +00:00
QMK Bot 5f817a1d7f Merge remote-tracking branch 'origin/master' into develop 2022-03-15 13:57:46 +00:00
QMK Bot 872b521e4f Merge remote-tracking branch 'origin/master' into develop 2022-03-15 12:50:04 +00:00
QMK Bot 3315894269 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 09:35:53 +00:00
QMK Bot 1335d205f4 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 08:35:53 +00:00
QMK Bot 037c5b5496 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 08:31:53 +00:00
QMK Bot af5fe7fb75 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 08:30:10 +00:00
QMK Bot 38a257e666 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 07:28:59 +00:00
QMK Bot e784dc79a6 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 04:03:24 +00:00
QMK Bot 34ce1353f1 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 04:01:31 +00:00
QMK Bot e9783df2c5 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 03:56:19 +00:00
QMK Bot 4be80cadac Merge remote-tracking branch 'origin/master' into develop 2022-03-15 01:57:00 +00:00
Ryan 2d9c3f9a89 Add SN74x154 driver and convert AL1 custom matrix (#16331) 2022-03-15 11:38:53 +11:00
QMK Bot 588abd24b5 Merge remote-tracking branch 'origin/master' into develop 2022-03-15 00:24:37 +00:00
QMK Bot 9e39b99a0e Merge remote-tracking branch 'origin/master' into develop 2022-03-14 22:21:34 +00:00
QMK Bot 6f98a67eda Merge remote-tracking branch 'origin/master' into develop 2022-03-14 22:06:16 +00:00
Stefan Kerkmann 7e669421f8 Rename TICK to TICK_EVENT to prevent naming conflicts (#16649) 2022-03-14 20:06:21 +00:00
QMK Bot 2648a7a125 Merge remote-tracking branch 'origin/master' into develop 2022-03-14 18:08:44 +00:00
QMK Bot 1d1d7c388d Merge remote-tracking branch 'origin/master' into develop 2022-03-14 13:58:40 +00:00
QMK Bot cd2fca667b Merge remote-tracking branch 'origin/master' into develop 2022-03-14 01:57:26 +00:00
jack 86a35483a1 Mousekeys fix (#16640) 2022-03-13 18:53:53 -07:00
Drashna Jaelre b8574efcd6 Fix oneshot toggle logic (#16630)
* Fix oneshot toggle logic

* Enable oneshots by default

* Decrement eeconfig magic number due to eeconfig changes
2022-03-14 01:11:42 +00:00
QMK Bot 42d084d1c0 Merge remote-tracking branch 'origin/master' into develop 2022-03-14 01:04:40 +00:00
Drashna Jaelre 921b9dad6c [Core] Move has_mouse_report_changed function to report.c (#16543)
* Move 'has_mouse_report_changed' checkto report.c

* change mousekeys to use memcpy

* fix linting issues
2022-03-14 00:01:47 +00:00
QMK Bot cc9a2aef0f Merge remote-tracking branch 'origin/master' into develop 2022-03-13 23:56:16 +00:00
QMK Bot 5eb3fc255b Merge remote-tracking branch 'origin/master' into develop 2022-03-13 23:55:18 +00:00
QMK Bot 338cf71ee9 Merge remote-tracking branch 'origin/master' into develop 2022-03-13 23:46:46 +00:00
QMK Bot 3f83a21383 Merge remote-tracking branch 'origin/master' into develop 2022-03-13 21:50:20 +00:00
QMK Bot 2df28c1850 Merge remote-tracking branch 'origin/master' into develop 2022-03-13 17:31:22 +00:00
QMK Bot e226a70adc Merge remote-tracking branch 'origin/master' into develop 2022-03-13 13:57:24 +00:00
QMK Bot 16fab460fd Merge remote-tracking branch 'origin/master' into develop 2022-03-13 10:10:03 +00:00
QMK Bot 8ff2497384 Merge remote-tracking branch 'origin/master' into develop 2022-03-13 10:09:12 +00:00
QMK Bot 55b53006a5 Merge remote-tracking branch 'origin/master' into develop 2022-03-13 07:37:55 +00:00
QMK Bot ebe87aa67e Merge remote-tracking branch 'origin/master' into develop 2022-03-13 07:36:50 +00:00
QMK Bot 4281beb1de Merge remote-tracking branch 'origin/master' into develop 2022-03-12 12:42:55 +00:00
Joel Challis dd32cdf527 Redo workaround for pin_def errors on KINETIS (#16620)
* Redo workaround for pin_def errors on KINETIS

* Redo workaround for pin_def errors on KINETIS
2022-03-11 18:50:59 +00:00
Pascal Getreuer 0eb42e042c Fix flipped One Shot logic (#16617) 2022-03-11 13:28:52 +00:00
Joel Challis 1833e65370 Workaround for pin_def errors on KINETIS (#16614) 2022-03-11 13:27:29 +00:00
QMK Bot 0015ebad47 Merge remote-tracking branch 'origin/master' into develop 2022-03-11 13:26:21 +00:00
QMK Bot e3404d21fe Merge remote-tracking branch 'origin/master' into develop 2022-03-11 05:03:12 +00:00
Joel Challis 7e6f1c9e08 Force platform pin defs to be included (#16611)
* Force platform pin defs to be included

* Always grab first header
2022-03-10 23:53:16 +00:00
QMK Bot e9458fd694 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 23:28:26 +00:00
QMK Bot 31eb82c911 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 21:34:11 +00:00
QMK Bot 54658a3687 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 20:49:07 +00:00
QMK Bot 27cde5f4c2 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 20:42:00 +00:00
QMK Bot 83f757f8f0 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 20:22:41 +00:00
QMK Bot ee6a0e8744 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 20:08:54 +00:00
QMK Bot 35fa0f23a5 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 19:10:42 +00:00
QMK Bot cf44bde909 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 12:18:47 +00:00
QMK Bot cb65c7755e Merge remote-tracking branch 'origin/master' into develop 2022-03-10 07:36:31 +00:00
QMK Bot a8b01dc5de Merge remote-tracking branch 'origin/master' into develop 2022-03-10 04:15:19 +00:00
QMK Bot 876c5201b9 Merge remote-tracking branch 'origin/master' into develop 2022-03-10 03:57:12 +00:00
QMK Bot 62696e82cd Merge remote-tracking branch 'origin/master' into develop 2022-03-10 03:47:09 +00:00
QMK Bot 0f22bccb3f Merge remote-tracking branch 'origin/master' into develop 2022-03-09 22:05:21 +00:00
QMK Bot 6f1793d486 Merge remote-tracking branch 'origin/master' into develop 2022-03-09 21:48:28 +00:00
Nick Brassel edd1f33013 Missed some erroneous prints. (#16597) 2022-03-10 05:43:12 +11:00
Nick Brassel 77180a6649 Fixup builds. (#16596) 2022-03-09 17:09:38 +00:00
Nick Brassel 5d67c4d908 Fix missing definition for non-encoder case. (#16593) 2022-03-09 21:06:33 +11:00
Nick Brassel 8d5eacb7dd Add support for encoder mapping. (#13286) 2022-03-09 19:29:00 +11:00
QMK Bot 7121a228eb Merge remote-tracking branch 'origin/master' into develop 2022-03-09 05:49:59 +00:00
QMK Bot 4d5e532068 Merge remote-tracking branch 'origin/master' into develop 2022-03-09 01:36:07 +00:00
QMK Bot eedbb9ae64 Merge remote-tracking branch 'origin/master' into develop 2022-03-09 01:35:15 +00:00
QMK Bot c5b11978c7 Merge remote-tracking branch 'origin/master' into develop 2022-03-09 01:25:30 +00:00
QMK Bot c349e85956 Merge remote-tracking branch 'origin/master' into develop 2022-03-09 00:38:10 +00:00
QMK Bot 41225620c2 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 22:08:38 +00:00
QMK Bot 7f8f66512c Merge remote-tracking branch 'origin/master' into develop 2022-03-08 22:07:48 +00:00
QMK Bot d4bf9b1cc1 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 21:24:38 +00:00
QMK Bot 49bc3b530b Merge remote-tracking branch 'origin/master' into develop 2022-03-08 20:46:24 +00:00
QMK Bot fba3820405 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 18:57:21 +00:00
QMK Bot 0d428b9b39 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 17:03:41 +00:00
QMK Bot 68a62b99a2 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 16:48:29 +00:00
Nick Brassel 2f6751e48a Asymmetric encoders, encoder tests. (#16068) 2022-03-08 16:58:05 +11:00
QMK Bot 2218690d0b Merge remote-tracking branch 'origin/master' into develop 2022-03-08 05:50:04 +00:00
QMK Bot 212e820ff1 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 05:31:24 +00:00
QMK Bot 18bfbc93ab Merge remote-tracking branch 'origin/master' into develop 2022-03-08 04:24:07 +00:00
QMK Bot e0fbb07129 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 04:20:15 +00:00
QMK Bot 1d5b462da2 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 04:19:07 +00:00
QMK Bot e71f8f89d2 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 04:17:05 +00:00
QMK Bot b5996bf793 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 04:10:36 +00:00
QMK Bot b6000e0fe5 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 04:00:30 +00:00
QMK Bot 0cf1186f8d Merge remote-tracking branch 'origin/master' into develop 2022-03-08 03:46:20 +00:00
QMK Bot b069002e61 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 03:41:21 +00:00
QMK Bot 280bea87a6 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 03:40:42 +00:00
QMK Bot 9237326664 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 03:02:26 +00:00
QMK Bot 2d985687a9 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 03:01:10 +00:00
QMK Bot 7bc8046f9a Merge remote-tracking branch 'origin/master' into develop 2022-03-08 02:50:36 +00:00
QMK Bot 26372c81ad Merge remote-tracking branch 'origin/master' into develop 2022-03-08 02:47:28 +00:00
QMK Bot c0a7ecb0e1 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 02:45:59 +00:00
QMK Bot 4666dfb0b0 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 02:45:19 +00:00
QMK Bot dfb0f9f6a5 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 02:41:16 +00:00
QMK Bot 05cc707d96 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 02:29:47 +00:00
QMK Bot 347bab7c35 Merge remote-tracking branch 'origin/master' into develop 2022-03-08 02:18:07 +00:00
QMK Bot 184a0942ff Merge remote-tracking branch 'origin/master' into develop 2022-03-08 01:13:33 +00:00
Ryan 07ca35decf Convert Wasdat Code custom matrix to SN74x138 driver (#16257) 2022-03-08 10:02:28 +11:00
QMK Bot e41d67b428 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 17:06:14 +00:00
Stefan Kerkmann 2bface8f89 Add flash target for UF2 bootloaders (#16525) 2022-03-07 08:59:06 -08:00
jack 05b7193651 [Keyboard] remove unecessary layers (#16559) 2022-03-07 08:43:17 -08:00
QMK Bot 51c9988341 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 11:23:50 +00:00
Ryan 75544d9127 Move Doxygen docs to subdirectory (#16561) 2022-03-07 11:22:22 +00:00
Nick Brassel 44f1bd9b3a ChibiOS 21.11.1 update. (#16251)
* ChibiOS 21.11.1 update.

* `uf2-tinyuf2` => `tinyuf2`

* Updated chibios-contrib, fixup preprocessor for tinyuf2 bootloader.

* Fixup keychron L433 boards.

* Makefile cleanup.

* RISC-V build fixes.

* Fixup RISC-V build.
2022-03-07 21:04:22 +11:00
QMK Bot 5de515526d Merge remote-tracking branch 'origin/master' into develop 2022-03-07 07:17:24 +00:00
QMK Bot e4d51c91b9 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 07:03:07 +00:00
QMK Bot a6126c5853 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 07:00:03 +00:00
QMK Bot 827f32b3ad Merge remote-tracking branch 'origin/master' into develop 2022-03-07 06:59:06 +00:00
QMK Bot c09e8bbf42 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 06:58:38 +00:00
QMK Bot b28d8fcb07 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 06:56:26 +00:00
xiao c810d8cc1b [Keyboard] Update Wakizashi 40 config and readme (#16505) 2022-03-06 22:53:41 -08:00
QMK Bot 575e3e18f5 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 06:53:17 +00:00
QMK Bot 91a6e6245b Merge remote-tracking branch 'origin/master' into develop 2022-03-07 06:41:46 +00:00
QMK Bot 99edf15a69 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 06:12:48 +00:00
QMK Bot f9df57b722 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 04:55:54 +00:00
QMK Bot 0fd600d6df Merge remote-tracking branch 'origin/master' into develop 2022-03-07 03:37:00 +00:00
QMK Bot 8e7cb28c4f Merge remote-tracking branch 'origin/master' into develop 2022-03-07 03:30:45 +00:00
QMK Bot 45929ca657 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 03:28:12 +00:00
QMK Bot bca565cfaa Merge remote-tracking branch 'origin/master' into develop 2022-03-07 03:27:36 +00:00
QMK Bot f8fb772f53 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 03:26:51 +00:00
QMK Bot 9bf9adb578 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 03:03:14 +00:00
QMK Bot 6425dd1710 Merge remote-tracking branch 'origin/master' into develop 2022-03-07 03:02:37 +00:00
QMK Bot 0f9849ca68 Merge remote-tracking branch 'origin/master' into develop 2022-03-06 21:58:55 +00:00
QMK Bot 621b4b73a1 Merge remote-tracking branch 'origin/master' into develop 2022-03-06 01:19:14 +00:00
QMK Bot f7512d61bd Merge remote-tracking branch 'origin/master' into develop 2022-03-05 22:55:11 +00:00
QMK Bot e2ab5056f1 Merge remote-tracking branch 'origin/master' into develop 2022-03-05 21:00:29 +00:00
QMK Bot ab76e6ab59 Merge remote-tracking branch 'origin/master' into develop 2022-03-05 04:59:18 +00:00
QMK Bot 967b9e3140 Merge remote-tracking branch 'origin/master' into develop 2022-03-05 04:57:51 +00:00
Ryan 7d41639d54 Map data driven DESCRIPTION as string literal (#16523) 2022-03-05 00:20:34 +00:00
QMK Bot 618aaa8ca7 Merge remote-tracking branch 'origin/master' into develop 2022-03-04 18:11:08 +00:00
QMK Bot 386d19b55f Merge remote-tracking branch 'origin/master' into develop 2022-03-04 17:06:52 +00:00
Ryan ace0603f4f Change data driven "str" type to represent a quoted string literal (#16516)
* Change data driven "str" type to represent a quoted string literal

* Update docs
2022-03-04 13:25:24 +00:00
Ryan f634fddd34 Remove send_unicode_hex_string() (#16518) 2022-03-04 11:04:45 +00:00
QMK Bot 24f2effbdd Merge remote-tracking branch 'origin/master' into develop 2022-03-04 04:44:30 +00:00
QMK Bot bcd4f34b26 Merge remote-tracking branch 'origin/master' into develop 2022-03-04 03:57:31 +00:00
QMK Bot 9958f9e147 Merge remote-tracking branch 'origin/master' into develop 2022-03-04 03:52:47 +00:00
QMK Bot c45ed8930e Merge remote-tracking branch 'origin/master' into develop 2022-03-04 01:49:48 +00:00
QMK Bot c6111aa2a2 Merge remote-tracking branch 'origin/master' into develop 2022-03-03 23:38:54 +00:00
QMK Bot d1bd5a0100 Merge remote-tracking branch 'origin/master' into develop 2022-03-03 22:36:19 +00:00
QMK Bot 77ea1bdac4 Merge remote-tracking branch 'origin/master' into develop 2022-03-03 20:24:53 +00:00
QMK Bot b16af15750 Merge remote-tracking branch 'origin/master' into develop 2022-03-03 17:24:52 +00:00
QMK Bot 8a5ad2a113 Merge remote-tracking branch 'origin/master' into develop 2022-03-03 14:28:03 +00:00
QMK Bot 9f95844cad Merge remote-tracking branch 'origin/master' into develop 2022-03-03 09:54:22 +00:00
QMK Bot d75ce4862b Merge remote-tracking branch 'origin/master' into develop 2022-03-02 11:15:57 +00:00
QMK Bot 9d7f6d1089 Merge remote-tracking branch 'origin/master' into develop 2022-03-01 23:49:18 +00:00
QMK Bot 7f515ee64f Merge remote-tracking branch 'origin/master' into develop 2022-03-01 22:53:03 +00:00
QMK Bot 7d842c676a Merge remote-tracking branch 'origin/master' into develop 2022-03-01 02:12:47 +00:00
QMK Bot 5467bdf39e Merge remote-tracking branch 'origin/master' into develop 2022-03-01 01:54:24 +00:00
QMK Bot d77b5ad0e8 Merge remote-tracking branch 'origin/master' into develop 2022-03-01 01:52:37 +00:00
QMK Bot c70bb75323 Merge remote-tracking branch 'origin/master' into develop 2022-02-28 23:34:29 +00:00
QMK Bot 5e57d18c5b Merge remote-tracking branch 'origin/master' into develop 2022-02-28 23:33:51 +00:00
QMK Bot 73135e74b8 Merge remote-tracking branch 'origin/master' into develop 2022-02-28 23:33:10 +00:00
QMK Bot 36e47cb3aa Merge remote-tracking branch 'origin/master' into develop 2022-02-28 20:03:22 +00:00
QMK Bot 3c7c9bdd86 Merge remote-tracking branch 'origin/master' into develop 2022-02-27 12:40:01 +00:00
QMK Bot 48f06ae646 Merge remote-tracking branch 'origin/master' into develop 2022-02-27 11:30:33 +00:00
Joel Challis e4a6afa369 Rework generate-api CLI command to use .build directory (#16441) 2022-02-27 12:28:51 +01:00
QMK Bot 8f457ada3a Merge remote-tracking branch 'origin/master' into develop 2022-02-27 10:34:57 +00:00
QMK Bot 4fd2739a8c Merge remote-tracking branch 'origin/master' into develop 2022-02-27 10:09:02 +00:00
QMK Bot f6bc058525 Merge remote-tracking branch 'origin/master' into develop 2022-02-27 08:39:31 +00:00
Stefan Kerkmann 156f0561f2 [Core] Squeeze AVR some more with -mrelax and -mcall-prologues (#16269) 2022-02-26 19:05:03 -08:00
QMK Bot cb8528c33c Merge remote-tracking branch 'origin/master' into develop 2022-02-27 02:39:15 +00:00
QMK Bot d9a69324c1 Merge remote-tracking branch 'origin/master' into develop 2022-02-27 02:30:28 +00:00
QMK Bot 4fae7cde7f Merge remote-tracking branch 'origin/master' into develop 2022-02-27 01:51:13 +00:00
QMK Bot 0815d89eb8 Merge remote-tracking branch 'origin/master' into develop 2022-02-27 01:36:55 +00:00
QMK Bot 0d953a2dcf Merge remote-tracking branch 'origin/master' into develop 2022-02-27 01:35:45 +00:00
QMK Bot d995cf3ae5 Merge remote-tracking branch 'origin/master' into develop 2022-02-27 01:19:23 +00:00
QMK Bot 5360cb1fd7 Merge remote-tracking branch 'origin/master' into develop 2022-02-27 01:07:19 +00:00
QMK Bot 8a23742af2 Merge remote-tracking branch 'origin/master' into develop 2022-02-26 03:21:27 +00:00
zvecr 3da34f297a Start develop for 2022q2 2022-02-26 00:57:08 +00:00
170 changed files with 3435 additions and 3042 deletions

No files matched your search

+1 -1
View File
@@ -35,4 +35,4 @@ jobs:
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
SOURCE_DIR: 'api_data'
SOURCE_DIR: '.build/api_data'
+1 -1
View File
@@ -35,4 +35,4 @@ jobs:
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
SOURCE_DIR: 'api_data'
SOURCE_DIR: '.build/api_data'
-1
View File
@@ -1 +0,0 @@
theme: jekyll-theme-cayman
+2
View File
@@ -4,6 +4,8 @@ endif
.DEFAULT_GOAL := all
OPT = g
include paths.mk
include $(BUILDDEFS_PATH)/message.mk
+2 -1
View File
@@ -646,8 +646,9 @@ ifeq ($(strip $(HAPTIC_ENABLE)),yes)
endif
ifeq ($(strip $(HD44780_ENABLE)), yes)
SRC += platforms/avr/drivers/hd44780.c
OPT_DEFS += -DHD44780_ENABLE
COMMON_VPATH += $(DRIVER_PATH)/lcd
SRC += hd44780.c
endif
VALID_OLED_DRIVER_TYPES := SSD1306 custom
+1 -1
View File
@@ -316,7 +316,7 @@ gccversion :
@$(BUILD_CMD)
%.uf2: %.hex
$(eval CMD=$(UF2CONV) $(BUILD_DIR)/$(TARGET).hex -o $(BUILD_DIR)/$(TARGET).uf2 -c -f $(UF2_FAMILY) >/dev/null 2>&1)
$(eval CMD=$(UF2CONV) $(BUILD_DIR)/$(TARGET).hex --output $(BUILD_DIR)/$(TARGET).uf2 --convert --family $(UF2_FAMILY) >/dev/null 2>&1)
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
@$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
@$(BUILD_CMD)
+1
View File
@@ -25,6 +25,7 @@ GENERIC_FEATURES = \
DYNAMIC_KEYMAP \
DYNAMIC_MACRO \
ENCODER \
ENCODER_MAP \
GRAVE_ESC \
HAPTIC \
KEY_LOCK \
+62 -21
View File
@@ -9,7 +9,9 @@ ifneq ($(findstring MKL26Z64, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = KINETIS
MCU_SERIES = KL2x
@@ -36,7 +38,9 @@ ifneq ($(findstring MK20DX128, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = KINETIS
MCU_SERIES = K20x
@@ -63,7 +67,9 @@ ifneq ($(findstring MK20DX256, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = KINETIS
MCU_SERIES = K20x
@@ -90,7 +96,9 @@ ifneq ($(findstring MK66FX1M0, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = KINETIS
MCU_SERIES = MK66F18
@@ -117,7 +125,9 @@ ifneq ($(findstring STM32F042, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F0xx
@@ -157,7 +167,9 @@ ifneq ($(findstring STM32F072, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F0xx
@@ -192,7 +204,9 @@ ifneq ($(findstring STM32F103, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F1xx
@@ -224,7 +238,9 @@ ifneq ($(findstring STM32F303, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F3xx
@@ -259,7 +275,9 @@ ifneq ($(findstring STM32F401, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F4xx
@@ -299,7 +317,9 @@ ifneq ($(findstring STM32F405, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F4xx
@@ -334,7 +354,9 @@ ifneq ($(findstring STM32F407, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F4xx
@@ -369,7 +391,9 @@ ifneq ($(findstring STM32F411, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F4xx
@@ -409,7 +433,9 @@ ifneq ($(findstring STM32F446, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32F4xx
@@ -441,7 +467,9 @@ ifneq ($(findstring STM32G431, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32G4xx
@@ -476,7 +504,9 @@ ifneq ($(findstring STM32G474, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32G4xx
@@ -511,7 +541,9 @@ ifneq (,$(filter $(MCU),STM32L432 STM32L442))
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32L4xx
@@ -548,7 +580,9 @@ ifneq (,$(filter $(MCU),STM32L433 STM32L443))
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32L4xx
@@ -585,7 +619,9 @@ ifneq (,$(filter $(MCU),STM32L412 STM32L422))
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = STM32
MCU_SERIES = STM32L4xx
@@ -602,7 +638,7 @@ ifneq (,$(filter $(MCU),STM32L412 STM32L422))
# <keyboard_dir>/boards/, or drivers/boards/
BOARD ?= GENERIC_STM32_L412XB
PLATFORM_NAME ?= platform_l432
PLATFORM_NAME ?= platform_l412_l422
USE_FPU ?= yes
@@ -622,7 +658,9 @@ ifneq ($(findstring WB32F3G71, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = WB32
MCU_SERIES = WB32F3G71xx
@@ -657,7 +695,10 @@ ifneq ($(findstring GD32VF103, $(MCU)),)
## chip/board settings
# - the next two should match the directories in
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_PORT_NAME = GD
MCU_FAMILY = GD32V
MCU_SERIES = GD32VF103
+1
View File
@@ -57,6 +57,7 @@ OTHER_OPTION_NAMES = \
HELIX ZINC \
AUTOLOG_ENABLE \
DEBUG_ENABLE \
ENCODER_MAP_ENABLE \
ENCODER_ENABLE_CUSTOM \
GERMAN_ENABLE \
HAPTIC_ENABLE \
+1
View File
@@ -2,6 +2,7 @@ TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f
FULL_TESTS := $(notdir $(TEST_LIST))
include $(QUANTUM_PATH)/debounce/tests/testlist.mk
include $(QUANTUM_PATH)/encoder/tests/testlist.mk
include $(QUANTUM_PATH)/sequencer/tests/testlist.mk
include $(PLATFORM_PATH)/test/testlist.mk
+2 -2
View File
@@ -3,7 +3,7 @@
{
# Format:
# <config.h key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
# value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping"
# value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping", "str", "raw"
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
# to_c: Default `true`. Set to `false` to exclude this mapping from config.h
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
@@ -17,7 +17,7 @@
"DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
# TODO: Replace ^^^ with vvv
#"DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"},
"DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false},
"DESCRIPTION": {"info_key": "keyboard_folder", "value_type": "str", "to_json": false},
"DIODE_DIRECTION": {"info_key": "diode_direction"},
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
"DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
+2 -2
View File
@@ -3,7 +3,7 @@
{
# Format:
# <rules.mk key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
# value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping"
# value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping", "str", "raw"
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
# to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
@@ -20,6 +20,6 @@
"MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"},
"NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"},
"SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
"SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "value_type": "str", "to_c": false},
"SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false},
"WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"}
}
File renamed without changes.
+9 -9
View File
@@ -94,7 +94,7 @@
* Hardware Features
* Displays
* [HD44780 LCD Controller](feature_hd44780.md)
* [HD44780 LCD Driver](feature_hd44780.md)
* [ST7565 LCD Driver](feature_st7565.md)
* [OLED Driver](feature_oled_driver.md)
* Lighting
@@ -147,7 +147,7 @@
* [EEPROM Driver](eeprom_driver.md)
* ['serial' Driver](serial_driver.md)
* [UART Driver](uart_driver.md)
* [GPIO Controls](internals_gpio_control.md)
* [GPIO Controls](gpio_control.md)
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
* Python Development
@@ -183,10 +183,10 @@
* [Understanding QMK](understanding_qmk.md)
* QMK Internals (In Progress)
* [Defines](internals_defines.md)
* [Input Callback Reg](internals_input_callback_reg.md)
* [Midi Device](internals_midi_device.md)
* [Midi Device Setup Process](internals_midi_device_setup_process.md)
* [Midi Util](internals_midi_util.md)
* [Send Functions](internals_send_functions.md)
* [Sysex Tools](internals_sysex_tools.md)
* [Defines](internals/defines.md)
* [Input Callback Reg](internals/input_callback_reg.md)
* [Midi Device](internals/midi_device.md)
* [Midi Device Setup Process](internals/midi_device_setup_process.md)
* [Midi Util](internals/midi_util.md)
* [Send Functions](internals/send_functions.md)
* [Sysex Tools](internals/sysex_tools.md)
+2
View File
@@ -131,6 +131,8 @@ If you define these options you will disable the associated feature, which can s
If you define these options you will enable the associated feature, which may increase your code size.
* `#define ENABLE_COMPILE_KEYCODE`
* Enables the `QK_MAKE` keycode
* `#define FORCE_NKRO`
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
* `#define STRICT_LAYER_RELEASE`
+3 -2
View File
@@ -44,7 +44,7 @@ In other cases you should group like options together in an `object`. This is pa
In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.json` and `data/mappings/info_rules.json`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys:
* `info_key`: (required) The location within `info.json` for this value. See below.
* `value_type`: (optional) Default `str`. The format for this variable's value. See below.
* `value_type`: (optional) Default `raw`. The format for this variable's value. See below.
* `to_json`: (optional) Default `true`. Set to `false` to exclude this mapping from info.json
* `to_c`: (optional) Default `true`. Set to `false` to exclude this mapping from config.h
* `warn_duplicate`: (optional) Default `true`. Set to `false` to turn off warning when a value exists in both places
@@ -57,7 +57,7 @@ Under the hood we use [Dotty Dict](https://dotty-dict.readthedocs.io/en/latest/)
#### Value Types
By default we treat all values as simple strings. If your value is more complex you can use one of these types to intelligently parse the data:
By default we treat all values as unquoted "raw" data. If your value is more complex you can use one of these types to intelligently parse the data:
* `array`: A comma separated array of strings
* `array.int`: A comma separated array of integers
@@ -65,6 +65,7 @@ By default we treat all values as simple strings. If your value is more complex
* `hex`: A number formatted as hex
* `list`: A space separate array of strings
* `mapping`: A hash of key/value pairs
* `str`: A quoted string literal
### Add code to extract it
+35 -1
View File
@@ -54,9 +54,43 @@ If you are using different pinouts for the encoders on each half of a split keyb
#define ENCODER_RESOLUTIONS_RIGHT { 2, 4 }
```
If the `_RIGHT` definitions aren't specified in your `config.h`, then the non-`_RIGHT` versions will be applied to both sides of the split.
Additionally, if one side does not have an encoder, you can specify `{}` for the pins/resolution -- for example, a split keyboard with only a right-side encoder:
```c
#define ENCODERS_PAD_A { }
#define ENCODERS_PAD_B { }
#define ENCODER_RESOLUTIONS { }
#define ENCODERS_PAD_A_RIGHT { B12 }
#define ENCODERS_PAD_B_RIGHT { B13 }
#define ENCODER_RESOLUTIONS_RIGHT { 4 }
```
## Encoder map
Encoder mapping may be added to your `keymap.c`, which replicates the normal keyswitch layer handling functionality, but with encoders. Add this to your `rules.mk`:
```make
ENCODER_MAP_ENABLE = yes
```
Your `keymap.c` will then need an encoder mapping defined (for four layers and two encoders):
```c
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_BASE] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_LOWER] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
[_RAISE] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) },
[_ADJUST] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) },
};
#endif
```
## Callbacks
The callback functions can be inserted into your `<keyboard>.c`:
When not using `ENCODER_MAP_ENABLE = yes`, the callback functions can be inserted into your `<keyboard>.c`:
```c
bool encoder_update_kb(uint8_t index, bool clockwise) {
+289 -48
View File
@@ -1,57 +1,298 @@
# HD44780 LCD Displays
# HD44780 LCD Driver
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
## Supported Hardware
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes.
LCD modules using [HD44780U](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) IC or equivalent, communicating in 4-bit mode.
## Configuration
|Module|Size |Notes |
|------|--------------|---------------------------------|
|1602A |16x2, 5x8 dots| |
|2004A |20x4, 5x8 dots|Untested, not currently supported|
You will need to configure the pins used by your display, and its number of lines and columns in your keyboard's `config.h`.
Uncomment the section labled HD44780 and change the parameters as needed.
````
/*
* HD44780 LCD Display Configuration
*/
#define LCD_LINES 2 //< number of visible lines of the display
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
#if LCD_IO_MODE
#define LCD_PORT PORTB //< port for the LCD lines
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
#define LCD_RS_PORT LCD_PORT //< port for RS line
#define LCD_RS_PIN 3 //< pin for RS line
#define LCD_RW_PORT LCD_PORT //< port for RW line
#define LCD_RW_PIN 2 //< pin for RW line
#define LCD_E_PORT LCD_PORT //< port for Enable line
#define LCD_E_PIN 1 //< pin for Enable line
#endif
````
Should you need to configure other properties you can copy them from `quantum/hd44780.h` and set them in your `config.h`
To run these modules at 3.3V, an additional MAX660 voltage converter IC must be soldered on, along with two 10µF capacitors. See [this page](https://www.codrey.com/electronic-circuits/hack-your-16x2-lcd/) for more details.
## Usage
To initialize your display, call `lcd_init()` with one of these parameters:
````
LCD_DISP_OFF : display off
LCD_DISP_ON : display on, cursor off
LCD_DISP_ON_CURSOR : display on, cursor on
LCD_DISP_ON_CURSOR_BLINK : display on, cursor on flashing
````
This is best done in your keyboards `matrix_init_kb` or your keymaps `matrix_init_user`.
It is advised to clear the display before use.
To do so call `lcd_clrscr()`.
Add the following to your `rules.mk`:
To now print something to your Display you first call `lcd_gotoxy(column, line)`. To go to the start of the first line you would call `lcd_gotoxy(0, 0)` and then print a string with `lcd_puts("example string")`.
```make
HD44780_ENABLE = yes
```
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
## Basic Configuration
Add the following to your `config.h`:
|Define |Default |Description |
|-----------------------|--------------|-----------------------------------------------------------------------------------------------------|
|`HD44780_DATA_PINS` |*Not defined* |(Required) An array of four GPIO pins connected to the display's D4-D7 pins, eg. `{ B1, B3, B2, B6 }`|
|`HD44780_RS_PIN` |*Not defined* |(Required) The GPIO connected to the display's RS pin |
|`HD44780_RW_PIN` |*Not defined* |(Required) The GPIO connected to the display's RW pin |
|`HD44780_E_PIN` |*Not defined* |(Required) The GPIO connected to the display's E pin |
|`HD44780_DISPLAY_COLS` |`16` |The number of visible characters on a single line of the display |
|`HD44780_DISPLAY_LINES`|`2` |The number of visible lines on the display |
|`HD44780_WRAP_LINES` |*Not defined* |If defined, input characters will wrap to the next line |
## Examples
### Hello World
Add the following to your `keymap.c`:
```c
void keyboard_post_init_user(void) {
hd44780_init(true, true); // Show blinking cursor
hd44780_puts_P(PSTR("Hello, world!\n"));
}
```
### Custom Character Definition
Up to eight custom characters can be defined. This data is stored in the Character Generator RAM (CGRAM), and is not persistent across power cycles.
This example defines the QMK Psi as the first custom character. The first 16 positions in the character set are reserved for the eight custom characters duplicated.
```
Byte | 16 8 4 2 1
1 | x x x ■ □ ■ □ ■
2 | x x x ■ □ ■ □ ■
3 | x x x ■ □ ■ □ ■
4 | x x x □ ■ ■ ■ □
5 | x x x □ □ ■ □ □
6 | x x x □ □ ■ □ □
7 | x x x □ □ ■ □ □
8 | x x x □ □ □ □ □
```
```c
const uint8_t PROGMEM psi[8] = { 0x15, 0x15, 0x15, 0x0E, 0x04, 0x04, 0x04, 0x00 };
void keyboard_post_init_user(void) {
hd44780_init(false, false);
hd44780_define_char_P(0, psi);
// Cursor is incremented while defining characters so must be reset
hd44780_home();
// 0x08 to avoid null terminator
hd44780_puts_P(PSTR("\x08 QMK Firmware"));
}
```
## API
### `void hd44780_init(bool cursor, bool blink)`
Initialize the display.
This function should be called only once, before any of the other functions can be called.
#### Arguments
- `bool cursor`
Whether to show the cursor.
- `bool blink`
Whether to blink the cursor, if shown.
---
### `void hd44780_clear(void)`
Clear the display.
This function is called on init.
---
### `void hd44780_home(void)`
Move the cursor to the home position.
This function is called on init.
---
### `void hd44780_on(bool cursor, bool blink)`
Turn the display on, and/or set the cursor properties.
This function is called on init.
#### Arguments
- `bool cursor`
Whether to show the cursor.
- `bool blink`
Whether to blink the cursor, if shown.
---
### `void hd44780_off(void)`
Turn the display off.
---
### `void hd44780_set_cursor(uint8_t col, uint8_t line)`
Move the cursor to the specified position on the display.
#### Arguments
- `uint8_t col`
The column number to move to, from 0 to 15 on 16x2 displays.
- `bool line`
The line number to move to, either 0 or 1 on 16x2 displays.
---
### `void hd44780_putc(char c)`
Print a character to the display. The newline character `\n` will move the cursor to the start of the next line.
The exact character shown may depend on the ROM code of your particular display - refer to the datasheet for the full character set.
#### Arguments
- `char c`
The character to print.
---
### `void hd44780_puts(const char *s)`
Print a string of characters to the display.
#### Arguments
- `const char *s`
The string to print.
---
### `void hd44780_puts_P(const char *s)`
Print a string of characters from PROGMEM to the display.
On ARM devices, this function is simply an alias of `hd44780_puts()`.
#### Arguments
- `const char *s`
The PROGMEM string to print (ie. `PSTR("Hello")`).
---
### `void hd44780_define_char(uint8_t index, uint8_t *data)`
Define a custom character.
#### Arguments
- `uint8_t index`
The index of the custom character to define, from 0 to 7.
- `uint8_t *data`
An array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column.
---
### `void hd44780_define_char_P(uint8_t index, const uint8_t *data)`
Define a custom character from PROGMEM.
On ARM devices, this function is simply an alias of `hd44780_define_char()`.
#### Arguments
- `uint8_t index`
The index of the custom character to define, from 0 to 7.
- `const uint8_t *data`
A PROGMEM array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column.
---
### `bool hd44780_busy(void)`
Indicates whether the display is currently processing, and cannot accept instructions.
#### Return Value
`true` if the display is busy.
---
### `void hd44780_write(uint8_t data, bool isData)`
Write a byte to the display.
#### Arguments
- `uint8_t data`
The byte to send to the display.
- `bool isData`
Whether the byte is an instruction or character data.
---
### `uint8_t hd44780_read(bool isData)`
Read a byte from the display.
#### Arguments
- `bool isData`
Whether to read the current cursor position, or the character at the cursor.
#### Return Value
If `isData` is `true`, the returned byte will be the character at the current DDRAM address. Otherwise, it will be the current DDRAM address and the busy flag.
---
### `void hd44780_command(uint8_t command)`
Send a command to the display. Refer to the datasheet and `hd44780.h` for the valid commands and defines.
This function waits for the display to clear the busy flag before sending the command.
#### Arguments
- `uint8_t command`
The command to send.
---
### `void hd44780_data(uint8_t data)`
Send a byte of data to the display.
This function waits for the display to clear the busy flag before sending the data.
#### Arguments
- `uint8_t data`
The byte of data to send.
---
### `void hd44780_set_cgram_address(uint8_t address)`
Set the CGRAM address.
This function is used when defining custom characters.
#### Arguments
- `uint8_t address`
The CGRAM address to move to, from `0x00` to `0x3F`.
---
### `void hd44780_set_ddram_address(uint8_t address)`
Set the DDRAM address.
This function is used when printing characters to the display, and setting the cursor.
#### Arguments
- `uint8_t address`
The DDRAM address to move to, from `0x00` to `0x7F`.
+3 -3
View File
@@ -254,7 +254,7 @@ For the above, the `MI_C` keycode will produce a C3 (note number 48), and so on.
<!--
#### QMK Internals (Autogenerated)
* [Internals/MIDI Device Setup Process](internals_midi_device_setup_process.md)
* [Internals/MIDI Device](internals_midi_device.md)
* [Internals/MIDI Util](internals_midi_util.md)
* [Internals/MIDI Device Setup Process](internals/midi_device_setup_process.md)
* [Internals/MIDI Device](internals/midi_device.md)
* [Internals/MIDI Util](internals/midi_util.md)
-->
+1
View File
@@ -171,6 +171,7 @@ Configure the hardware via your `config.h`:
|----------|-------------|---------|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3737B only | 0 |
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
+13
View File
@@ -31,3 +31,16 @@ Note that the array indices are reversed same as the matrix and the values are o
|`SH_OS` |One shot swap hands: toggles while pressed or until next key press. |
`SH_TT` swap-hands tap-toggle key is similar to [layer tap-toggle](feature_layers.md?id=switching-and-toggling-layers). Tapping repeatedly (5 taps by default) will toggle swap-hands on or off, like `SH_TG`. Tap-toggle count can be changed by defining a value for `TAPPING_TOGGLE`.
## Encoder Mapping
When using an encoder mapping, it's also able to handle swapping encoders between sides, too.
Encoder indexes are defined as left-to-right, and the extent of the array needs to match the number of encoders on the keyboard.
As an example, if a split keyboard has a single encoder per side, you can swap the order by using the following code in your keymap:
```c
#if defined(SWAP_HANDS_ENABLE) && defined(ENCODER_MAP_ENABLE)
const uint8_t PROGMEM encoder_hand_swap_config[NUM_ENCODERS] = { 1, 0 };
#endif
```
-11
View File
@@ -230,17 +230,6 @@ send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
Example uses include sending Unicode strings when a key is pressed, as described in [Macros](feature_macros.md).
### `send_unicode_hex_string()` (Deprecated)
Similar to `send_unicode_string()`, but the characters are represented by their Unicode code points, written in hexadecimal and separated by spaces. For example, the table flip above would be achieved with:
```c
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
```
An easy way to convert your Unicode string to this format is to use [this site](https://r12a.github.io/app-conversion/) and take the result in the "Hex/UTF-32" section.
## Additional Language Support
In `quantum/keymap_extras`, you'll see various language files — these work the same way as the ones for alternative layouts such as Colemak or BÉPO. When you include one of these language headers, you gain access to keycodes specific to that language / national layout. Such keycodes are defined by a 2-letter country/language code, followed by an underscore and a 4-letter abbreviation of the character to which the key corresponds. For example, including `keymap_french.h` and using `FR_UGRV` in your keymap will output `ù` when typed on a system with a native French AZERTY layout.
+11
View File
@@ -347,3 +347,14 @@ Flashing sequence:
2. Wait for the OS to detect the device
3. Copy the .uf2 file to the new USB disk
4. Wait for the keyboard to become available
or
CLI Flashing sequence:
1. Enter the bootloader using any of the following methods:
* Tap the `RESET` keycode
* Double-tap the `nRST` button on the PCB.
2. Wait for the OS to detect the device
3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/blackpill_f411_tinyuf2 --keymap default`
4. Wait for the keyboard to become available
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+8 -8
View File
@@ -137,7 +137,7 @@
* [EEPROM ドライバ](ja/eeprom_driver.md)
* [シリアル ドライバ](ja/serial_driver.md)
* [UART ドライバ](ja/uart_driver.md)
* [GPIO 制御](ja/internals_gpio_control.md)
* [GPIO 制御](ja/gpio_control.md)
* [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
* Python 開発
@@ -173,10 +173,10 @@
* [QMK を理解する](ja/understanding_qmk.md)
* QMK の内部詳細(作成中)
* [定義](ja/internals_defines.md)
* [入力コールバック登録](ja/internals_input_callback_reg.md)
* [Midi デバイス](ja/internals_midi_device.md)
* [Midi デバイスのセットアップ手順](ja/internals_midi_device_setup_process.md)
* [Midi ユーティリティ](ja/internals_midi_util.md)
* [Midi 送信関数](ja/internals_send_functions.md)
* [Sysex Tools](ja/internals_sysex_tools.md)
* [定義](ja/internals/defines.md)
* [入力コールバック登録](ja/internals/input_callback_reg.md)
* [Midi デバイス](ja/internals/midi_device.md)
* [Midi デバイスのセットアップ手順](ja/internals/midi_device_setup_process.md)
* [Midi ユーティリティ](ja/internals/midi_util.md)
* [Midi 送信関数](ja/internals/send_functions.md)
* [Sysex Tools](ja/internals/sysex_tools.md)
-11
View File
@@ -233,17 +233,6 @@ send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
使用例には、[Macros](ja/feature_macros.md) で説明されているように、キーが押された時に Unicode 文字列を送信することが含まれます。
### `send_unicode_hex_string()`
`send_unicode_string()` に似ていますが、文字は Unicode コードポイントで表され、16進数で記述され、空白で区切られています。例えば、上記のちゃぶ台返しは以下で表されます:
```c
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
```
[このサイト](https://r12a.github.io/app-conversion/)で結果を "Hex/UTF-32" で受け取ることで、Unicode 文字列をこの形式に簡単に変換できます。
## 追加の言語サポート
`quantum/keymap_extras` には、様々な言語ファイルがあります — これらは Colemak または BÉPO のような代替レイアウトのファイルと同じように動作します。これらの言語ヘッダのいずれかを `#include` すると、その言語/国のレイアウトに固有のキーコードにアクセスできます。このようなキーコードは、2文字の国/言語コードの後に、アンダースコアとキーが対応する4文字の略語が続くことで定義されます。例えば、キーマップに `keymap_french.h` を含め、`FR_UGRV` を使うと、ネイティブのフランス語 AZERTY レイアウトを使うシステムで入力すると、`ù` が出力されます。
@@ -1,8 +1,8 @@
# GPIO 制御 :id=gpio-control
<!---
original document: 0.13.15:docs/internals_gpio_control.md
git diff 0.13.15 HEAD -- docs/internals_gpio_control.md | cat
original document: 0.13.15:docs/gpio_control.md
git diff 0.13.15 HEAD -- docs/gpio_control.md | cat
-->
QMK には、マイクロコントローラに依存しない GPIO 制御抽象レイヤーがあります。これは異なるプラットフォーム間でピン制御に簡単にアクセスできるようにするためのものです。
-78
View File
@@ -1,78 +0,0 @@
# `defines` グループ {#group__defines}
## 概要
メンバー | 説明
--------------------------------|---------------------------------------------
`define `[`SYSEX_BEGIN`](#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79) |
`define `[`SYSEX_END`](#group__defines_1ga753706d1d28e6f96d7caf1973e80feed) |
`define `[`MIDI_STATUSMASK`](#group__defines_1gab78a1c818a5f5dab7a8946543f126c69) |
`define `[`MIDI_CHANMASK`](#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909) |
`define `[`MIDI_CC`](#group__defines_1ga45f116a1daab76b3c930c2cecfaef215) |
`define `[`MIDI_NOTEON`](#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7) |
`define `[`MIDI_NOTEOFF`](#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc) |
`define `[`MIDI_AFTERTOUCH`](#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f) |
`define `[`MIDI_PITCHBEND`](#group__defines_1gabcc799504e8064679bca03f232223af4) |
`define `[`MIDI_PROGCHANGE`](#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42) |
`define `[`MIDI_CHANPRESSURE`](#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe) |
`define `[`MIDI_CLOCK`](#group__defines_1gafa5e4e295aafd15ab7893344599b3b89) |
`define `[`MIDI_TICK`](#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7) |
`define `[`MIDI_START`](#group__defines_1ga8233631c85823aa546f932ad8975caa4) |
`define `[`MIDI_CONTINUE`](#group__defines_1gab24430f0081e27215b0da84dd0ee745c) |
`define `[`MIDI_STOP`](#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62) |
`define `[`MIDI_ACTIVESENSE`](#group__defines_1gacd88ed42dba52bb4b2052c5656362677) |
`define `[`MIDI_RESET`](#group__defines_1ga02947f30ca62dc332fdeb10c5868323b) |
`define `[`MIDI_TC_QUARTERFRAME`](#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31) |
`define `[`MIDI_SONGPOSITION`](#group__defines_1ga412f6ed33a2150051374bee334ee1705) |
`define `[`MIDI_SONGSELECT`](#group__defines_1gafcab254838b028365ae0259729e72c4e) |
`define `[`MIDI_TUNEREQUEST`](#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795) |
`define `[`SYSEX_EDUMANUFID`](#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f) |
## メンバー
#### `define `[`SYSEX_BEGIN`](#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79) {#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79}
#### `define `[`SYSEX_END`](#group__defines_1ga753706d1d28e6f96d7caf1973e80feed) {#group__defines_1ga753706d1d28e6f96d7caf1973e80feed}
#### `define `[`MIDI_STATUSMASK`](#group__defines_1gab78a1c818a5f5dab7a8946543f126c69) {#group__defines_1gab78a1c818a5f5dab7a8946543f126c69}
#### `define `[`MIDI_CHANMASK`](#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909) {#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909}
#### `define `[`MIDI_CC`](#group__defines_1ga45f116a1daab76b3c930c2cecfaef215) {#group__defines_1ga45f116a1daab76b3c930c2cecfaef215}
#### `define `[`MIDI_NOTEON`](#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7) {#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7}
#### `define `[`MIDI_NOTEOFF`](#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc) {#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc}
#### `define `[`MIDI_AFTERTOUCH`](#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f) {#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f}
#### `define `[`MIDI_PITCHBEND`](#group__defines_1gabcc799504e8064679bca03f232223af4) {#group__defines_1gabcc799504e8064679bca03f232223af4}
#### `define `[`MIDI_PROGCHANGE`](#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42) {#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42}
#### `define `[`MIDI_CHANPRESSURE`](#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe) {#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe}
#### `define `[`MIDI_CLOCK`](#group__defines_1gafa5e4e295aafd15ab7893344599b3b89) {#group__defines_1gafa5e4e295aafd15ab7893344599b3b89}
#### `define `[`MIDI_TICK`](#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7) {#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7}
#### `define `[`MIDI_START`](#group__defines_1ga8233631c85823aa546f932ad8975caa4) {#group__defines_1ga8233631c85823aa546f932ad8975caa4}
#### `define `[`MIDI_CONTINUE`](#group__defines_1gab24430f0081e27215b0da84dd0ee745c) {#group__defines_1gab24430f0081e27215b0da84dd0ee745c}
#### `define `[`MIDI_STOP`](#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62) {#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62}
#### `define `[`MIDI_ACTIVESENSE`](#group__defines_1gacd88ed42dba52bb4b2052c5656362677) {#group__defines_1gacd88ed42dba52bb4b2052c5656362677}
#### `define `[`MIDI_RESET`](#group__defines_1ga02947f30ca62dc332fdeb10c5868323b) {#group__defines_1ga02947f30ca62dc332fdeb10c5868323b}
#### `define `[`MIDI_TC_QUARTERFRAME`](#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31) {#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31}
#### `define `[`MIDI_SONGPOSITION`](#group__defines_1ga412f6ed33a2150051374bee334ee1705) {#group__defines_1ga412f6ed33a2150051374bee334ee1705}
#### `define `[`MIDI_SONGSELECT`](#group__defines_1gafcab254838b028365ae0259729e72c4e) {#group__defines_1gafcab254838b028365ae0259729e72c4e}
#### `define `[`MIDI_TUNEREQUEST`](#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795) {#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795}
#### `define `[`SYSEX_EDUMANUFID`](#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f) {#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f}
-173
View File
@@ -1,173 +0,0 @@
# group `input_callback_reg` {#group__input__callback__reg}
<!---
original document: 0.9.34:docs/internals_input_callback_reg.md
git diff 0.9.34 HEAD -- docs/internals_input_callback_reg.md | cat
-->
これらは受信コールバックを登録するために使用する関数です。
関数は、適切な midi メッセージが関連するデバイスの入力と一致した場合に呼び出されます。
## 概要
| メンバー | 説明 |
--------------------------------|---------------------------------------------
| `public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | コントロールチェンジメッセージ受信コールバックを登録する。 |
| `public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ノートオン受信コールバックを登録する。 |
| `public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ノートオフ受信コールバックを登録する。 |
| `public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | アフタータッチ受信コールバックを登録する。 |
| `public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ピッチベンド受信コールバックを登録する。 |
| `public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ソングポジション受信コールバックを登録する。 |
| `public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | プログラムチェンジ受信コールバックを登録する。 |
| `public void `[`midi_register_chanpressure_callback`](#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | チャンネルプレッシャー受信コールバックを登録する。 |
| `public void `[`midi_register_songselect_callback`](#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | ソングセレクト受信コールバックを登録する。 |
| `public void `[`midi_register_tc_quarterframe_callback`](#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | タイムコードクォータフレーム受信コールバックを登録する。 |
| `public void `[`midi_register_realtime_callback`](#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` | リアルタイム受信コールバックを登録する。 |
| `public void `[`midi_register_tunerequest_callback`](#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` | チューンリクエスト受信コールバックを登録する。 |
| `public void `[`midi_register_sysex_callback`](#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_sysex_func_t func)` | システムエクスクルーシブ受信コールバックを登録する。 |
| `public void `[`midi_register_fallthrough_callback`](#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` | フォールスルー受信コールバックを登録する。 |
| `public void `[`midi_register_catchall_callback`](#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` | キャッチオール受信コールバックを登録する。 |
## メンバー
#### `public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718}
コントロールチェンジメッセージ受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga3962f276c17618923f1152779552103e}
ノートオン受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d}
ノートオフ受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f}
アフタータッチ受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48}
ピッチベンド受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6}
ソングポジション受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127}
プログラムチェンジ受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_chanpressure_callback`](#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5}
チャンネルプレッシャー受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_songselect_callback`](#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72}
ソングセレクト受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_tc_quarterframe_callback`](#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e}
タイムコードクォータフレーム受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_realtime_callback`](#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` {#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a}
リアルタイム受信コールバックを登録する。
全てのリアルタイムメッセージ型に対してコールバックが呼ばれます。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_tunerequest_callback`](#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` {#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1}
チューンリクエスト受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_sysex_callback`](#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_sysex_func_t func)` {#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48}
システムエクスクルーシブ受信コールバックを登録する。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_fallthrough_callback`](#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` {#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94}
フォールスルー受信コールバックを登録する。
より具体的なコールバックが見つからない場合にのみ呼ばれます。例えば、ノートオン受信コールバックを登録していないがノートオンメッセージを受け取った場合、フォールスルー受信コールバックが登録されている場合はそれが呼ばれます。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
#### `public void `[`midi_register_catchall_callback`](#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` {#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99}
キャッチオール受信コールバックを登録する。
登録されている場合は、より具体的なコールバックあるいはフォールスルー受信コールバックが登録されている場合でも、一致する全てのメッセージに対してキャッチオール受信コールバックが呼ばれます。
#### パラメータ
* `device` 関連するデバイス
* `func` 登録するコールバック関数
-148
View File
@@ -1,148 +0,0 @@
# `midi_device` グループ {#group__midi__device}
<!---
original document: 0.10.9:docs/internals_midi_device.md
git diff 0.10.9 HEAD -- docs/internals_midi_device.md | cat
-->
独自の MIDI デバイスを実装する時に、関数を使います。
実際にデバイスを介してバイトを送信するために、送信関数を設定します。このメソッドは、このデバイスで例えば midi_send_cc のような送信関数を呼ぶ時に呼ばれます。
midi_device_input を使ってデバイスからの入力データを処理し、それをデバイスに関連付けられたコールバックで渡します。
デバイスのプロセス関数の最初に呼び出される関数が必要な場合、midi_device_set_pre_input_process_func を使います。通常、入力をポーリングして midi_device_input に渡します。
## 概要
メンバー | 説明
--------------------------------|---------------------------------------------
`define `[`MIDI_INPUT_QUEUE_LENGTH`](#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8) |
`enum `[`input_state_t`](#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621) |
`public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` | 入力バイトを処理します。この関数はバイトを解析し、指定されたデバイスに関連する適切なコールバックを呼びます。この関数は、カスタムデバイスを作成していて、MIDI 入力が必要な場合に使います。
`public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` | 出力データバイトの送信に使われるコールバック関数を設定します。これは、カスタムデバイスを作成している場合のみ使われます。ロックを気にすることなく様々な MIDI 送信関数を呼び出すことができるように、コールバック関数で割り込みを無効にすることができます。
`public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` | midi_device_process 呼び出しの最初に呼ばれるコールバックを設定します。これは入力データをポーリングし、midi_device_input 関数を介してデータを送信できます。カスタムデバイスを作成している場合のみ、これを使う可能性があります。
`struct `[`_midi_device`](docs/api_midi_device.md#struct__midi__device) | この構造体は、MIDI デバイスの入出力関数と処理データを表します。
## メンバー
#### `define `[`MIDI_INPUT_QUEUE_LENGTH`](#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8) {#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8}
#### `enum `[`input_state_t`](#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621) {#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621}
値 | 説明
--------------------------------|---------------------------------------------
IDLE |
ONE_BYTE_MESSAGE |
TWO_BYTE_MESSAGE |
THREE_BYTE_MESSAGE |
SYSEX_MESSAGE |
#### `public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` {#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db}
入力バイトを処理します。この関数はバイトを解析し、指定されたデバイスに関連する適切なコールバックを呼びます。この関数は、カスタムデバイスを作成していて、MIDI 入力が必要な場合に使います。
#### パラメータ
* `device` 入力を関連付ける MIDI デバイス
* `cnt` 処理中のバイト数
* `input` 処理するバイトデータ
#### `public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` {#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673}
出力データバイトの送信に使われるコールバック関数を設定します。これは、カスタムデバイスを作成している場合のみ使われます。ロックを気にすることなく様々な MIDI 送信関数を呼び出すことができるように、コールバック関数で割り込みを無効にすることができます。
#### パラメータ
* `device` このコールバックを関連付ける MIDI デバイス
* `send_func` 送信を行うコールバック関数
#### `public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` {#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69}
midi_device_process 呼び出しの最初に呼ばれるコールバックを設定します。これは入力データをポーリングし、midi_device_input 関数を介してデータを送信できます。カスタムデバイスを作成している場合のみ、これを使う可能性があります。
#### パラメータ
* `device` このコールバックを関連付ける MIDI デバイス
* `midi_no_byte_func_t` 実際のコールバック関数
# `_midi_device` 構造体 {#struct__midi__device}
この構造体は、MIDI デバイスの入出力関数と処理データを表します。
デバイスは、実際の物理デバイス [シリアルポート、USB ポート]、または仮想デバイスを表すことができます。この構造体を直接変更する必要はありません。
## 概要
| メンバー | 説明
--------------------------------|---------------------------------------------
`public midi_var_byte_func_t `[`send_func`](docs/api_midi_device.md#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9) |
`public midi_three_byte_func_t `[`input_cc_callback`](docs/api_midi_device.md#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1) |
`public midi_three_byte_func_t `[`input_noteon_callback`](docs/api_midi_device.md#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c) |
`public midi_three_byte_func_t `[`input_noteoff_callback`](docs/api_midi_device.md#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84) |
`public midi_three_byte_func_t `[`input_aftertouch_callback`](docs/api_midi_device.md#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f) |
`public midi_three_byte_func_t `[`input_pitchbend_callback`](docs/api_midi_device.md#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18) |
`public midi_three_byte_func_t `[`input_songposition_callback`](docs/api_midi_device.md#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586) |
`public midi_two_byte_func_t `[`input_progchange_callback`](docs/api_midi_device.md#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da) |
`public midi_two_byte_func_t `[`input_chanpressure_callback`](docs/api_midi_device.md#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7) |
`public midi_two_byte_func_t `[`input_songselect_callback`](docs/api_midi_device.md#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f) |
`public midi_two_byte_func_t `[`input_tc_quarterframe_callback`](docs/api_midi_device.md#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0) |
`public midi_one_byte_func_t `[`input_realtime_callback`](docs/api_midi_device.md#struct__midi__device_1a9448eba4afb7e43650434748db3777be) |
`public midi_one_byte_func_t `[`input_tunerequest_callback`](docs/api_midi_device.md#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d) |
`public midi_sysex_func_t `[`input_sysex_callback`](docs/api_midi_device.md#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2) |
`public midi_var_byte_func_t `[`input_fallthrough_callback`](docs/api_midi_device.md#struct__midi__device_1abb974ec6d734001b4a0e370f292be503) |
`public midi_var_byte_func_t `[`input_catchall_callback`](docs/api_midi_device.md#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8) |
`public midi_no_byte_func_t `[`pre_input_process_callback`](docs/api_midi_device.md#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754) |
`public uint8_t `[`input_buffer`](docs/api_midi_device.md#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a) |
`public input_state_t `[`input_state`](docs/api_midi_device.md#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39) |
`public uint16_t `[`input_count`](docs/api_midi_device.md#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d) |
`public uint8_t `[`input_queue_data`](docs/api_midi_device.md#struct__midi__device_1ada41de021135dc423abedcbb30f366ff) |
`public `[`byteQueue_t`](#structbyte_queue__t)` `[`input_queue`](#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f) |
## メンバー
#### `public midi_var_byte_func_t `[`send_func`](docs/api_midi_device.md#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9) {#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9}
#### `public midi_three_byte_func_t `[`input_cc_callback`](docs/api_midi_device.md#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1) {#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1}
#### `public midi_three_byte_func_t `[`input_noteon_callback`](docs/api_midi_device.md#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c) {#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c}
#### `public midi_three_byte_func_t `[`input_noteoff_callback`](docs/api_midi_device.md#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84) {#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84}
#### `public midi_three_byte_func_t `[`input_aftertouch_callback`](docs/api_midi_device.md#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f) {#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f}
#### `public midi_three_byte_func_t `[`input_pitchbend_callback`](docs/api_midi_device.md#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18) {#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18}
#### `public midi_three_byte_func_t `[`input_songposition_callback`](docs/api_midi_device.md#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586) {#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586}
#### `public midi_two_byte_func_t `[`input_progchange_callback`](docs/api_midi_device.md#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da) {#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da}
#### `public midi_two_byte_func_t `[`input_chanpressure_callback`](docs/api_midi_device.md#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7) {#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7}
#### `public midi_two_byte_func_t `[`input_songselect_callback`](docs/api_midi_device.md#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f) {#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f}
#### `public midi_two_byte_func_t `[`input_tc_quarterframe_callback`](docs/api_midi_device.md#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0) {#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0}
#### `public midi_one_byte_func_t `[`input_realtime_callback`](docs/api_midi_device.md#struct__midi__device_1a9448eba4afb7e43650434748db3777be) {#struct__midi__device_1a9448eba4afb7e43650434748db3777be}
#### `public midi_one_byte_func_t `[`input_tunerequest_callback`](docs/api_midi_device.md#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d) {#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d}
#### `public midi_sysex_func_t `[`input_sysex_callback`](docs/api_midi_device.md#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2) {#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2}
#### `public midi_var_byte_func_t `[`input_fallthrough_callback`](docs/api_midi_device.md#struct__midi__device_1abb974ec6d734001b4a0e370f292be503) {#struct__midi__device_1abb974ec6d734001b4a0e370f292be503}
#### `public midi_var_byte_func_t `[`input_catchall_callback`](docs/api_midi_device.md#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8) {#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8}
#### `public midi_no_byte_func_t `[`pre_input_process_callback`](docs/api_midi_device.md#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754) {#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754}
#### `public uint8_t `[`input_buffer`](docs/api_midi_device.md#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a) {#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a}
#### `public input_state_t `[`input_state`](docs/api_midi_device.md#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39) {#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39}
#### `public uint16_t `[`input_count`](docs/api_midi_device.md#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d) {#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d}
#### `public uint8_t `[`input_queue_data`](docs/api_midi_device.md#struct__midi__device_1ada41de021135dc423abedcbb30f366ff) {#struct__midi__device_1ada41de021135dc423abedcbb30f366ff}
#### `public `[`byteQueue_t`](#structbyte_queue__t)` `[`input_queue`](#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f) {#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f}
@@ -1,36 +0,0 @@
# `midi_device_setup_process` グループ {#group__midi__device__setup__process}
<!---
original document: 0.10.9:docs/internals_midi_device_setup_process.md
git diff 0.10.9 HEAD -- docs/internals_midi_device_setup_process.md | cat
-->
これらは、デバイスを初期化して実行するために使う必要があるメソッドです。
## 概要
メンバー | 説明
--------------------------------|---------------------------------------------
`public void `[`midi_device_init`](#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9)`(`[`MidiDevice`](#struct__midi__device)` * device)` | デバイスを初期化します。
`public void `[`midi_device_process`](#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 入力データを処理します。
## メンバー
#### `public void `[`midi_device_init`](#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9}
デバイスを初期化します。
問題のデバイスを使う前にこれを呼び出す必要があります。
#### パラメータ
* `device` 初期化するデバイス
#### `public void `[`midi_device_process`](#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b}
入力データを処理します。
このメソッドは入力処理を駆動します。入力コールバックが呼び出されることが予想される場合は、このメソッドを頻繁に呼び出す必要があります。
#### パラメータ
* `device` 処理するデバイス
-59
View File
@@ -1,59 +0,0 @@
# `midi_util` グループ {#group__midi__util}
<!---
original document: 0.10.9:docs/internals_midi_util.md
git diff 0.10.9 HEAD -- docs/internals_midi_util.md | cat
-->
## 概要
| メンバー | 説明
--------------------------------|---------------------------------------------
| `enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) | 可能なパケット長の値の列挙型。
| `public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` | 指定されたバイトがステータスバイトであるかどうかを検査します。
| `public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` | 指定されたバイトがリアルタイムメッセージであるかどうかを検査します。
| `public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` | 指定されたステータスバイトに関連付けられたパケットの長さを調べます。
## メンバー
#### `enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) {#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e}
| 値 | 説明
--------------------------------|---------------------------------------------
UNDEFINED |
ONE |
TWO |
THREE |
可能なパケット長の値の列挙型。
#### `public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` {#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5}
指定されたバイトがステータスバイトであるかどうかを検査します。
#### パラメータ
* `theByte` 検査するバイト
#### 返り値
指定されたバイトが MIDI ステータスバイトの場合は true
#### `public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` {#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7}
指定されたバイトがリアルタイムメッセージであるかどうかを検査します。
#### パラメータ
* `theByte` 検査するバイト
#### 返り値
リアルタイムメッセージの場合は true、それ以外の場合は false
#### `public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` {#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175}
指定されたステータスバイトに関連付けられたパケットの長さを調べます。
#### パラメータ
* `status` ステータスバイト
#### 返り値
パケットの長さ。バイトがステータスバイトではない場合、あるいは sysex ステータスバイトの場合は、UNDEFINED を返します。
-246
View File
@@ -1,246 +0,0 @@
# `send_functions` グループ {#group__send__functions}
<!---
original document: 0.10.9:docs/internals_send_functions.md
git diff 0.10.9 HEAD -- docs/internals_send_functions.md | cat
-->
これらは、デバイスを介して MIDI データを送信するために使う関数です。
## 概要
メンバー | 説明
--------------------------------|---------------------------------------------
`public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` | 指定されたデバイスを介して、コントロールチェンジメッセージを送信します。
`public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | 指定されたデバイスを介してノートオンメッセージを送信します。
`public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | 指定されたデバイスを介してノートオフメッセージを送信します。
`public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` | 指定されたデバイスを介してアフタータッチメッセージを送信します。
`public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` | 指定されたデバイスを介してピッチベンドメッセージを送信します。
`public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` | 指定されたデバイスを介してプログラムチェンジメッセージを送信します。
`public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` | 指定されたデバイスを介してチャンネルプレッシャーメッセージを送信します。
`public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してクロックメッセージを送信します。
`public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してティックメッセージを送信します。
`public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してスタートメッセージを送信します。
`public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してコンティニューメッセージを送信します。
`public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してストップメッセージを送信します。
`public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してアクティブセンスメッセージを送信します。
`public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してリセットメッセージを送信します。
`public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` | 指定されたデバイスを介してタイムコードクォータフレームメッセージを送信します。
`public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` | 指定されたデバイスを介してソングポジションメッセージを送信します。
`public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` | 指定されたデバイスを介してソングセレクトメッセージを送信します。
`public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` | 指定されたデバイスを介してチューンリクエストメッセージを送信します。
`public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` | 指定されたデバイスを介してバイトを送信します。
`public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` | 最大3バイトのデータを送信します。
`public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` | フォーマットされた MIDI データの配列を送信します。
## メンバー
#### `public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` {#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960}
指定されたデバイスを介して、コントロールチェンジメッセージ(cc)を送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `chan` 送信するチャンネル、0-15
* `num` コントロールチェンジナンバー
* `val` コントロールチェンジナンバーの値
#### `public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` {#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775}
指定されたデバイスを介してノートオンメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `chan` 送信するチャンネル、0-15
* `num` ノート番号
* `vel` ノートベロシティ
#### `public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` {#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49}
指定されたデバイスを介してノートオフメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `chan` 送信するチャンネル、0-15
* `num` ノート番号
* `vel` ノートベロシティ
#### `public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` {#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f}
指定されたデバイスを介してアフタータッチメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `chan` 送信するチャンネル、0-15
* `note_num` ノート番号
* `amt` アフタータッチ量
#### `public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` {#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491}
指定されたデバイスを介してピッチベンドメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `chan` 送信するチャンネル、0-15
* `amt` ベンド量の範囲: -8192..8191、0 はベンドしないことを意味します
#### `public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` {#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86}
指定されたデバイスを介してプログラムチェンジメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `chan` 送信するチャンネル、0-15
* `num` 変更先のプログラム
#### `public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` {#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b}
指定されたデバイスを介してチャンネルプレッシャーメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `chan` 送信するチャンネル、0-15
* `amt` チャンネルプレッシャーの量
#### `public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa}
指定されたデバイスを介してクロックメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
#### `public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga2b43c7d433d940c5b907595aac947972}
指定されたデバイスを介してティックメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
#### `public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc}
指定されたデバイスを介してスタートメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
#### `public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120}
指定されたデバイスを介してコンティニューメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
#### `public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988}
指定されたデバイスを介してストップメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
#### `public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37}
指定されたデバイスを介してアクティブセンスメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
#### `public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b}
指定されたデバイスを介してリセットメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
#### `public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` {#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a}
指定されたデバイスを介してタイムコードクォータフレームメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `time` このクォータフレームの時間。範囲は、0..16383
#### `public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` {#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f}
指定されたデバイスを介してソングポジションメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `pos` ソングポジション
#### `public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` {#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50}
指定されたデバイスを介してソングセレクトメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
* `song` 選択するソング
#### `public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656}
指定されたデバイスを介してチューンリクエストメッセージを送信します。
#### パラメータ
* `device` 送信に使うデバイス
#### `public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` {#group__send__functions_1ga857e85eb90b288385642d4d991e09881}
指定されたデバイスを介してバイトを送信します。
これは、指定された MIDI デバイスを介してデータを送信する一般的なメソッドです。これは、この API に実装されていない sysex データまたはメッセージがある場合、それらを送信するのに役立ちます。そのようなものを見つけた場合は、私たちがそれらを追加できるように、作者に連絡してください。
#### パラメータ
* `device` 送信に使うデバイス
* `b` 送信するバイト
#### `public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` {#group__send__functions_1ga36e2f2e45369d911b76969361679054b}
最大3バイトのデータを送信します。
これを使って sysex を通過できるように count に4の剰余が適用されます。
#### パラメータ
* `device` 送信に使うデバイス
* `count` 送信するバイト数、4の剰余が適用されます
* `byte0` 最初のバイト
* `byte1` 2番目のバイト。cnt % 4 != 2 の場合は無視されます
* `byte2` 3番目のバイト。cnt % 4 != 3 の場合は無視されます
#### `public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` {#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead}
フォーマットされた MIDI データの配列を送信します。
sysex に使うことができます。
#### パラメータ
* `device` 送信に使うデバイス
* `count` 送信するバイト数
* `array` バイトの配列
-66
View File
@@ -1,66 +0,0 @@
# `sysex_tools` グループ {#group__sysex__tools}
<!---
original document: 0.10.9:docs/internals_sysex_tools.md
git diff 0.10.9 HEAD -- docs/internals_sysex_tools.md | cat
-->
## 概要
| メンバー | 説明
--------------------------------|---------------------------------------------
| `public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` | エンコード後のメッセージの長さを計算します。
| `public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` | デコード後のメッセージの長さを計算します。
| `public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` | sysex メッセージで安全に送信できるようにデータをエンコードします。
| `public uint16_t `[`sysex_decode`](#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229)`(uint8_t * decoded,const uint8_t * source,uint16_t length)` | エンコードされたデータをデコードします。
## メンバー
#### `public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` {#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a}
エンコード後のメッセージの長さを計算します。
#### パラメータ
* `decoded_length` エンコードするメッセージの長さのバイト数。
#### 返り値
エンコード後のメッセージの長さのバイト数。
#### `public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` {#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0}
デコード後のメッセージの長さを計算します。
#### パラメータ
* `encoded_length` エンコードされたメッセージの長さのバイト数。
#### 返り値
デコードされた後のメッセージの長さのバイト数。
#### `public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` {#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742}
sysex メッセージで安全に送信できるようにデータをエンコードします。
#### パラメータ
* `encoded` 出力データバッファは、少なくとも sysex_encoded_length(length) バイトの長さが必要です。
* `source` エンコードされるデータの入力バッファ。
* `length` 入力バッファからエンコードするバイト数。
#### 返り値
エンコードされたバイト数。
#### `public uint16_t `[`sysex_decode`](#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229)`(uint8_t * decoded,const uint8_t * source,uint16_t length)` {#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229}
エンコードされたデータをデコードします。
#### パラメータ
* `decoded` 出力データバッファは、少なくとも sysex_decoded_length(length) バイトの長さが必要です。
* `source` デコードされるデータの入力バッファ。
* `length` 入力バッファからデコードするバイト数。
#### 返り値
デコードされたバイト数。
+1 -1
View File
@@ -27,7 +27,7 @@ QMK で現在サポートされているキーボードが Pro Micro(または
#endif
```
`PORTB/DDRB` などが定義されていないというエラーが発生した場合は、ARM と AVR の両方で機能する [GPIO 制御](ja/internals_gpio_control.md) を使用するようにキーボードのコードを変換する必要があります。これは AVR ビルドにまったく影響を与えません。
`PORTB/DDRB` などが定義されていないというエラーが発生した場合は、ARM と AVR の両方で機能する [GPIO 制御](ja/gpio_control.md) を使用するようにキーボードのコードを変換する必要があります。これは AVR ビルドにまったく影響を与えません。
Proton C には1つのオンボード LED(C13)しかなく、デフォルトでは TXLED(D5) がそれにマップされています。代わりに RXLED(B0) をそれにマッピングしたい場合は、`config.h` に次のように追加してください。
+6 -5
View File
@@ -219,11 +219,12 @@ See also: [Basic Keycodes](keycodes_basic.md)
See also: [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
|Key |Aliases |Description |
|-----------------|---------|-------------------------------------------------------|
|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory)|
|Key |Aliases |Description |
|-----------------|---------|---------------------------------------------------------------------------------|
|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
|`QK_MAKE` | |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held |
## Audio Keys :id=audio-keys
+1 -1
View File
@@ -20,7 +20,7 @@ This exposes the `CONVERT_TO_PROTON_C` flag that you can use in your code with `
#endif
```
If you get errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](internals_gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
If you get errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this like to your `config.h`:
+6 -5
View File
@@ -8,8 +8,9 @@ On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are
## QMK Keycodes :id=qmk-keycodes
|Key |Aliases |Description |
|-----------------|---------|-------------------------------------------------------|
|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory)|
|Key |Aliases |Description |
|-----------------|---------|---------------------------------------------------------------------------------|
|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
|`QK_MAKE` | |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held |
+8 -8
View File
@@ -146,7 +146,7 @@
* [EEPROM驱动](zh-cn/eeprom_driver.md)
* [串口驱动](zh-cn/serial_driver.md)
* [UART驱动](zh-cn/uart_driver.md)
* [操控GPIO](zh-cn/internals_gpio_control.md)
* [操控GPIO](zh-cn/gpio_control.md)
* [键盘开发指引](zh-cn/hardware_keyboard_guidelines.md)
* Python开发
@@ -182,12 +182,12 @@
* [了解QMK](zh-cn/understanding_qmk.md)
* QMK内部细节 (编辑中)
* [定义](zh-cn/internals_defines.md)
* [输入回调的注册](zh-cn/internals_input_callback_reg.md)
* [Midi设备](zh-cn/internals_midi_device.md)
* [Midi设备驱动流程](zh-cn/internals_midi_device_setup_process.md)
* [Midi辅助功能](zh-cn/internals_midi_util.md)
* [发送函数](zh-cn/internals_send_functions.md)
* [Sysex工具](zh-cn/internals_sysex_tools.md)
* [定义](zh-cn/internals/defines.md)
* [输入回调的注册](zh-cn/internals/input_callback_reg.md)
* [Midi设备](zh-cn/internals/midi_device.md)
* [Midi设备驱动流程](zh-cn/internals/midi_device_setup_process.md)
* [Midi辅助功能](zh-cn/internals/midi_util.md)
* [发送函数](zh-cn/internals/send_functions.md)
* [Sysex工具](zh-cn/internals/sysex_tools.md)
<!--fromen:20211014-12:00(GMT+8) commit 04cf161aa01fd433b5dae69d9fd31569ed5dca59-->
+58
View File
@@ -0,0 +1,58 @@
/* Copyright 2022
*
* 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/>.
*/
#include "sn74x154.h"
#include "gpio.h"
#define ADDRESS_PIN_COUNT 4
#ifndef SN74X154_ADDRESS_PINS
# error sn74x154: no address pins defined!
#endif
static const pin_t address_pins[ADDRESS_PIN_COUNT] = SN74X154_ADDRESS_PINS;
void sn74x154_init(void) {
for (int i = 0; i < ADDRESS_PIN_COUNT; i++) {
setPinOutput(address_pins[i]);
writePinLow(address_pins[i]);
}
#if defined(SN74X154_E0_PIN)
setPinOutput(SN74X154_E0_PIN);
writePinHigh(SN74X154_E0_PIN);
#endif
#if defined(SN74X154_E1_PIN)
setPinOutput(SN74X154_E1_PIN);
writePinHigh(SN74X154_E1_PIN);
#endif
}
void sn74x154_set_enabled(bool enabled) {
#if defined(SN74X154_E0_PIN)
writePin(SN74X154_E0_PIN, !enabled);
#endif
#if defined(SN74X154_E1_PIN)
writePin(SN74X154_E1_PIN, !enabled);
#endif
}
void sn74x154_set_addr(uint8_t address) {
for (int i = 0; i < ADDRESS_PIN_COUNT; i++) {
writePin(address_pins[i], address & (1 << i));
}
}
+48
View File
@@ -0,0 +1,48 @@
/* Copyright 2022
*
* 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/>.
*/
#pragma once
#include <stdint.h>
#include <stdbool.h>
/**
* Driver for 74x154 4-to-16 decoder/demultiplexer with inverting outputs
* https://assets.nexperia.com/documents/data-sheet/74HC_HCT154.pdf
*/
/**
* Initialize the address and output enable pins.
*/
void sn74x154_init(void);
/**
* Set the enabled state.
*
* When enabled is true, pulls the E0 and E1 pins low.
*
* \param enabled The enable state to set.
*/
void sn74x154_set_enabled(bool enabled);
/**
* Set the output pin address.
*
* The selected output pin will be pulled low, while the remaining output pins will be high.
*
* \param address The address to set, from 0 to 15.
*/
void sn74x154_set_addr(uint8_t address);
+284
View File
@@ -0,0 +1,284 @@
/*
Copyright 2022
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/>.
*/
#include "hd44780.h"
#include "gpio.h"
#include "progmem.h"
#include "wait.h"
#ifndef HD44780_DATA_PINS
# error hd44780: no data pins defined!
#endif
#ifndef HD44780_RS_PIN
# error hd44780: no RS pin defined!
#endif
#ifndef HD44780_RW_PIN
# error hd44780: no R/W pin defined!
#endif
#ifndef HD44780_E_PIN
# error hd44780: no E pin defined!
#endif
static const pin_t data_pins[4] = HD44780_DATA_PINS;
#ifndef HD44780_DISPLAY_COLS
# define HD44780_DISPLAY_COLS 16
#endif
#ifndef HD44780_DISPLAY_LINES
# define HD44780_DISPLAY_LINES 2
#endif
#ifndef HD44780_DDRAM_LINE0_ADDR
# define HD44780_DDRAM_LINE0_ADDR 0x00
#endif
#ifndef HD44780_DDRAM_LINE1_ADDR
# define HD44780_DDRAM_LINE1_ADDR 0x40
#endif
#define HD44780_INIT_DELAY_MS 16
#define HD44780_ENABLE_DELAY_US 1
static void hd44780_latch(void) {
writePinHigh(HD44780_E_PIN);
wait_us(HD44780_ENABLE_DELAY_US);
writePinLow(HD44780_E_PIN);
}
void hd44780_write(uint8_t data, bool isData) {
writePin(HD44780_RS_PIN, isData);
writePinLow(HD44780_RW_PIN);
for (int i = 0; i < 4; i++) {
setPinOutput(data_pins[i]);
}
// Write high nibble
for (int i = 0; i < 4; i++) {
writePin(data_pins[i], (data >> 4) & (1 << i));
}
hd44780_latch();
// Write low nibble
for (int i = 0; i < 4; i++) {
writePin(data_pins[i], data & (1 << i));
}
hd44780_latch();
for (int i = 0; i < 4; i++) {
writePinHigh(data_pins[i]);
}
}
uint8_t hd44780_read(bool isData) {
uint8_t data = 0;
writePin(HD44780_RS_PIN, isData);
writePinHigh(HD44780_RW_PIN);
for (int i = 0; i < 4; i++) {
setPinInput(data_pins[i]);
}
writePinHigh(HD44780_E_PIN);
wait_us(HD44780_ENABLE_DELAY_US);
// Read high nibble
for (int i = 0; i < 4; i++) {
data |= (readPin(data_pins[i]) << i);
}
data <<= 4;
writePinLow(HD44780_E_PIN);
wait_us(HD44780_ENABLE_DELAY_US);
writePinHigh(HD44780_E_PIN);
wait_us(HD44780_ENABLE_DELAY_US);
// Read low nibble
for (int i = 0; i < 4; i++) {
data |= (readPin(data_pins[i]) << i);
}
writePinLow(HD44780_E_PIN);
return data;
}
bool hd44780_busy(void) {
return hd44780_read(false) & HD44780_BUSY_FLAG;
}
void hd44780_command(uint8_t command) {
while (hd44780_busy())
;
hd44780_write(command, false);
}
void hd44780_data(uint8_t data) {
while (hd44780_busy())
;
hd44780_write(data, true);
}
void hd44780_clear(void) {
hd44780_command(HD44780_CMD_CLEAR_DISPLAY);
}
void hd44780_home(void) {
hd44780_command(HD44780_CMD_RETURN_HOME);
}
void hd44780_on(bool cursor, bool blink) {
if (cursor) {
if (blink) {
hd44780_command(HD44780_CMD_DISPLAY | HD44780_DISPLAY_ON | HD44780_DISPLAY_CURSOR | HD44780_DISPLAY_BLINK);
} else {
hd44780_command(HD44780_CMD_DISPLAY | HD44780_DISPLAY_ON | HD44780_DISPLAY_CURSOR);
}
} else {
hd44780_command(HD44780_CMD_DISPLAY | HD44780_DISPLAY_ON);
}
}
void hd44780_off() {
hd44780_command(HD44780_CMD_DISPLAY);
}
void hd44780_set_cgram_address(uint8_t address) {
hd44780_command(HD44780_CMD_SET_CGRAM_ADDRESS + (address & 0x3F));
}
void hd44780_set_ddram_address(uint8_t address) {
hd44780_command(HD44780_CMD_SET_DDRAM_ADDRESS + (address & 0x7F));
}
void hd44780_init(bool cursor, bool blink) {
setPinOutput(HD44780_RS_PIN);
setPinOutput(HD44780_RW_PIN);
setPinOutput(HD44780_E_PIN);
for (int i = 0; i < 4; i++) {
setPinOutput(data_pins[i]);
}
wait_ms(HD44780_INIT_DELAY_MS);
// Manually configure for 4-bit mode - can't use hd44780_command() yet
// HD44780U datasheet, Fig. 24 (p46)
writePinHigh(data_pins[0]); // Function set
writePinHigh(data_pins[1]); // DL = 1
hd44780_latch();
wait_ms(5);
// Send again
hd44780_latch();
wait_us(64);
// And again (?)
hd44780_latch();
wait_us(64);
writePinLow(data_pins[0]); // DL = 0
hd44780_latch();
wait_us(64);
#if HD44780_DISPLAY_LINES == 1
hd44780_command(HD44780_CMD_FUNCTION); // 4 bit, 1 line, 5x8 dots
#else
hd44780_command(HD44780_CMD_FUNCTION | HD44780_FUNCTION_2_LINES); // 4 bit, 2 lines, 5x8 dots
#endif
hd44780_on(cursor, blink);
hd44780_clear();
hd44780_home();
hd44780_command(HD44780_CMD_ENTRY_MODE | HD44780_ENTRY_MODE_INC);
}
void hd44780_set_cursor(uint8_t col, uint8_t line) {
register uint8_t address = col;
#if HD44780_DISPLAY_LINES == 1
address += HD44780_DDRAM_LINE0_ADDR;
#elif HD44780_DISPLAY_LINES == 2
if (line == 0) {
address += HD44780_DDRAM_LINE0_ADDR;
} else {
address += HD44780_DDRAM_LINE1_ADDR;
}
#endif
hd44780_set_ddram_address(address);
}
void hd44780_define_char(uint8_t index, uint8_t *data) {
hd44780_set_cgram_address((index & 0x7) << 3);
for (uint8_t i = 0; i < 8; i++) {
hd44780_data(data[i]);
}
}
void hd44780_putc(char c) {
while (hd44780_busy())
;
uint8_t current_position = hd44780_read(false);
if (c == '\n') {
hd44780_set_cursor(0, current_position < HD44780_DDRAM_LINE1_ADDR ? 1 : 0);
} else {
#if defined(HD44780_WRAP_LINES)
# if HD44780_DISPLAY_LINES == 1
if (current_position == HD44780_DDRAM_LINE0_ADDR + HD44780_DISPLAY_COLS) {
// Go to start of line
hd44780_set_cursor(0, 0);
}
# elif HD44780_DISPLAY_LINES == 2
if (current_position == HD44780_DDRAM_LINE0_ADDR + HD44780_DISPLAY_COLS) {
// Go to start of second line
hd44780_set_cursor(0, 1);
} else if (current_position == HD44780_DDRAM_LINE1_ADDR + HD44780_DISPLAY_COLS) {
// Go to start of first line
hd44780_set_cursor(0, 0);
}
# endif
#endif
hd44780_data(c);
}
}
void hd44780_puts(const char *s) {
register char c;
while ((c = *s++)) {
hd44780_putc(c);
}
}
#if defined(__AVR__)
void hd44780_define_char_P(uint8_t index, const uint8_t *data) {
hd44780_set_cgram_address(index << 3);
for (uint8_t i = 0; i < 8; i++) {
hd44780_data(pgm_read_byte(data++));
}
}
void hd44780_puts_P(const char *s) {
register char c;
while ((c = pgm_read_byte(s++))) {
hd44780_putc(c);
}
}
#endif
+220
View File
@@ -0,0 +1,220 @@
/*
Copyright 2022
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/>.
*/
#pragma once
#include <stdint.h>
#include <stdbool.h>
/**
* \defgroup hd44780
*
* HD44780 Character LCD Driver
* \{
*/
/*
* HD44780 instructions
* https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
* Table 6 (p24)
*/
// Clear display
#define HD44780_CMD_CLEAR_DISPLAY 0x01
// Return home
#define HD44780_CMD_RETURN_HOME 0x02
// Entry mode set
#define HD44780_CMD_ENTRY_MODE 0x04
#define HD44780_ENTRY_MODE_INC 0x02 // I/D
#define HD44780_ENTRY_MODE_SHIFT 0x01 // S
// Display on/off control
#define HD44780_CMD_DISPLAY 0x08
#define HD44780_DISPLAY_ON 0x04 // D
#define HD44780_DISPLAY_CURSOR 0x02 // C
#define HD44780_DISPLAY_BLINK 0x01 // B
// Cursor or display shift
#define HD44780_CMD_MOVE 0x10
#define HD44780_MOVE_DISPLAY 0x08 // S/C
#define HD44780_MOVE_RIGHT 0x04 // R/L
// Function set
#define HD44780_CMD_FUNCTION 0x20
#define HD44780_FUNCTION_8_BIT 0x10 // DL
#define HD44780_FUNCTION_2_LINES 0x08 // N
#define HD44780_FUNCTION_5X10_DOTS 0x04 // F
// Set CGRAM address
#define HD44780_CMD_SET_CGRAM_ADDRESS 0x40
// Set DDRAM address
#define HD44780_CMD_SET_DDRAM_ADDRESS 0x80
// Bitmask for busy flag when reading
#define HD44780_BUSY_FLAG 0x80
/**
* \brief Write a byte to the display.
*
* \param data The byte to send to the display.
* \param isData Whether the byte is an instruction or character data.
*/
void hd44780_write(uint8_t data, bool isData);
/**
* \brief Read a byte from the display.
*
* \param isData Whether to read the current cursor position, or the character at the cursor.
*
* \return If `isData` is `true`, the returned byte will be the character at the current DDRAM address. Otherwise, it will be the current DDRAM address and the busy flag.
*/
uint8_t hd44780_read(bool isData);
/**
* \brief Indicates whether the display is currently processing, and cannot accept instructions.
*
* \return `true` if the display is busy.
*/
bool hd44780_busy(void);
/**
* \brief Send a command to the display. Refer to the datasheet for the valid commands.
*
* This function waits for the display to clear the busy flag before sending the command.
*
* \param command The command to send.
*/
void hd44780_command(uint8_t command);
/**
* \brief Send a byte of data to the display.
*
* This function waits for the display to clear the busy flag before sending the data.
*
* \param data The byte of data to send.
*/
void hd44780_data(uint8_t data);
/**
* \brief Clear the display.
*
* This function is called on init.
*/
void hd44780_clear(void);
/**
* \brief Move the cursor to the home position.
*
* This function is called on init.
*/
void hd44780_home(void);
/**
* \brief Turn the display on, and/or set the cursor position.
*
* This function is called on init.
*
* \param cursor Whether to show the cursor.
* \param blink Whether to blink the cursor, if shown.
*/
void hd44780_on(bool cursor, bool blink);
/**
* \brief Turn the display off.
*/
void hd44780_off(void);
/**
* \brief Set the CGRAM address.
*
* This function is used when defining custom characters.
*
* \param address The CGRAM address to move to, from `0x00` to `0x3F`.
*/
void hd44780_set_cgram_address(uint8_t address);
/**
* \brief Set the DDRAM address.
*
* This function is used when printing characters to the display, and setting the cursor.
*
* \param address The DDRAM address to move to, from `0x00` to `0x7F`.
*/
void hd44780_set_ddram_address(uint8_t address);
/**
* \brief Initialize the display.
*
* This function should be called only once, before any of the other functions can be called.
*
* \param cursor Whether to show the cursor.
* \param blink Whether to blink the cursor, if shown.
*/
void hd44780_init(bool cursor, bool blink);
/**
* \brief Move the cursor to the specified position on the display.
*
* \param col The column number to move to, from 0 to 15 on 16x2 displays.
* \param line The line number to move to, either 0 or 1 on 16x2 displays.
*/
void hd44780_set_cursor(uint8_t col, uint8_t line);
/**
* \brief Define a custom character.
*
* \param index The index of the custom character to define, from 0 to 7.
* \param data An array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column.
*/
void hd44780_define_char(uint8_t index, uint8_t *data);
/**
* \brief Print a character to the display. The newline character will move the cursor to the start of the next line.
*
* The exact character shown may depend on the ROM code of your particular display - refer to the datasheet for the full character set.
*
* \param c The character to print.
*/
void hd44780_putc(char c);
/**
* \brief Print a string of characters to the display.
*
* \param s The string to print.
*/
void hd44780_puts(const char *s);
#if defined(__AVR__) || defined(__DOXYGEN__)
/**
* \brief Define a custom character from PROGMEM.
*
* On ARM devices, this function is simply an alias of hd44780_define_char().
*
* \param index The index of the custom character to define, from 0 to 7.
* \param data A PROGMEM array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column.
*/
void hd44780_define_char_P(uint8_t index, const uint8_t *data);
/**
* \brief Print a string of characters from PROGMEM to the display.
*
* On ARM devices, this function is simply an alias of hd44780_puts().
*
* \param s The PROGMEM string to print.
*/
void hd44780_puts_P(const char *s);
#else
# define hd44780_define_char_P(index, data) hd44780_define_char(index, data)
# define hd44780_puts_P(s) hd44780_puts(s)
#endif
/** \} */
+5 -1
View File
@@ -57,6 +57,10 @@
# define ISSI_PERSISTENCE 0
#endif
#ifndef ISSI_PWM_FREQUENCY
# define ISSI_PWM_FREQUENCY 0b000 // PFS - IS31FL3737B only
#endif
#ifndef ISSI_SWPULLUP
# define ISSI_SWPULLUP PUR_0R
#endif
@@ -159,7 +163,7 @@ void IS31FL3737_init(uint8_t addr) {
// Set global current to maximum.
IS31FL3737_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown.
IS31FL3737_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
IS31FL3737_write_register(addr, ISSI_REG_CONFIGURATION, ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);
// Wait 10ms to ensure the device has woken up.
wait_ms(10);
+5
View File
@@ -30,6 +30,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 6
#define MATRIX_COLS 16
#define MATRIX_ROW_PINS { C7, B1, B2, C6, B4, B5 }
#define SN74X154_ADDRESS_PINS { D4, D5, D6, D7 }
#define SN74X154_E1_PIN D3
#define LED_NUM_LOCK_PIN D0
#define LED_CAPS_LOCK_PIN B7
#define LED_SCROLL_LOCK_PIN D1
+83 -73
View File
@@ -1,91 +1,101 @@
/* Copyright 2022
*
* 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/>.
*/
#include "matrix.h"
#include "gpio.h"
#include "sn74x154.h"
static uint8_t read_rows(void) {
return (readPin(C7) ? 0 : 1) |
(readPin(B1) ? 0 : 2) |
(readPin(B2) ? 0 : 4) |
(readPin(C6) ? 0 : 8) |
(readPin(B4) ? 0 : 16) |
(readPin(B5) ? 0 : 32);
}
static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
/* All columns use a 74HC154 4-to-16 demultiplexer.
* D3 is the enable pin, must be set high to use it.
*
* A3 A2 A1 A0
* D7 D6 D5 D4
* 0: 0 0 0 0
* 1: 0 0 0 1
* 2: 0 0 1 0
* 3: 0 0 1 1
* 4: 0 1 0 0
* 5: 0 1 0 1
* 6: 0 1 1 0
* 7: 0 1 1 1
* 8: 1 0 0 0
* 9: 1 0 0 1
* 10: 1 0 1 0
* 11: 1 0 1 1
* 12: 1 1 0 0
* 13: 1 1 0 1
* 14: 1 1 1 0
* 15: 1 1 1 1
*/
static void select_col(uint8_t col) {
writePinLow(D3);
writePin(D4, (col & 1));
writePin(D5, (col & 2));
writePin(D6, (col & 4));
writePin(D7, (col & 8));
sn74x154_set_addr(col);
}
static void unselect_cols(void) {
writePinHigh(D3);
static void init_pins(void) {
for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
setPinInputHigh(row_pins[x]);
}
}
static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) {
bool matrix_changed = false;
// Select col and wait for col seleciton to stabilize
select_col(current_col);
matrix_io_delay();
// For each row...
for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {
// Store last value of row prior to reading
matrix_row_t last_row_value = current_matrix[row_index];
// Check row pin state
if (readPin(row_pins[row_index]) == 0) {
// Pin LO, set col bit
current_matrix[row_index] |= (MATRIX_ROW_SHIFTER << current_col);
} else {
// Pin HI, clear col bit
current_matrix[row_index] &= ~(MATRIX_ROW_SHIFTER << current_col);
}
// Determine if the matrix changed state
if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) {
matrix_changed = true;
}
}
return matrix_changed;
}
void matrix_init_custom(void) {
/* 74HC154 col pin configuration
* pin: D3 D7 D6 D5 D4
* row: off 0 x x x x
* 0 1 0 0 0 0
* 1 1 0 0 0 1
* 2 1 0 0 1 0
* 3 1 0 0 1 1
* 4 1 0 1 0 0
* 5 1 0 1 0 1
* 6 1 0 1 1 0
* 7 1 0 1 1 1
* 8 1 1 0 0 0
* 9 1 1 0 0 1
* 10 1 1 0 1 0
* 11 1 1 0 1 1
* 12 1 1 1 0 0
* 13 1 1 1 0 1
* 14 1 1 1 1 0
* 15 1 1 1 1 1
*/
setPinOutput(D3);
writePinHigh(D3);
setPinOutput(D4);
setPinOutput(D5);
setPinOutput(D6);
setPinOutput(D7);
/* Row pin configuration
*
* row: 0 1 2 3 4 5
* pin: C7 B1 B2 C6 B4 B5
*
*/
setPinInputHigh(C7);
setPinInputHigh(B1);
setPinInputHigh(B2);
setPinInputHigh(C6);
setPinInputHigh(B4);
setPinInputHigh(B5);
// initialize demultiplexer
sn74x154_init();
sn74x154_set_enabled(true);
// initialize key pins
init_pins();
}
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
bool changed = false;
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
select_col(col);
matrix_io_delay();
uint8_t rows = read_rows();
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
bool prev_bit = current_matrix[row] & ((matrix_row_t)1 << col);
bool curr_bit = rows & (1 << row);
if (prev_bit != curr_bit) {
current_matrix[row] ^= ((matrix_row_t)1 << col);
changed = true;
}
}
unselect_cols();
// Set col, read rows
for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
changed |= read_rows_on_col(current_matrix, current_col);
}
return changed;
+2 -1
View File
@@ -18,4 +18,5 @@ RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
CUSTOM_MATRIX = lite
SRC += matrix.c
VPATH += drivers/gpio
SRC += matrix.c sn74x154.c
+2 -1
View File
@@ -61,7 +61,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define ENCODERS_PAD_A {B2 , B4}
#define ENCODERS_PAD_B {B6 , B5}
#define ENCODER_RESOLUTIONS { 4, 4, 4, 1}
#define ENCODER_RESOLUTIONS { 4, 4 }
#define ENCODER_RESOLUTIONS_RIGHT { 4, 1 }
#define UNUSED_PINS
#define EE_HANDS
+22 -21
View File
@@ -24,27 +24,28 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
/* col 0: C7
* col 1: B6
* col 2: C6
* col 3: B4
* col 4: B5
* col 5: D7
/* Columns 6-12 use a 74HC138 3-to-8 demultiplexer.
*
* These columns use a 74HC138 3 to 8 bit demultiplexer.
* A2 A1 A0
* col / pin: PD0 PD1 PD2
* 6: 1 1 1
* 7: 1 1 0
* 8: 1 0 1
* 9: 1 0 0
* 10: 0 1 1
* 11: 0 1 0
* 12: 0 0 1
* 0: C7
* 1: B6
* 2: C6
* 3: B4
* 4: B5
* 5: D7
*
* col 13: D3
* col 14: B7
* col 15: B3
* A2 A1 A0
* D0 D1 D2
* 6: 1 1 1
* 7: 1 1 0
* 8: 1 0 1
* 9: 1 0 0
* 10: 0 1 1
* 11: 0 1 0
* 12: 0 0 1
*
* 13: D3
* 14: B7
* 15: B3
*/
static void select_col(uint8_t col) {
if (col_pins[col] != NO_PIN) {
@@ -117,10 +118,10 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
}
void matrix_init_custom(void) {
// initialize key pins
init_pins();
// initialize demultiplexer
sn74x138_init();
// initialize key pins
init_pins();
}
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+3 -8
View File
@@ -41,22 +41,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#define MATRIX_ROW_PINS { E6, C7, C6, B6, B5, B4, D7, D6 }
#define MATRIX_COL_PINS { }
#define MATRIX_COL_PINS { F7, F5, F6, F1, F4, F0, NO_PIN, D5, D3, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN, NO_PIN } // Columns 6 and 9-15 controlled by demux
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION ROW2COL
#define SN74X138_ADDRESS_PINS { D2, D1, D0 }
#define SN74X138_E3_PIN D4
// For QMK DFU
#define QMK_ESC_OUTPUT E6
#define QMK_ESC_INPUT F0
#define QMK_LED B1
/*
* Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
*/
//#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
#define LED_NUM_LOCK_PIN B3
#define LED_CAPS_LOCK_PIN B1
#define LED_SCROLL_LOCK_PIN B2
+50 -280
View File
@@ -14,280 +14,70 @@ 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/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include "wait.h"
#include "util.h"
#include "matrix.h"
#include "debounce.h"
#include "quantum.h"
#include "sn74x138.h"
#ifdef DIRECT_PINS
static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS;
#elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW)
static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
//static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
#endif
static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
// matrix code
#ifdef DIRECT_PINS
static void init_pins(void) {
for (int row = 0; row < MATRIX_ROWS; row++) {
for (int col = 0; col < MATRIX_COLS; col++) {
pin_t pin = direct_pins[row][col];
if (pin != NO_PIN) {
setPinInputHigh(pin);
}
}
}
}
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
matrix_row_t last_row_value = current_matrix[current_row];
current_matrix[current_row] = 0;
for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
pin_t pin = direct_pins[current_row][col_index];
if (pin != NO_PIN) {
current_matrix[current_row] |= readPin(pin) ? 0 : (MATRIX_ROW_SHIFTER << col_index);
}
}
return (last_row_value != current_matrix[current_row]);
}
#elif (DIODE_DIRECTION == COL2ROW)
static void select_row(uint8_t row) {
setPinOutput(row_pins[row]);
writePinLow(row_pins[row]);
}
static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
static void unselect_rows(void) {
for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
setPinInputHigh(row_pins[x]);
}
}
static void init_pins(void) {
unselect_rows();
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
setPinInputHigh(col_pins[x]);
}
}
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
// Store last value of row prior to reading
matrix_row_t last_row_value = current_matrix[current_row];
// Clear data in matrix row
current_matrix[current_row] = 0;
// Select row and wait for row selecton to stabilize
select_row(current_row);
wait_us(30);
// For each col...
for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
// Select the col pin to read (active low)
uint8_t pin_state = readPin(col_pins[col_index]);
// Populate the matrix row with the state of the col pin
current_matrix[current_row] |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index);
}
// Unselect row
unselect_row(current_row);
return (last_row_value != current_matrix[current_row]);
}
#elif (DIODE_DIRECTION == ROW2COL)
/* Cols 0 - 15
* col 0: F7
* col 1: F5
* col 2: F6
* col 3: F1
* col 4: F4
* col 5: F0
* These columns use a 74HC237D 3 to 8 bit demultiplexer. D4 is the enable pin, must be set high to use it.
* A0 A1 A2
* col / pin: PD2 PD1 PD0
* 6: 1 1 1
* col 7: D3
* col 8: B7
* 9: 0 1 1
* 10: 1 0 1
* 11: 0 0 1
* 12: 1 1 0
* 13: 0 1 0
* 14: 1 0 0
* 15: 0 0 0
/* Columns 6 and 9-15 use a 74HC138 3-to-8 demultiplexer.
* D4 is the enable pin, must be set high to use it.
*
* 0: F7
* 1: F5
* 2: F6
* 3: F1
* 4: F4
* 5: F0
*
* A2 A1 A0
* D0 D1 D2
* 6: 1 1 1
*
* 7: D5
* 8: D3
*
* 9: 1 1 0
* 10: 1 0 1
* 11: 1 0 0
* 12: 0 1 1
* 13: 0 1 0
* 14: 0 0 1
* 15: 0 0 0
*/
static void select_col(uint8_t col) {
switch (col) {
case 0:
writePinLow(F7);
break;
case 1:
writePinLow(F5);
break;
case 2:
writePinLow(F6);
break;
case 3:
writePinLow(F1);
break;
case 4:
writePinLow(F4);
break;
case 5:
writePinLow(F0);
break;
case 6:
writePinHigh(D4);
writePinHigh(D2);
writePinHigh(D1);
writePinHigh(D0);
break;
case 7:
writePinLow(D5);
break;
case 8:
writePinLow(D3);
break;
case 9:
writePinHigh(D4);
writePinHigh(D1);
writePinHigh(D0);
break;
case 10:
writePinHigh(D4);
writePinHigh(D2);
writePinHigh(D0);
break;
case 11:
writePinHigh(D4);
writePinHigh(D0);
break;
case 12:
writePinHigh(D4);
writePinHigh(D2);
writePinHigh(D1);
break;
case 13:
writePinHigh(D4);
writePinHigh(D1);
break;
case 14:
writePinHigh(D4);
writePinHigh(D2);
break;
case 15:
writePinHigh(D4);
break;
if (col_pins[col] != NO_PIN) {
writePinLow(col_pins[col]);
} else {
sn74x138_set_addr((col == 6) ? 7 : 15 - col);
sn74x138_set_enabled(true);
}
}
static void unselect_col(uint8_t col) {
switch (col) {
case 0:
writePinHigh(F7);
break;
case 1:
writePinHigh(F5);
break;
case 2:
writePinHigh(F6);
break;
case 3:
writePinHigh(F1);
break;
case 4:
writePinHigh(F4);
break;
case 5:
writePinHigh(F0);
break;
case 6:
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
break;
case 7:
writePinHigh(D5);
break;
case 8:
writePinHigh(D3);
break;
case 9:
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
break;
case 10:
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
break;
case 11:
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
break;
case 12:
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
break;
case 13:
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
break;
case 14:
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
break;
case 15:
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
break;
if (col_pins[col] != NO_PIN) {
setPinOutput(col_pins[col]);
writePinHigh(col_pins[col]);
} else {
sn74x138_set_enabled(false);
}
}
static void unselect_cols(void) {
//Native
writePinHigh(F7);
writePinHigh(F5);
writePinHigh(F6);
writePinHigh(F1);
writePinHigh(F4);
writePinHigh(F0);
writePinHigh(D3);
writePinHigh(D5);
// Native
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
if (col_pins[x] != NO_PIN) {
setPinOutput(col_pins[x]);
writePinHigh(col_pins[x]);
}
}
//Demultiplexer
writePinLow(D4);
writePinLow(D2);
writePinLow(D1);
writePinLow(D0);
// Demultiplexer
sn74x138_set_enabled(false);
}
static void init_pins(void) {
@@ -295,27 +85,14 @@ static void init_pins(void) {
for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
setPinInputHigh(row_pins[x]);
}
setPinOutput(D0);
setPinOutput(D1);
setPinOutput(D2);
setPinOutput(D3);
setPinOutput(F7);
setPinOutput(F5);
setPinOutput(F6);
setPinOutput(F1);
setPinOutput(F4);
setPinOutput(F0);
setPinOutput(D3);
setPinOutput(D5);
setPinOutput(D4);
}
static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) {
bool matrix_changed = false;
// Select col and wait for col selecton to stabilize
// Select col and wait for col selection to stabilize
select_col(current_col);
wait_us(30);
matrix_io_delay();
// For each row...
for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {
@@ -343,9 +120,9 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
return matrix_changed;
}
#endif
void matrix_init_custom(void) {
// initialize demultiplexer
sn74x138_init();
// initialize key pins
init_pins();
}
@@ -353,17 +130,10 @@ void matrix_init_custom(void) {
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
bool changed = false;
#if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW)
// Set row, read cols
for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
changed |= read_cols_on_row(current_matrix, current_row);
}
#elif (DIODE_DIRECTION == ROW2COL)
// Set col, read rows
for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
changed |= read_rows_on_col(current_matrix, current_col);
}
#endif
return changed;
}
+2 -1
View File
@@ -18,6 +18,7 @@ RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
CUSTOM_MATRIX = lite
SRC += matrix.c
VPATH += drivers/gpio
SRC += matrix.c sn74x138.c
LAYOUTS = fullsize_ansi fullsize_iso tkl_ansi tkl_iso
@@ -0,0 +1,6 @@
#pragma once
#define PRODUCT sculpt mobile astar
#define MATRIX_ROW_PINS { D7, C6, D4, D0, D1, D3, D2, E2 }
#define MATRIX_COL_PINS { B4, B5, E6, B7, B6, D6, C7, F7, F6, F4, F5, F1, F0, D5, B0, B1, B2, B3 }
@@ -0,0 +1,5 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
BOOTLOADER = caterina
@@ -29,23 +29,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 8
#define MATRIX_COLS 18
#ifdef ASTAR
#define PRODUCT sculpt mobile astar
/*0 1 2 3 4 5 6 7 8 */
#define MATRIX_ROW_PINS {D7, C6, D4, D0, D1, D3, D2, E2}
/* A B C D E F G H I J K L M N O P Q R */
#define MATRIX_COL_PINS {B4, B5, E6, B7, B6, D6, C7, F7, F6, F4,F5, F1,F0, D5, B0, B1, B2, B3}
#else
#define PRODUCT sculpt mobile teensypp
/* 0 1 2 3 4 5 6 7 */
#define MATRIX_ROW_PINS { F7,F6,F4,F5,F3,F2,F1,F0}
/* A B C D E F G H I J K L M N O P Q R */
#define MATRIX_COL_PINS { B7, D0, D1, D2, D3, D4, D5, D6, D7, E0,E1,C1, C0, C3, C2, C5, C4,C7}
#define UNUSED_PINS { B6,B5,B4,B3,B2,B1,B0 }
#endif
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION ROW2COL
+96 -91
View File
@@ -1,94 +1,99 @@
{
"keyboard_name": "MS Sculpt Mobile",
"url": "",
"maintainer": "qmk",
"layouts": {
"LAYOUT": {
"layout": [
{"label":"Esc", "x":0, "y":0},
{"label":"F1", "x":1, "y":0},
{"label":"F2", "x":2, "y":0},
{"label":"F3", "x":3, "y":0},
{"label":"F4", "x":4, "y":0},
{"label":"F5", "x":5, "y":0},
{"label":"F6", "x":6, "y":0},
{"label":"F7", "x":7, "y":0},
{"label":"F8", "x":8, "y":0},
{"label":"F9", "x":9, "y":0},
{"label":"F10", "x":10, "y":0},
{"label":"F11", "x":11, "y":0},
{"label":"F12", "x":12, "y":0},
{"label":"PrtSc", "x":13, "y":0},
{"label":"Home", "x":14, "y":0},
{"label":"End", "x":15, "y":0},
{"label":"`", "x":0, "y":1},
{"label":"1", "x":1, "y":1},
{"label":"2", "x":2, "y":1},
{"label":"3", "x":3, "y":1},
{"label":"4", "x":4, "y":1},
{"label":"5", "x":5, "y":1},
{"label":"6", "x":6, "y":1},
{"label":"7", "x":7, "y":1},
{"label":"8", "x":8, "y":1},
{"label":"9", "x":9, "y":1},
{"label":"0", "x":10, "y":1},
{"label":"-", "x":11, "y":1},
{"label":"=", "x":12, "y":1},
{"label":"Backspace", "x":13, "y":1, "w":2},
{"label":"Del", "x":15, "y":1, "h":1.6},
{"label":"Tab", "x":0, "y":2, "w":1.5},
{"label":"Q", "x":1.5, "y":2},
{"label":"W", "x":2.5, "y":2},
{"label":"E", "x":3.5, "y":2},
{"label":"R", "x":4.5, "y":2},
{"label":"T", "x":5.5, "y":2},
{"label":"Y", "x":6.5, "y":2},
{"label":"U", "x":7.5, "y":2},
{"label":"I", "x":8.5, "y":2},
{"label":"O", "x":9.5, "y":2},
{"label":"P", "x":10.5, "y":2},
{"label":"[", "x":11.5, "y":2},
{"label":"]", "x":12.5, "y":2},
{"label":"\\", "x":13.5, "y":2, "w":1.5},
{"label":"Caps Lock", "x":0, "y":3, "w":1.75},
{"label":"A", "x":1.75, "y":3},
{"label":"S", "x":2.75, "y":3},
{"label":"D", "x":3.75, "y":3},
{"label":"F", "x":4.75, "y":3},
{"label":"G", "x":5.75, "y":3},
{"label":"H", "x":6.75, "y":3},
{"label":"J", "x":7.75, "y":3},
{"label":"K", "x":8.75, "y":3},
{"label":"L", "x":9.75, "y":3},
{"label":";", "x":10.75, "y":3},
{"label":"'", "x":11.75, "y":3},
{"label":"Enter", "x":12.75, "y":3, "w":2.25},
{"label":"PgUp", "x":15, "y":2.6, "h":1.2},
{"label":"LShift", "x":0, "y":4, "w":2.25},
{"label":"Z", "x":2.25, "y":4},
{"label":"X", "x":3.25, "y":4},
{"label":"C", "x":4.25, "y":4},
{"label":"V", "x":5.25, "y":4},
{"label":"B", "x":6.25, "y":4},
{"label":"N", "x":7.25, "y":4},
{"label":"M", "x":8.25, "y":4},
{"label":",", "x":9.25, "y":4},
{"label":".", "x":10.25, "y":4},
{"label":"/", "x":11.25, "y":4},
{"label":"RShift", "x":12.25, "y":4, "w":1.75},
{"label":"Up", "x":14, "y":4},
{"label":"PgDn", "x":15, "y":3.8, "h":1.2},
{"label":"LCtrl", "x":0, "y":5, "w":1.25},
{"label":"LWin", "x":1.25, "y":5, "w":1.25},
{"label":"LAlt", "x":2.5, "y":5, "w":1.25},
{"label":"Space", "x":3.75, "y":5, "w":5.5},
{"label":"RAlt", "x":9.25, "y":5, "w":1.25},
{"label":"Fn", "x":10.5, "y":5, "w":1.25},
{"label":"RCtrl", "x":11.75, "y":5, "w":1.25},
{"label":"Left", "x":13, "y":5},
{"label":"Down", "x":14, "y":5},
{"label":"Right", "x":15, "y":5}
]
"keyboard_name": "MS Sculpt Mobile",
"url": "",
"maintainer": "qmk",
"layouts": {
"LAYOUT": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1, "w": 2},
{"x": 15, "y": 1, "h": 1.6},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 13.5, "y": 2, "w": 1.5},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3, "w": 2.25},
{"x": 15, "y": 2.6, "h": 1.2},
{"x": 0, "y": 4, "w": 2.25},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 1.75},
{"x": 14, "y": 4},
{"x": 15, "y": 3.8, "h": 1.2},
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 5.5},
{"x": 9.25, "y": 5, "w": 1.25},
{"x": 10.5, "y": 5, "w": 1.25},
{"x": 11.75, "y": 5, "w": 1.25},
{"x": 13, "y": 5},
{"x": 14, "y": 5},
{"x": 15, "y": 5}
]
}
}
}
}
@@ -1,9 +1,3 @@
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
MOUSEKEY_ENABLE = yes
CONSOLE_ENABLE = no
NKRO_ENABLE = yes
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
AUDIO_ENABLE = no # Audio output
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
@@ -46,8 +46,6 @@ The Astar mini has all pins exposed , so you can do 18x8
If you want a speaker, LEDs, etc., you'll need to free up a pin. I recommend joining columns
R and L to the same pin.
Building - add ASTAR=1 to the compile line or leave out for teensy2++
Make example for this keyboard (after setting up your build environment):
make handwired/ms_sculpt_mobile:default
+4 -16
View File
@@ -1,26 +1,14 @@
# MCU name
ifdef ASTAR
MCU = atmega32u4
CFLAGS = -D ASTAR
else
MCU = at90usb1286
endif
# Bootloader selection
ifdef ASTAR
BOOTLOADER = caterina
else
BOOTLOADER = atmel-dfu
endif
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
MOUSEKEY_ENABLE = no # Mouse keys
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = no # Enable N-Key Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
DEFAULT_FOLDER = handwired/ms_sculpt_mobile/teensy2pp
@@ -0,0 +1,6 @@
#pragma once
#define PRODUCT sculpt mobile teensypp
#define MATRIX_ROW_PINS { F7, F6, F4, F5, F3, F2, F1, F0 }
#define MATRIX_COL_PINS { B7, D0, D1, D2, D3, D4, D5, D6, D7, E0, E1, C1, C0, C3, C2, C5, C4, C7 }
@@ -0,0 +1,5 @@
# MCU name
MCU = at90usb1286
# Bootloader selection
BOOTLOADER = halfkay
-1
View File
@@ -17,4 +17,3 @@
#pragma once
#include "config_common.h"
#define DYNAMIC_KEYMAP_LAYER_COUNT 12
+5 -5
View File
@@ -1,9 +1,9 @@
{
"manufacturer": "fumbucker",
"manufacturer": "xia0",
"keyboard_name": "Wakizashi 40",
"maintainer": "fumbucker",
"maintainer": "xia0",
"debounce": 5,
"processor": "at90usb1286",
"processor": "atmega32u4",
"diode_direction": "COL2ROW",
"features": {
"audio": false,
@@ -20,8 +20,8 @@
"unicode": false
},
"matrix_pins": {
"cols": ["C5", "C4", "D2", "D3", "D4", "D5", "C6", "D7", "B0", "B1", "B2", "B3", "B4"],
"rows": ["C0", "C1", "C2", "C3"]
"cols": ["F4", "F6", "F7", "B1", "B3", "B2", "B6", "B5", "B4", "E6", "D7", "C6", "D4"],
"rows": ["D3", "D2", "D1", "D0"]
},
"usb": {
"vid": "0x6662",
@@ -16,77 +16,27 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ESC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, LT(1, KC_SPC), LT(2, KC_SPC), KC_LALT, KC_MENU, KC_LCTL),
[0] = LAYOUT_all(
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ESC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, LT(1, KC_SPC), LT(2, KC_SPC), KC_LALT, KC_MENU, KC_LCTL),
[1] = LAYOUT_all(
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F5, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
MO(3), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_TRNS, KC_EQL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS),
[1] = LAYOUT_all(
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F5, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
MO(11), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_TRNS, KC_EQL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS),
[2] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS,
MO(11), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_QUOT,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS),
[3] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_QUOT,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[4] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[5] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[6] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[7] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[8] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[9] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[10] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[11] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
[2] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS,
MO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_QUOT,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS),
[3] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_QUOT,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};
+7 -5
View File
@@ -1,12 +1,12 @@
# Wakizashi 40
![Wakizashi40](https://cdn.thingiverse.com/renders/51/50/81/13/a9/7078248666f70b422127c6662cf79563_preview_featured.jpg)
![Wakizashi40](https://i.imgur.com/TVTfa0X.jpg)
Reverse stagger 40% keyboard based on the Katana 60.
* Keyboard Maintainer: [fumbucker](https://github.com/xia0)
* Hardware Supported: Teensy2++
* Hardware Availability: [thingiverse](https://www.thingiverse.com/thing:3467930)
* Keyboard Maintainer: [xia0](https://github.com/xia0)
* Hardware Supported: ATmega32u4
* Hardware Availability: [prusaprinters.org](https://www.prusaprinters.org/prints/128575-wakizashi-40-keyboard)
Make example for this keyboard (after setting up your build environment):
@@ -16,4 +16,6 @@ See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools)
## Bootloader
* **Keycode in layout**: Press the key mapped to `RESET` if it is available (Capslock + R).
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
* **Keycode in layout**: Press the key mapped to `RESET` if it is available
+1
View File
@@ -17,5 +17,6 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
ENCODER_ENABLE = yes
LTO_ENABLE = yes
LAYOUTS = 66_ansi 66_iso
@@ -20,6 +20,7 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
NO_USB_STARTUP_CHECK = yes
LTO_ENABLE = yes
# RGB Matrix enabled
RGB_MATRIX_ENABLE = yes
@@ -62,7 +62,7 @@
/* Need to redefine this, since the default is for K20x */
/* This is for Teensy LC; you should comment it out (or change to 5)
* for Teensy 3.x */
#define KINETIS_USB_USB0_IRQ_PRIORITY 2
#define KINETIS_USB_USB0_IRQ_PRIORITY 5
/*
* SPI driver system settings.
+1 -2
View File
@@ -1,5 +1,5 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -169,7 +169,6 @@
/*
* PWM driver system settings.
*/
#define STM32_PWM_USE_ADVANCED FALSE
#define STM32_PWM_USE_TIM1 FALSE
#define STM32_PWM_USE_TIM2 FALSE
#define STM32_PWM_USE_TIM3 FALSE
+6 -5
View File
@@ -42,11 +42,12 @@
#define DEBOUNCE 5
// Encoder support
#define ENCODERS_PAD_A { F5 }
#define ENCODERS_PAD_B { F4 }
#define ENCODERS_PAD_A_RIGHT { F4 }
#define ENCODERS_PAD_B_RIGHT { F5 }
#define ENCODER_RESOLUTIONS { 4, 2 } // Left encoder seems to have double-output issue but right does not.
#define ENCODERS_PAD_A { F5 }
#define ENCODERS_PAD_B { F4 }
#define ENCODERS_PAD_A_RIGHT { F4 }
#define ENCODERS_PAD_B_RIGHT { F5 }
#define ENCODER_RESOLUTIONS { 4 }
#define ENCODER_RESOLUTIONS_RIGHT { 2 } // Left encoder seems to have double-output issue but right does not.
#define TAP_CODE_DELAY 10
-1
View File
@@ -26,7 +26,6 @@
#define DEVICE_VER 0x0001
#define MANUFACTURER github.com/sowbug
#define PRODUCT 68-key keyboard
#define DESCRIPTION A 68-key keyboard based on 68keys.io
// key matrix size
#define MATRIX_ROWS 5
-1
View File
@@ -26,7 +26,6 @@
#define DEVICE_VER 0x0001
#define MANUFACTURER github.com/sowbug
#define PRODUCT ANSI TKL
#define DESCRIPTION A tenkeyless ANSI-layout keyboard
// key matrix size
#define MATRIX_ROWS 6
+2 -2
View File
@@ -79,8 +79,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# define ENABLE_RGB_MATRIX_HUE_PENDULUM
# define ENABLE_RGB_MATRIX_HUE_WAVE
# define ENABLE_RGB_MATRIX_PIXEL_RAIN
# define ENABLE_RGB_MATRIX_PIXEL_FLOW
# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
//# define ENABLE_RGB_MATRIX_PIXEL_FLOW
//# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
@@ -23,7 +23,6 @@
#define DEVICE_VER 0x0001
#define MANUFACTURER Unicomp/Purdea Andrei
#define PRODUCT Unicomp Spacesaver M
#define DESCRIPTION QMK firmware for the Unicomp Spacesaver M keyboard with a replacement Overnumpad controller
#define SERIAL_NUMBER "purdea.ro:overnumpad_controller"
/* key matrix size */
+2 -2
View File
@@ -35,7 +35,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// wiring of each half
#define MATRIX_ROW_PINS { F0, B5, B4, D7, D6 }
#define MATRIX_COL_PINS { B6, C6, C7, D4, D2, D3, D5 } // no B7 on left hand
#define MATRIX_COL_PINS { B6, C6, C7, D4, D2, D3, D5, NO_PIN } // no B7 on left hand
#define MATRIX_ROW_PINS_RIGHT { F0, B5, B4, D7, D6 }
#define MATRIX_COL_PINS_RIGHT { B6, C6, C7, D4, D2, D3, D5, B7 }
@@ -78,7 +78,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define ENCODERS_PAD_A_RIGHT {F4}
//#define ENCODERS_PAD_B_RIGHT {F1}
#define ENCODER_RESOLUTIONS { 8, 8 }
#define ENCODER_RESOLUTIONS { 8 }
/*
* Feature disable options
-1
View File
@@ -22,7 +22,6 @@
#define DEVICE_VER 0x0001
#define MANUFACTURER Xelus
#define PRODUCT Ninjin
#define DESCRIPTION Ninjin
/* key matrix size */
#define MATRIX_ROWS 6
+21 -7
View File
@@ -1,7 +1,7 @@
"""This script automates the generation of the QMK API data.
"""
from pathlib import Path
from shutil import copyfile
import shutil
import json
from milc import cli
@@ -12,28 +12,42 @@ from qmk.json_encoders import InfoJSONEncoder
from qmk.json_schema import json_load
from qmk.keyboard import find_readme, list_keyboards
TEMPLATE_PATH = Path('data/templates/api/')
BUILD_API_PATH = Path('.build/api_data/')
@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't write the data to disk.")
@cli.argument('-f', '--filter', arg_only=True, action='append', default=[], help="Filter the list of keyboards based on partial name matches the supplied value. May be passed multiple times.")
@cli.subcommand('Creates a new keymap for the keyboard of your choosing', hidden=False if cli.config.user.developer else True)
def generate_api(cli):
"""Generates the QMK API data.
"""
api_data_dir = Path('api_data')
v1_dir = api_data_dir / 'v1'
if BUILD_API_PATH.exists():
shutil.rmtree(BUILD_API_PATH)
shutil.copytree(TEMPLATE_PATH, BUILD_API_PATH)
v1_dir = BUILD_API_PATH / 'v1'
keyboard_all_file = v1_dir / 'keyboards.json' # A massive JSON containing everything
keyboard_list_file = v1_dir / 'keyboard_list.json' # A simple list of keyboard targets
keyboard_aliases_file = v1_dir / 'keyboard_aliases.json' # A list of historical keyboard names and their new name
keyboard_metadata_file = v1_dir / 'keyboard_metadata.json' # All the data configurator/via needs for initialization
usb_file = v1_dir / 'usb.json' # A mapping of USB VID/PID -> keyboard target
if not api_data_dir.exists():
api_data_dir.mkdir()
# Filter down when required
keyboard_list = list_keyboards()
if cli.args.filter:
kb_list = []
for keyboard_name in keyboard_list:
if any(i in keyboard_name for i in cli.args.filter):
kb_list.append(keyboard_name)
keyboard_list = kb_list
kb_all = {}
usb_list = {}
# Generate and write keyboard specific JSON files
for keyboard_name in list_keyboards():
for keyboard_name in keyboard_list:
kb_all[keyboard_name] = info_json(keyboard_name)
keyboard_dir = v1_dir / 'keyboards' / keyboard_name
keyboard_info = keyboard_dir / 'info.json'
@@ -47,7 +61,7 @@ def generate_api(cli):
cli.log.debug('Wrote file %s', keyboard_info)
if keyboard_readme_src:
copyfile(keyboard_readme_src, keyboard_readme)
shutil.copyfile(keyboard_readme_src, keyboard_readme)
cli.log.debug('Copied %s -> %s', keyboard_readme_src, keyboard_readme)
if 'usb' in kb_all[keyboard_name]:
+9 -8
View File
@@ -5,10 +5,9 @@ from pathlib import Path
from dotty_dict import dotty
from milc import cli
from qmk.info import info_json
from qmk.json_schema import json_load, validate
from qmk.info import info_json, keymap_json_config
from qmk.json_schema import json_load
from qmk.keyboard import keyboard_completer, keyboard_folder
from qmk.keymap import locate_keymap
from qmk.commands import dump_lines
from qmk.path import normpath
from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
@@ -84,7 +83,7 @@ def generate_config_items(kb_info_json, config_h_lines):
for config_key, info_dict in info_config_map.items():
info_key = info_dict['info_key']
key_type = info_dict.get('value_type', 'str')
key_type = info_dict.get('value_type', 'raw')
to_config = info_dict.get('to_config', True)
if not to_config:
@@ -112,6 +111,11 @@ def generate_config_items(kb_info_json, config_h_lines):
config_h_lines.append(f'#ifndef {key}')
config_h_lines.append(f'# define {key} {value}')
config_h_lines.append(f'#endif // {key}')
elif key_type == 'str':
config_h_lines.append('')
config_h_lines.append(f'#ifndef {config_key}')
config_h_lines.append(f'# define {config_key} "{config_value}"')
config_h_lines.append(f'#endif // {config_key}')
elif key_type == 'bcd_version':
(major, minor, revision) = config_value.split('.')
config_h_lines.append('')
@@ -175,10 +179,7 @@ def generate_config_h(cli):
"""
# Determine our keyboard/keymap
if cli.args.keymap:
km = locate_keymap(cli.args.keyboard, cli.args.keymap)
km_json = json_load(km)
validate(km_json, 'qmk.keymap.v1')
kb_info_json = dotty(km_json.get('config', {}))
kb_info_json = dotty(keymap_json_config(cli.args.keyboard, cli.args.keymap))
else:
kb_info_json = dotty(info_json(cli.args.keyboard))
+4 -3
View File
@@ -10,6 +10,7 @@ DOCS_PATH = Path('docs/')
BUILD_PATH = Path('.build/')
BUILD_DOCS_PATH = BUILD_PATH / 'docs'
DOXYGEN_PATH = BUILD_PATH / 'doxygen'
MOXYGEN_PATH = BUILD_DOCS_PATH / 'internals'
@cli.subcommand('Build QMK documentation.', hidden=False if cli.config.user.developer else True)
@@ -34,10 +35,10 @@ def generate_docs(cli):
'stdin': DEVNULL,
}
cli.log.info('Generating internal docs...')
cli.log.info('Generating docs...')
# Generate internal docs
cli.run(['doxygen', 'Doxyfile'], **args)
cli.run(['moxygen', '-q', '-g', '-o', BUILD_DOCS_PATH / 'internals_%s.md', DOXYGEN_PATH / 'xml'], **args)
cli.run(['moxygen', '-q', '-g', '-o', MOXYGEN_PATH / '%s.md', DOXYGEN_PATH / 'xml'], **args)
cli.log.info('Successfully generated internal docs to %s.', BUILD_DOCS_PATH)
cli.log.info('Successfully generated docs to %s.', BUILD_DOCS_PATH)
+6 -8
View File
@@ -5,10 +5,9 @@ from pathlib import Path
from dotty_dict import dotty
from milc import cli
from qmk.info import info_json
from qmk.json_schema import json_load, validate
from qmk.info import info_json, keymap_json_config
from qmk.json_schema import json_load
from qmk.keyboard import keyboard_completer, keyboard_folder
from qmk.keymap import locate_keymap
from qmk.commands import dump_lines
from qmk.path import normpath
from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE
@@ -21,7 +20,7 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict):
return None
info_key = info_dict['info_key']
key_type = info_dict.get('value_type', 'str')
key_type = info_dict.get('value_type', 'raw')
try:
rules_value = kb_info_json[info_key]
@@ -34,6 +33,8 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict):
return f'{rules_key} ?= {"yes" if rules_value else "no"}'
elif key_type == 'mapping':
return '\n'.join([f'{key} ?= {value}' for key, value in rules_value.items()])
elif key_type == 'str':
return f'{rules_key} ?= "{rules_value}"'
return f'{rules_key} ?= {rules_value}'
@@ -49,10 +50,7 @@ def generate_rules_mk(cli):
"""
# Determine our keyboard/keymap
if cli.args.keymap:
km = locate_keymap(cli.args.keyboard, cli.args.keymap)
km_json = json_load(km)
validate(km_json, 'qmk.keymap.v1')
kb_info_json = dotty(km_json.get('config', {}))
kb_info_json = dotty(keymap_json_config(cli.args.keyboard, cli.args.keymap))
else:
kb_info_json = dotty(info_json(cli.args.keyboard))
+12 -4
View File
@@ -11,8 +11,8 @@ from qmk.json_encoders import InfoJSONEncoder
from qmk.constants import COL_LETTERS, ROW_LETTERS
from qmk.decorators import automagic_keyboard, automagic_keymap
from qmk.keyboard import keyboard_completer, keyboard_folder, render_layouts, render_layout, rules_mk
from qmk.info import info_json, keymap_json
from qmk.keymap import locate_keymap
from qmk.info import info_json
from qmk.path import is_keyboard
UNICODE_SUPPORT = sys.stdout.encoding.lower().startswith('utf')
@@ -135,7 +135,7 @@ def print_parsed_rules_mk(keyboard_name):
@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Keyboard to show info for.')
@cli.argument('-km', '--keymap', help='Show the layers for a JSON keymap too.')
@cli.argument('-km', '--keymap', help='Keymap to show info for (Optional).')
@cli.argument('-l', '--layouts', action='store_true', help='Render the layouts.')
@cli.argument('-m', '--matrix', action='store_true', help='Render the layouts with matrix information.')
@cli.argument('-f', '--format', default='friendly', arg_only=True, help='Format to display the data in (friendly, text, json) (Default: friendly).')
@@ -161,8 +161,15 @@ def info(cli):
print_parsed_rules_mk(cli.config.info.keyboard)
return False
# default keymap stored in config file should be ignored
if cli.config_source.info.keymap == 'config_file':
cli.config_source.info.keymap = None
# Build the info.json file
kb_info_json = info_json(cli.config.info.keyboard)
if cli.config.info.keymap:
kb_info_json = keymap_json(cli.config.info.keyboard, cli.config.info.keymap)
else:
kb_info_json = info_json(cli.config.info.keyboard)
# Output in the requested format
if cli.args.format == 'json':
@@ -178,11 +185,12 @@ def info(cli):
cli.log.error('Unknown format: %s', cli.args.format)
return False
# Output requested extras
if cli.config.info.layouts:
show_layouts(kb_info_json, title_caps)
if cli.config.info.matrix:
show_matrix(kb_info_json, title_caps)
if cli.config_source.info.keymap and cli.config_source.info.keymap != 'config_file':
if cli.config.info.keymap:
show_keymap(kb_info_json, title_caps)
+1 -2
View File
@@ -12,8 +12,7 @@ from milc import cli
def pytest(cli):
"""Run several linting/testing commands.
"""
nose2 = cli.run(['nose2', '-v', '-t'
'lib/python', *cli.args.test], capture_output=False, stdin=DEVNULL)
nose2 = cli.run(['nose2', '-v', '-t', 'lib/python', *cli.args.test], capture_output=False, stdin=DEVNULL)
flake8 = cli.run(['flake8', 'lib/python'], capture_output=False, stdin=DEVNULL)
return flake8.returncode | nose2.returncode
+1 -1
View File
@@ -228,7 +228,7 @@ def dump_lines(output_file, lines, quiet=True):
output_file.parent.mkdir(parents=True, exist_ok=True)
if output_file.exists():
output_file.replace(output_file.parent / (output_file.name + '.bak'))
output_file.write_text(generated)
output_file.write_text(generated, encoding='utf-8')
if not quiet:
cli.log.info(f'Wrote {output_file.name} to {output_file}.')
+52 -13
View File
@@ -8,10 +8,11 @@ from dotty_dict import dotty
from milc import cli
from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS
from qmk.c_parse import find_layouts
from qmk.c_parse import find_layouts, parse_config_h_file
from qmk.json_schema import deep_update, json_load, validate
from qmk.keyboard import config_h, rules_mk
from qmk.keymap import list_keymaps
from qmk.keymap import list_keymaps, locate_keymap
from qmk.commands import parse_configurator_json
from qmk.makefile import parse_rules_mk_file
from qmk.math import compute
@@ -68,8 +69,8 @@ def info_json(keyboard):
# Merge in the data from info.json, config.h, and rules.mk
info_data = merge_info_jsons(keyboard, info_data)
info_data = _extract_rules_mk(info_data)
info_data = _extract_config_h(info_data)
info_data = _extract_rules_mk(info_data, rules_mk(str(keyboard)))
info_data = _extract_config_h(info_data, config_h(str(keyboard)))
# Ensure that we have matrix row and column counts
info_data = _matrix_size(info_data)
@@ -270,14 +271,16 @@ def _extract_split_transport(info_data, config_c):
info_data['split']['transport']['protocol'] = 'i2c'
elif 'protocol' not in info_data.get('split', {}).get('transport', {}):
# Ignore transport defaults if "SPLIT_KEYBOARD" is unset
elif 'enabled' in info_data.get('split', {}):
if 'split' not in info_data:
info_data['split'] = {}
if 'transport' not in info_data['split']:
info_data['split']['transport'] = {}
info_data['split']['transport']['protocol'] = 'serial'
if 'protocol' not in info_data['split']['transport']:
info_data['split']['transport']['protocol'] = 'serial'
def _extract_split_right_pins(info_data, config_c):
@@ -400,18 +403,16 @@ def _extract_device_version(info_data):
info_data['usb']['device_version'] = f'{major}.{minor}.{revision}'
def _extract_config_h(info_data):
def _extract_config_h(info_data, config_c):
"""Pull some keyboard information from existing config.h files
"""
config_c = config_h(info_data['keyboard_folder'])
# Pull in data from the json map
dotty_info = dotty(info_data)
info_config_map = json_load(Path('data/mappings/info_config.json'))
for config_key, info_dict in info_config_map.items():
info_key = info_dict['info_key']
key_type = info_dict.get('value_type', 'str')
key_type = info_dict.get('value_type', 'raw')
try:
if config_key in config_c and info_dict.get('to_json', True):
@@ -443,6 +444,9 @@ def _extract_config_h(info_data):
elif key_type == 'int':
dotty_info[info_key] = int(config_c[config_key])
elif key_type == 'str':
dotty_info[info_key] = config_c[config_key].strip('"')
elif key_type == 'bcd_version':
major = int(config_c[config_key][2:4])
minor = int(config_c[config_key][4])
@@ -469,10 +473,9 @@ def _extract_config_h(info_data):
return info_data
def _extract_rules_mk(info_data):
def _extract_rules_mk(info_data, rules):
"""Pull some keyboard information from existing rules.mk files
"""
rules = rules_mk(info_data['keyboard_folder'])
info_data['processor'] = rules.get('MCU', info_data.get('processor', 'atmega32u4'))
if info_data['processor'] in CHIBIOS_PROCESSORS:
@@ -491,7 +494,7 @@ def _extract_rules_mk(info_data):
for rules_key, info_dict in info_rules_map.items():
info_key = info_dict['info_key']
key_type = info_dict.get('value_type', 'str')
key_type = info_dict.get('value_type', 'raw')
try:
if rules_key in rules and info_dict.get('to_json', True):
@@ -523,6 +526,9 @@ def _extract_rules_mk(info_data):
elif key_type == 'int':
dotty_info[info_key] = int(rules[rules_key])
elif key_type == 'str':
dotty_info[info_key] = rules[rules_key].strip('"')
else:
dotty_info[info_key] = rules[rules_key]
@@ -760,3 +766,36 @@ def find_info_json(keyboard):
# Return a list of the info.json files that actually exist
return [info_json for info_json in info_jsons if info_json.exists()]
def keymap_json_config(keyboard, keymap):
"""Extract keymap level config
"""
keymap_folder = locate_keymap(keyboard, keymap).parent
km_info_json = parse_configurator_json(keymap_folder / 'keymap.json')
return km_info_json.get('config', {})
def keymap_json(keyboard, keymap):
"""Generate the info.json data for a specific keymap.
"""
keymap_folder = locate_keymap(keyboard, keymap).parent
# Files to scan
keymap_config = keymap_folder / 'config.h'
keymap_rules = keymap_folder / 'rules.mk'
keymap_file = keymap_folder / 'keymap.json'
# Build the info.json file
kb_info_json = info_json(keyboard)
# Merge in the data from keymap.json
km_info_json = keymap_json_config(keyboard, keymap) if keymap_file.exists() else {}
deep_update(kb_info_json, km_info_json)
# Merge in the data from config.h, and rules.mk
_extract_rules_mk(kb_info_json, parse_rules_mk_file(keymap_rules))
_extract_config_h(kb_info_json, parse_config_h_file(keymap_config))
return kb_info_json
+2 -2
View File
@@ -244,7 +244,7 @@ def test_clean():
def test_generate_api():
result = check_subcommand('generate-api', '--dry-run')
result = check_subcommand('generate-api', '--dry-run', '--filter', 'handwired/pytest')
check_returncode(result)
@@ -259,7 +259,7 @@ def test_generate_config_h():
result = check_subcommand('generate-config-h', '-kb', 'handwired/pytest/basic')
check_returncode(result)
assert '# define DEVICE_VER 0x0001' in result.stdout
assert '# define DESCRIPTION handwired/pytest/basic' in result.stdout
assert '# define DESCRIPTION "handwired/pytest/basic"' in result.stdout
assert '# define DIODE_DIRECTION COL2ROW' in result.stdout
assert '# define MANUFACTURER none' in result.stdout
assert '# define PRODUCT pytest' in result.stdout
File renamed without changes.
File renamed without changes.
-542
View File
@@ -1,542 +0,0 @@
/****************************************************************************
Title: HD44780U LCD library
Author: Peter Fleury <pfleury@gmx.ch> http://tinyurl.com/peterfleury
License: GNU General Public License Version 3
File: $Id: lcd.c,v 1.15.2.2 2015/01/17 12:16:05 peter Exp $
Software: AVR-GCC 3.3
Target: any AVR device, memory mapped mode only for AT90S4414/8515/Mega
DESCRIPTION
Basic routines for interfacing a HD44780U-based text lcd display
Originally based on Volker Oth's lcd library,
changed lcd_init(), added additional constants for lcd_command(),
added 4-bit I/O mode, improved and optimized code.
Library can be operated in memory mapped mode (LCD_IO_MODE=0) or in
4-bit IO port mode (LCD_IO_MODE=1). 8-bit IO port mode not supported.
Memory mapped mode compatible with Kanda STK200, but supports also
generation of R/W signal through A8 address line.
USAGE
See the C include lcd.h file for a description of each function
*****************************************************************************/
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "hd44780.h"
/*
** constants/macros
*/
#define DDR(x) (*(&x - 1)) /* address of data direction register of port x */
#if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
/* on ATmega64/128 PINF is on port 0x00 and not 0x60 */
# define PIN(x) (&PORTF == &(x) ? _SFR_IO8(0x00) : (*(&x - 2)))
#else
# define PIN(x) (*(&x - 2)) /* address of input register of port x */
#endif
#if LCD_IO_MODE
# define lcd_e_delay() _delay_us(LCD_DELAY_ENABLE_PULSE)
# define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN);
# define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN);
# define lcd_e_toggle() toggle_e()
# define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN)
# define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN)
# define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN)
# define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
#endif
#if LCD_IO_MODE
# if LCD_LINES == 1
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE
# else
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES
# endif
#else
# if LCD_LINES == 1
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE
# else
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
# endif
#endif
#if LCD_CONTROLLER_KS0073
# if LCD_LINES == 4
# define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x2C /* |0|010|1100 4-bit mode, extension-bit RE = 1 */
# define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x28 /* |0|010|1000 4-bit mode, extension-bit RE = 0 */
# define KS0073_4LINES_MODE 0x09 /* |0|000|1001 4 lines mode */
# endif
#endif
/*
** function prototypes
*/
#if LCD_IO_MODE
static void toggle_e(void);
#endif
/*
** local functions
*/
/*************************************************************************
delay for a minimum of <us> microseconds
the number of loops is calculated at compile-time from MCU clock frequency
*************************************************************************/
#define delay(us) _delay_us(us)
#if LCD_IO_MODE
/* toggle Enable Pin to initiate write */
static void toggle_e(void) {
lcd_e_high();
lcd_e_delay();
lcd_e_low();
}
#endif
/*************************************************************************
Low-level function to write byte to LCD controller
Input: data byte to write to LCD
rs 1: write data
0: write instruction
Returns: none
*************************************************************************/
#if LCD_IO_MODE
static void lcd_write(uint8_t data, uint8_t rs) {
unsigned char dataBits;
if (rs) { /* write data (RS=1, RW=0) */
lcd_rs_high();
} else { /* write instruction (RS=0, RW=0) */
lcd_rs_low();
}
lcd_rw_low(); /* RW=0 write mode */
if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
/* configure data pins as output */
DDR(LCD_DATA0_PORT) |= 0x0F;
/* output high nibble first */
dataBits = LCD_DATA0_PORT & 0xF0;
LCD_DATA0_PORT = dataBits | ((data >> 4) & 0x0F);
lcd_e_toggle();
/* output low nibble */
LCD_DATA0_PORT = dataBits | (data & 0x0F);
lcd_e_toggle();
/* all data pins high (inactive) */
LCD_DATA0_PORT = dataBits | 0x0F;
} else {
/* configure data pins as output */
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
/* output high nibble first */
LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN);
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
if (data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
if (data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
if (data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
if (data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
lcd_e_toggle();
/* output low nibble */
LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN);
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
if (data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
if (data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
if (data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
if (data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
lcd_e_toggle();
/* all data pins high (inactive) */
LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
}
}
#else
# define lcd_write(d, rs) \
if (rs) \
*(volatile uint8_t *)(LCD_IO_DATA) = d; \
else \
*(volatile uint8_t *)(LCD_IO_FUNCTION) = d;
/* rs==0 -> write instruction to LCD_IO_FUNCTION */
/* rs==1 -> write data to LCD_IO_DATA */
#endif
/*************************************************************************
Low-level function to read byte from LCD controller
Input: rs 1: read data
0: read busy flag / address counter
Returns: byte read from LCD controller
*************************************************************************/
#if LCD_IO_MODE
static uint8_t lcd_read(uint8_t rs) {
uint8_t data;
if (rs)
lcd_rs_high(); /* RS=1: read data */
else
lcd_rs_low(); /* RS=0: read busy flag */
lcd_rw_high(); /* RW=1 read mode */
if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */
lcd_e_high();
lcd_e_delay();
data = PIN(LCD_DATA0_PORT) << 4; /* read high nibble first */
lcd_e_low();
lcd_e_delay(); /* Enable 500ns low */
lcd_e_high();
lcd_e_delay();
data |= PIN(LCD_DATA0_PORT) & 0x0F; /* read low nibble */
lcd_e_low();
} else {
/* configure data pins as input */
DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) &= ~_BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) &= ~_BV(LCD_DATA3_PIN);
/* read high nibble first */
lcd_e_high();
lcd_e_delay();
data = 0;
if (PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN)) data |= 0x10;
if (PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN)) data |= 0x20;
if (PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN)) data |= 0x40;
if (PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN)) data |= 0x80;
lcd_e_low();
lcd_e_delay(); /* Enable 500ns low */
/* read low nibble */
lcd_e_high();
lcd_e_delay();
if (PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN)) data |= 0x01;
if (PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN)) data |= 0x02;
if (PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN)) data |= 0x04;
if (PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN)) data |= 0x08;
lcd_e_low();
}
return data;
}
#else
# define lcd_read(rs) (rs) ? *(volatile uint8_t *)(LCD_IO_DATA + LCD_IO_READ) : *(volatile uint8_t *)(LCD_IO_FUNCTION + LCD_IO_READ)
/* rs==0 -> read instruction from LCD_IO_FUNCTION */
/* rs==1 -> read data from LCD_IO_DATA */
#endif
/*************************************************************************
loops while lcd is busy, returns address counter
*************************************************************************/
static uint8_t lcd_waitbusy(void)
{
register uint8_t c;
/* wait until busy flag is cleared */
while ((c = lcd_read(0)) & (1 << LCD_BUSY)) {
}
/* the address counter is updated 4us after the busy flag is cleared */
delay(LCD_DELAY_BUSY_FLAG);
/* now read the address counter */
return (lcd_read(0)); // return address counter
} /* lcd_waitbusy */
/*************************************************************************
Move cursor to the start of next line or to the first line if the cursor
is already on the last line.
*************************************************************************/
static inline void lcd_newline(uint8_t pos) {
register uint8_t addressCounter;
#if LCD_LINES == 1
addressCounter = 0;
#endif
#if LCD_LINES == 2
if (pos < (LCD_START_LINE2))
addressCounter = LCD_START_LINE2;
else
addressCounter = LCD_START_LINE1;
#endif
#if LCD_LINES == 4
# if KS0073_4LINES_MODE
if (pos < LCD_START_LINE2)
addressCounter = LCD_START_LINE2;
else if ((pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3))
addressCounter = LCD_START_LINE3;
else if ((pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4))
addressCounter = LCD_START_LINE4;
else
addressCounter = LCD_START_LINE1;
# else
if (pos < LCD_START_LINE3)
addressCounter = LCD_START_LINE2;
else if ((pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4))
addressCounter = LCD_START_LINE3;
else if ((pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2))
addressCounter = LCD_START_LINE4;
else
addressCounter = LCD_START_LINE1;
# endif
#endif
lcd_command((1 << LCD_DDRAM) + addressCounter);
} /* lcd_newline */
/*
** PUBLIC FUNCTIONS
*/
/*************************************************************************
Send LCD controller instruction command
Input: instruction to send to LCD controller, see HD44780 data sheet
Returns: none
*************************************************************************/
void lcd_command(uint8_t cmd) {
lcd_waitbusy();
lcd_write(cmd, 0);
}
/*************************************************************************
Send data byte to LCD controller
Input: data to send to LCD controller, see HD44780 data sheet
Returns: none
*************************************************************************/
void lcd_data(uint8_t data) {
lcd_waitbusy();
lcd_write(data, 1);
}
/*************************************************************************
Set cursor to specified position
Input: x horizontal position (0: left most position)
y vertical position (0: first line)
Returns: none
*************************************************************************/
void lcd_gotoxy(uint8_t x, uint8_t y) {
#if LCD_LINES == 1
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
#endif
#if LCD_LINES == 2
if (y == 0)
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
else
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE2 + x);
#endif
#if LCD_LINES == 4
if (y == 0)
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
else if (y == 1)
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE2 + x);
else if (y == 2)
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE3 + x);
else /* y==3 */
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE4 + x);
#endif
} /* lcd_gotoxy */
/*************************************************************************
*************************************************************************/
int lcd_getxy(void) {
return lcd_waitbusy();
}
/*************************************************************************
Clear display and set cursor to home position
*************************************************************************/
void lcd_clrscr(void) {
lcd_command(1 << LCD_CLR);
}
/*************************************************************************
Set cursor to home position
*************************************************************************/
void lcd_home(void) {
lcd_command(1 << LCD_HOME);
}
/*************************************************************************
Display character at current cursor position
Input: character to be displayed
Returns: none
*************************************************************************/
void lcd_putc(char c) {
uint8_t pos;
pos = lcd_waitbusy(); // read busy-flag and address counter
if (c == '\n') {
lcd_newline(pos);
} else {
#if LCD_WRAP_LINES == 1
# if LCD_LINES == 1
if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
}
# elif LCD_LINES == 2
if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE2, 0);
} else if (pos == LCD_START_LINE2 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
}
# elif LCD_LINES == 4
if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE2, 0);
} else if (pos == LCD_START_LINE2 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE3, 0);
} else if (pos == LCD_START_LINE3 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE4, 0);
} else if (pos == LCD_START_LINE4 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
}
# endif
lcd_waitbusy();
#endif
lcd_write(c, 1);
}
} /* lcd_putc */
/*************************************************************************
Display string without auto linefeed
Input: string to be displayed
Returns: none
*************************************************************************/
void lcd_puts(const char *s)
/* print string on lcd (no auto linefeed) */
{
register char c;
while ((c = *s++)) {
lcd_putc(c);
}
} /* lcd_puts */
/*************************************************************************
Display string from program memory without auto linefeed
Input: string from program memory be be displayed
Returns: none
*************************************************************************/
void lcd_puts_p(const char *progmem_s)
/* print string from program memory on lcd (no auto linefeed) */
{
register char c;
while ((c = pgm_read_byte(progmem_s++))) {
lcd_putc(c);
}
} /* lcd_puts_p */
/*************************************************************************
Initialize display and select type of cursor
Input: dispAttr LCD_DISP_OFF display off
LCD_DISP_ON display on, cursor off
LCD_DISP_ON_CURSOR display on, cursor on
LCD_DISP_CURSOR_BLINK display on, cursor on flashing
Returns: none
*************************************************************************/
void lcd_init(uint8_t dispAttr) {
#if LCD_IO_MODE
/*
* Initialize LCD to 4 bit I/O mode
*/
if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (&LCD_RS_PORT == &LCD_DATA0_PORT) && (&LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) && (LCD_RS_PIN == 4) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6)) {
/* configure all port bits as output (all LCD lines on same port) */
DDR(LCD_DATA0_PORT) |= 0x7F;
} else if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
/* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */
DDR(LCD_DATA0_PORT) |= 0x0F;
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
} else {
/* configure all port bits as output (LCD data and control lines on different ports */
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
}
delay(LCD_DELAY_BOOTUP); /* wait 16ms or more after power-on */
/* initial write to lcd is 8bit */
LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); // LCD_FUNCTION>>4;
LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // LCD_FUNCTION_8BIT>>4;
lcd_e_toggle();
delay(LCD_DELAY_INIT); /* delay, busy flag can't be checked here */
/* repeat last command */
lcd_e_toggle();
delay(LCD_DELAY_INIT_REP); /* delay, busy flag can't be checked here */
/* repeat last command a third time */
lcd_e_toggle();
delay(LCD_DELAY_INIT_REP); /* delay, busy flag can't be checked here */
/* now configure for 4bit mode */
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); // LCD_FUNCTION_4BIT_1LINE>>4
lcd_e_toggle();
delay(LCD_DELAY_INIT_4BIT); /* some displays need this additional delay */
/* from now the LCD only accepts 4 bit I/O, we can use lcd_command() */
#else
/*
* Initialize LCD to 8 bit memory mapped mode
*/
/* enable external SRAM (memory mapped lcd) and one wait state */
MCUCR = _BV(SRE) | _BV(SRW);
/* reset LCD */
delay(LCD_DELAY_BOOTUP); /* wait 16ms after power-on */
lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
delay(LCD_DELAY_INIT); /* wait 5ms */
lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
delay(LCD_DELAY_INIT_REP); /* wait 64us */
lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
delay(LCD_DELAY_INIT_REP); /* wait 64us */
#endif
#if KS0073_4LINES_MODE
/* Display with KS0073 controller requires special commands for enabling 4 line mode */
lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON);
lcd_command(KS0073_4LINES_MODE);
lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF);
#else
lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display lines */
#endif
lcd_command(LCD_DISP_OFF); /* display off */
lcd_clrscr(); /* display clear */
lcd_command(LCD_MODE_DEFAULT); /* set entry mode */
lcd_command(dispAttr); /* display/cursor control */
} /* lcd_init */
-348
View File
@@ -1,348 +0,0 @@
/*************************************************************************
Title : C include file for the HD44780U LCD library (lcd.c)
Author: Peter Fleury <pfleury@gmx.ch> http://tinyurl.com/peterfleury
License: GNU General Public License Version 3
File: $Id: lcd.h,v 1.14.2.4 2015/01/20 17:16:07 peter Exp $
Software: AVR-GCC 4.x
Hardware: any AVR device, memory mapped mode only for AVR with
memory mapped interface (AT90S8515/ATmega8515/ATmega128)
***************************************************************************/
/**
@mainpage
Collection of libraries for AVR-GCC
@author Peter Fleury pfleury@gmx.ch http://tinyurl.com/peterfleury
@copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
@file
@defgroup pfleury_lcd LCD library <lcd.h>
@code #include <lcd.h> @endcode
@brief Basic routines for interfacing a HD44780U-based character LCD display
LCD character displays can be found in many devices, like espresso machines, laser printers.
The Hitachi HD44780 controller and its compatible controllers like Samsung KS0066U have become an industry standard for these types of displays.
This library allows easy interfacing with a HD44780 compatible display and can be
operated in memory mapped mode (LCD_IO_MODE defined as 0 in the include file lcd.h.) or in
4-bit IO port mode (LCD_IO_MODE defined as 1). 8-bit IO port mode is not supported.
Memory mapped mode is compatible with old Kanda STK200 starter kit, but also supports
generation of R/W signal through A8 address line.
@see The chapter <a href=" http://homepage.hispeed.ch/peterfleury/avr-lcd44780.html" target="_blank">Interfacing a HD44780 Based LCD to an AVR</a>
on my home page, which shows example circuits how to connect an LCD to an AVR controller.
@author Peter Fleury pfleury@gmx.ch http://tinyurl.com/peterfleury
@version 2.0
@copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
*/
#pragma once
#include <inttypes.h>
#include <avr/pgmspace.h>
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 405
# error "This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !"
#endif
/**@{*/
/*
* LCD and target specific definitions below can be defined in a separate include file with name lcd_definitions.h instead modifying this file
* by adding -D_LCD_DEFINITIONS_FILE to the CDEFS section in the Makefile
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
*/
#ifdef _LCD_DEFINITIONS_FILE
# include "lcd_definitions.h"
#endif
/**
* @name Definition for LCD controller type
* Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
*/
#ifndef LCD_CONTROLLER_KS0073
# define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
#endif
/**
* @name Definitions for Display Size
* Change these definitions to adapt setting to your display
*
* These definitions can be defined in a separate include file \b lcd_definitions.h instead modifying this file by
* adding -D_LCD_DEFINITIONS_FILE to the CDEFS section in the Makefile.
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
*
*/
#ifndef LCD_LINES
# define LCD_LINES 2 /**< number of visible lines of the display */
#endif
#ifndef LCD_DISP_LENGTH
# define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */
#endif
#ifndef LCD_LINE_LENGTH
# define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
#endif
#ifndef LCD_START_LINE1
# define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
#endif
#ifndef LCD_START_LINE2
# define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
#endif
#ifndef LCD_START_LINE3
# define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
#endif
#ifndef LCD_START_LINE4
# define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
#endif
#ifndef LCD_WRAP_LINES
# define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
#endif
/**
* @name Definitions for 4-bit IO mode
*
* The four LCD data lines and the three control lines RS, RW, E can be on the
* same port or on different ports.
* Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on
* different ports.
*
* Normally the four data lines should be mapped to bit 0..3 on one port, but it
* is possible to connect these data lines in different order or even on different
* ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions.
*
* Adjust these definitions to your target.\n
* These definitions can be defined in a separate include file \b lcd_definitions.h instead modifying this file by
* adding \b -D_LCD_DEFINITIONS_FILE to the \b CDEFS section in the Makefile.
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
*
*/
#define LCD_IO_MODE 1 /**< 0: memory mapped mode, 1: IO port mode */
#if LCD_IO_MODE
# ifndef LCD_PORT
# define LCD_PORT PORTA /**< port for the LCD lines */
# endif
# ifndef LCD_DATA0_PORT
# define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
# endif
# ifndef LCD_DATA1_PORT
# define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
# endif
# ifndef LCD_DATA2_PORT
# define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
# endif
# ifndef LCD_DATA3_PORT
# define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
# endif
# ifndef LCD_DATA0_PIN
# define LCD_DATA0_PIN 4 /**< pin for 4bit data bit 0 */
# endif
# ifndef LCD_DATA1_PIN
# define LCD_DATA1_PIN 5 /**< pin for 4bit data bit 1 */
# endif
# ifndef LCD_DATA2_PIN
# define LCD_DATA2_PIN 6 /**< pin for 4bit data bit 2 */
# endif
# ifndef LCD_DATA3_PIN
# define LCD_DATA3_PIN 7 /**< pin for 4bit data bit 3 */
# endif
# ifndef LCD_RS_PORT
# define LCD_RS_PORT LCD_PORT /**< port for RS line */
# endif
# ifndef LCD_RS_PIN
# define LCD_RS_PIN 3 /**< pin for RS line */
# endif
# ifndef LCD_RW_PORT
# define LCD_RW_PORT LCD_PORT /**< port for RW line */
# endif
# ifndef LCD_RW_PIN
# define LCD_RW_PIN 2 /**< pin for RW line */
# endif
# ifndef LCD_E_PORT
# define LCD_E_PORT LCD_PORT /**< port for Enable line */
# endif
# ifndef LCD_E_PIN
# define LCD_E_PIN 1 /**< pin for Enable line */
# endif
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)
/*
* memory mapped mode is only supported when the device has an external data memory interface
*/
# define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */
# define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */
# define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */
#else
# error "external data memory interface not available for this device, use 4-bit IO port mode"
#endif
/**
* @name Definitions of delays
* Used to calculate delay timers.
* Adapt the F_CPU define in the Makefile to the clock frequency in Hz of your target
*
* These delay times can be adjusted, if some displays require different delays.\n
* These definitions can be defined in a separate include file \b lcd_definitions.h instead modifying this file by
* adding \b -D_LCD_DEFINITIONS_FILE to the \b CDEFS section in the Makefile.
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
*/
#ifndef LCD_DELAY_BOOTUP
# define LCD_DELAY_BOOTUP 16000 /**< delay in micro seconds after power-on */
#endif
#ifndef LCD_DELAY_INIT
# define LCD_DELAY_INIT 5000 /**< delay in micro seconds after initialization command sent */
#endif
#ifndef LCD_DELAY_INIT_REP
# define LCD_DELAY_INIT_REP 64 /**< delay in micro seconds after initialization command repeated */
#endif
#ifndef LCD_DELAY_INIT_4BIT
# define LCD_DELAY_INIT_4BIT 64 /**< delay in micro seconds after setting 4-bit mode */
#endif
#ifndef LCD_DELAY_BUSY_FLAG
# define LCD_DELAY_BUSY_FLAG 4 /**< time in micro seconds the address counter is updated after busy flag is cleared */
#endif
#ifndef LCD_DELAY_ENABLE_PULSE
# define LCD_DELAY_ENABLE_PULSE 1 /**< enable signal pulse width in micro seconds */
#endif
/**
* @name Definitions for LCD command instructions
* The constants define the various LCD controller instructions which can be passed to the
* function lcd_command(), see HD44780 data sheet for a complete description.
*/
/* instruction register bit positions, see HD44780U data sheet */
#define LCD_CLR 0 /* DB0: clear display */
#define LCD_HOME 1 /* DB1: return to home position */
#define LCD_ENTRY_MODE 2 /* DB2: set entry mode */
#define LCD_ENTRY_INC 1 /* DB1: 1=increment, 0=decrement */
#define LCD_ENTRY_SHIFT 0 /* DB2: 1=display shift on */
#define LCD_ON 3 /* DB3: turn lcd/cursor on */
#define LCD_ON_DISPLAY 2 /* DB2: turn display on */
#define LCD_ON_CURSOR 1 /* DB1: turn cursor on */
#define LCD_ON_BLINK 0 /* DB0: blinking cursor ? */
#define LCD_MOVE 4 /* DB4: move cursor/display */
#define LCD_MOVE_DISP 3 /* DB3: move display (0-> cursor) ? */
#define LCD_MOVE_RIGHT 2 /* DB2: move right (0-> left) ? */
#define LCD_FUNCTION 5 /* DB5: function set */
#define LCD_FUNCTION_8BIT 4 /* DB4: set 8BIT mode (0->4BIT mode) */
#define LCD_FUNCTION_2LINES 3 /* DB3: two lines (0->one line) */
#define LCD_FUNCTION_10DOTS 2 /* DB2: 5x10 font (0->5x7 font) */
#define LCD_CGRAM 6 /* DB6: set CG RAM address */
#define LCD_DDRAM 7 /* DB7: set DD RAM address */
#define LCD_BUSY 7 /* DB7: LCD is busy */
/* set entry mode: display shift on/off, dec/inc cursor move direction */
#define LCD_ENTRY_DEC 0x04 /* display shift off, dec cursor move dir */
#define LCD_ENTRY_DEC_SHIFT 0x05 /* display shift on, dec cursor move dir */
#define LCD_ENTRY_INC_ 0x06 /* display shift off, inc cursor move dir */
#define LCD_ENTRY_INC_SHIFT 0x07 /* display shift on, inc cursor move dir */
/* display on/off, cursor on/off, blinking char at cursor position */
#define LCD_DISP_OFF 0x08 /* display off */
#define LCD_DISP_ON 0x0C /* display on, cursor off */
#define LCD_DISP_ON_BLINK 0x0D /* display on, cursor off, blink char */
#define LCD_DISP_ON_CURSOR 0x0E /* display on, cursor on */
#define LCD_DISP_ON_CURSOR_BLINK 0x0F /* display on, cursor on, blink char */
/* move cursor/shift display */
#define LCD_MOVE_CURSOR_LEFT 0x10 /* move cursor left (decrement) */
#define LCD_MOVE_CURSOR_RIGHT 0x14 /* move cursor right (increment) */
#define LCD_MOVE_DISP_LEFT 0x18 /* shift display left */
#define LCD_MOVE_DISP_RIGHT 0x1C /* shift display right */
/* function set: set interface data length and number of display lines */
#define LCD_FUNCTION_4BIT_1LINE 0x20 /* 4-bit interface, single line, 5x7 dots */
#define LCD_FUNCTION_4BIT_2LINES 0x28 /* 4-bit interface, dual line, 5x7 dots */
#define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
#define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
#define LCD_MODE_DEFAULT ((1 << LCD_ENTRY_MODE) | (1 << LCD_ENTRY_INC))
/**
* @name Functions
*/
/**
@brief Initialize display and select type of cursor
@param dispAttr \b LCD_DISP_OFF display off\n
\b LCD_DISP_ON display on, cursor off\n
\b LCD_DISP_ON_CURSOR display on, cursor on\n
\b LCD_DISP_ON_CURSOR_BLINK display on, cursor on flashing
@return none
*/
extern void lcd_init(uint8_t dispAttr);
/**
@brief Clear display and set cursor to home position
@return none
*/
extern void lcd_clrscr(void);
/**
@brief Set cursor to home position
@return none
*/
extern void lcd_home(void);
/**
@brief Set cursor to specified position
@param x horizontal position\n (0: left most position)
@param y vertical position\n (0: first line)
@return none
*/
extern void lcd_gotoxy(uint8_t x, uint8_t y);
/**
@brief Display character at current cursor position
@param c character to be displayed
@return none
*/
extern void lcd_putc(char c);
/**
@brief Display string without auto linefeed
@param s string to be displayed
@return none
*/
extern void lcd_puts(const char *s);
/**
@brief Display string from program memory without auto linefeed
@param progmem_s string from program memory be be displayed
@return none
@see lcd_puts_P
*/
extern void lcd_puts_p(const char *progmem_s);
/**
@brief Send LCD controller instruction command
@param cmd instruction to send to LCD controller, see HD44780 data sheet
@return none
*/
extern void lcd_command(uint8_t cmd);
/**
@brief Send data byte to LCD controller
Similar to lcd_putc(), but without interpreting LF
@param data byte to send to LCD controller, see HD44780 data sheet
@return none
*/
extern void lcd_data(uint8_t data);
/**
@brief macros for automatically storing string constant in program memory
*/
#define lcd_puts_P(__s) lcd_puts_p(PSTR(__s))
/**@}*/
+8 -1
View File
@@ -18,6 +18,13 @@ COMPILEFLAGS += -ffunction-sections
COMPILEFLAGS += -fdata-sections
COMPILEFLAGS += -fpack-struct
COMPILEFLAGS += -fshort-enums
COMPILEFLAGS += -mcall-prologues
# Linker relaxation is only possible if
# link time optimizations are not enabled.
ifeq ($(strip $(LTO_ENABLE)), no)
COMPILEFLAGS += -mrelax
endif
ASFLAGS += $(AVR_ASFLAGS)
@@ -28,7 +35,7 @@ CFLAGS += -fno-strict-aliasing
CXXFLAGS += $(COMPILEFLAGS)
CXXFLAGS += -fno-exceptions -std=c++11
LDFLAGS +=-Wl,--gc-sections
LDFLAGS += -Wl,--gc-sections
OPT_DEFS += -DF_CPU=$(F_CPU)UL
@@ -15,6 +15,12 @@
*/
#pragma once
#if defined(MCU_KINETIS)
// TODO: including this avoids "error: expected identifier before '(' token" errors
// here just to please KINETIS builds...
# include <hal.h>
#endif
// Defines mapping for Proton C replacement
#ifdef CONVERT_TO_PROTON_C
// Left side (front)
Loaded 100 of 170 files, more files were not shown because too many files have changed in this diff. Show more