diff options
401 files changed, 4275 insertions, 6459 deletions
diff --git a/build_test.mk b/build_test.mk index 136a0455f0..ec6699b4ea 100644 --- a/build_test.mk +++ b/build_test.mk @@ -43,6 +43,7 @@ all: elf  VPATH += $(COMMON_VPATH)  PLATFORM:=TEST  PLATFORM_KEY:=test +BOOTLOADER_TYPE:=none  ifeq ($(strip $(DEBUG)), 1)  CONSOLE_ENABLE = yes diff --git a/builddefs/bootloader.mk b/builddefs/bootloader.mk index ccb92392d9..470febc346 100644 --- a/builddefs/bootloader.mk +++ b/builddefs/bootloader.mk @@ -30,6 +30,7 @@  #     bootloadhid  HIDBootFlash compatible (ATmega32A)  #     usbasploader USBaspLoader (ATmega328P)  # ARM: +#     halfkay      PJRC Teensy  #     kiibohd      Input:Club Kiibohd bootloader (only used on their boards)  #     stm32duino   STM32Duino (STM32F103x8)  #     stm32-dfu    STM32 USB DFU in ROM @@ -43,6 +44,8 @@  ifeq ($(strip $(BOOTLOADER)), atmel-dfu)      OPT_DEFS += -DBOOTLOADER_ATMEL_DFU      OPT_DEFS += -DBOOTLOADER_DFU +    BOOTLOADER_TYPE = dfu +      ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))          BOOTLOADER_SIZE = 4096      endif @@ -53,6 +56,8 @@ endif  ifeq ($(strip $(BOOTLOADER)), lufa-dfu)      OPT_DEFS += -DBOOTLOADER_LUFA_DFU      OPT_DEFS += -DBOOTLOADER_DFU +    BOOTLOADER_TYPE = dfu +      ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))          BOOTLOADER_SIZE ?= 4096      endif @@ -63,6 +68,8 @@ endif  ifeq ($(strip $(BOOTLOADER)), qmk-dfu)      OPT_DEFS += -DBOOTLOADER_QMK_DFU      OPT_DEFS += -DBOOTLOADER_DFU +    BOOTLOADER_TYPE = dfu +      ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))          BOOTLOADER_SIZE ?= 4096      endif @@ -73,10 +80,14 @@ endif  ifeq ($(strip $(BOOTLOADER)), qmk-hid)      OPT_DEFS += -DBOOTLOADER_QMK_HID      OPT_DEFS += -DBOOTLOADER_HID +    BOOTLOADER_TYPE = dfu +      BOOTLOADER_SIZE ?= 4096  endif  ifeq ($(strip $(BOOTLOADER)), halfkay)      OPT_DEFS += -DBOOTLOADER_HALFKAY +    BOOTLOADER_TYPE = halfkay +      ifeq ($(strip $(MCU)), atmega32u4)          BOOTLOADER_SIZE = 512      endif @@ -86,18 +97,26 @@ ifeq ($(strip $(BOOTLOADER)), halfkay)  endif  ifeq ($(strip $(BOOTLOADER)), caterina)      OPT_DEFS += -DBOOTLOADER_CATERINA +    BOOTLOADER_TYPE = caterina +      BOOTLOADER_SIZE = 4096  endif  ifneq (,$(filter $(BOOTLOADER), bootloadhid bootloadHID))      OPT_DEFS += -DBOOTLOADER_BOOTLOADHID +    BOOTLOADER_TYPE = bootloadhid +      BOOTLOADER_SIZE = 4096  endif  ifneq (,$(filter $(BOOTLOADER), usbasploader USBasp))      OPT_DEFS += -DBOOTLOADER_USBASP +    BOOTLOADER_TYPE = usbasploader +      BOOTLOADER_SIZE = 4096  endif  ifeq ($(strip $(BOOTLOADER)), lufa-ms)      OPT_DEFS += -DBOOTLOADER_MS +    BOOTLOADER_TYPE = dfu +      BOOTLOADER_SIZE ?= 8192      FIRMWARE_FORMAT = bin  cpfirmware: lufa_warning @@ -115,6 +134,7 @@ endif  ifeq ($(strip $(BOOTLOADER)), stm32-dfu)      OPT_DEFS += -DBOOTLOADER_STM32_DFU +    BOOTLOADER_TYPE = stm32_dfu      # Options to pass to dfu-util when flashing      DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave @@ -122,6 +142,7 @@ ifeq ($(strip $(BOOTLOADER)), stm32-dfu)  endif  ifeq ($(strip $(BOOTLOADER)), apm32-dfu)      OPT_DEFS += -DBOOTLOADER_APM32_DFU +    BOOTLOADER_TYPE = stm32_dfu      # Options to pass to dfu-util when flashing      DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave @@ -129,6 +150,7 @@ ifeq ($(strip $(BOOTLOADER)), apm32-dfu)  endif  ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)      OPT_DEFS += -DBOOTLOADER_GD32V_DFU +    BOOTLOADER_TYPE = gd32v_dfu      # Options to pass to dfu-util when flashing      DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave @@ -136,6 +158,8 @@ ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)  endif  ifeq ($(strip $(BOOTLOADER)), kiibohd)      OPT_DEFS += -DBOOTLOADER_KIIBOHD +    BOOTLOADER_TYPE = kiibohd +      ifeq ($(strip $(MCU_ORIG)), MK20DX128)          MCU_LDSCRIPT = MK20DX128BLDR4      endif @@ -151,8 +175,7 @@ ifeq ($(strip $(BOOTLOADER)), stm32duino)      OPT_DEFS += -DBOOTLOADER_STM32DUINO      MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader      BOARD = STM32_F103_STM32DUINO -    # STM32F103 does NOT have an USB bootloader in ROM (only serial), so setting anything here does not make much sense -    STM32_BOOTLOADER_ADDRESS = 0x80000000 +    BOOTLOADER_TYPE = stm32duino      # Options to pass to dfu-util when flashing      DFU_ARGS = -d 1EAF:0003 -a 2 -R @@ -160,4 +183,17 @@ ifeq ($(strip $(BOOTLOADER)), stm32duino)  endif  ifeq ($(strip $(BOOTLOADER)), tinyuf2)      OPT_DEFS += -DBOOTLOADER_TINYUF2 +    BOOTLOADER_TYPE = tinyuf2 +endif +ifeq ($(strip $(BOOTLOADER)), halfkay) +    OPT_DEFS += -DBOOTLOADER_HALFKAY +    BOOTLOADER_TYPE = halfkay +endif +ifeq ($(strip $(BOOTLOADER)), md-boot) +    OPT_DEFS += -DBOOTLOADER_MD_BOOT +    BOOTLOADER_TYPE = md_boot +endif + +ifeq ($(strip $(BOOTLOADER_TYPE)),) +    BOOTLOADER_TYPE = none  endif diff --git a/builddefs/message.mk b/builddefs/message.mk index cb4ef43719..1187491452 100644 --- a/builddefs/message.mk +++ b/builddefs/message.mk @@ -87,6 +87,7 @@ define GENERATE_MSG_AVAILABLE_KEYMAPS  endef  MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL) +MSG_BOOTLOADER_NOT_FOUND_BASE = Bootloader not found. Make sure the board is in bootloader mode. See https://docs.qmk.fm/\#/newbs_flashing\n  MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT)  MSG_CHECK_FILESIZE_SKIPPED = (Firmware size check does not yet support $(MCU_ORIG); skipping)  MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n @@ -97,6 +98,6 @@ MSG_PYTHON_MISSING = $(ERROR_COLOR)ERROR:$(NO_COLOR) Cannot run \"qmk hello\"!\n  	Please run $(BOLD)qmk setup$(NO_COLOR) to install all the dependencies QMK requires.\n\n  MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n  MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n -MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) Bootloader not found. Trying again in 5s (Ctrl+C to cancel)\n +MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again in 5s (Ctrl+C to cancel)\n  BOOTLOADER_RETRY_TIME ?= 0.5 -MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = Bootloader not found. Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel) +MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel) diff --git a/common_features.mk b/common_features.mk index 8c593024f0..5cde023d10 100644 --- a/common_features.mk +++ b/common_features.mk @@ -356,7 +356,7 @@ endif  ifeq ($(strip $(PRINTING_ENABLE)), yes)      OPT_DEFS += -DPRINTING_ENABLE      SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c -    SRC += $(TMK_DIR)/protocol/serial_uart.c +    QUANTUM_LIB_SRC += uart.c  endif  VARIABLE_TRACE ?= no @@ -604,6 +604,7 @@ ifeq ($(strip $(UNICODE_ENABLE)), yes)  endif  ifeq ($(strip $(UNICODE_COMMON)), yes) +    OPT_DEFS += -DUNICODE_COMMON_ENABLE      SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c  endif @@ -719,6 +720,7 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)      ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42)          OPT_DEFS += -DMODULE_RN42 -        SRC += $(TMK_DIR)/protocol/serial_uart.c +        SRC += $(DRIVER_PATH)/bluetooth/rn42.c +        QUANTUM_LIB_SRC += uart.c      endif  endif diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 308f9b782b..94bbbe7e85 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -57,7 +57,7 @@          },          "bootloader": {              "type": "string", -            "enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "micronucleus", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2"], +            "enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "md-boot", "micronucleus", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2"],          },          "bootloader_instructions": {              "type": "string", @@ -69,7 +69,7 @@              "properties": {                  "debounce_type": {                      "type": "string", -                    "enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_eager_pk"] +                    "enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_defer_pr", "sym_eager_pk"]                  },                  "firmware_format": {                      "type": "string", diff --git a/docs/ChangeLog/20220226/PR15304.md b/docs/ChangeLog/20220226/PR15304.md new file mode 100644 index 0000000000..3cdb40db10 --- /dev/null +++ b/docs/ChangeLog/20220226/PR15304.md @@ -0,0 +1,13 @@ +### Split Common core now supports Pointing Devices ([#15304](https://github.com/qmk/qmk_firmware/pull/15304)) + +Pointing devices can now be shared across a split keyboard with support for a single pointing device or a pointing device on each side. + +This feature can be enabled with `#define SPLIT_POINTING_ENABLE` and one of the following options: + +| Setting                   | Description                        | +|---------------------------|------------------------------------| +|`POINTING_DEVICE_LEFT`     | Pointing device on the left side   | +|`POINTING_DEVICE_RIGHT`    | Pointing device on the right side  | +|`POINTING_DEVICE_COMBINED` | Pointing device on both sides      | + +See the [Pointing Device](../feature_pointing_device.md) documentation for further configuration options. diff --git a/docs/feature_debounce_type.md b/docs/feature_debounce_type.md index f37a785b1e..9cd736a24a 100644 --- a/docs/feature_debounce_type.md +++ b/docs/feature_debounce_type.md @@ -116,6 +116,7 @@ Where name of algorithm is one of:  For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be  appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.  * ```sym_eager_pk``` - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key +* ```sym_defer_pr``` - debouncing per row. On any state change, a per-row timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that row, the entire row is pushed. Can improve responsiveness over `sym_defer_g` while being less susceptible than per-key debouncers to noise.  * ```sym_defer_pk``` - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key status change is pushed.  * ```asym_eager_defer_pk``` - debouncing per key. On a key-down state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key. On a key-up state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key-up status change is pushed. diff --git a/docs/feature_haptic_feedback.md b/docs/feature_haptic_feedback.md index c8c74cb8f0..bbdf7e122c 100644 --- a/docs/feature_haptic_feedback.md +++ b/docs/feature_haptic_feedback.md @@ -167,7 +167,7 @@ List of waveform sequences from the datasheet:  ```  #define DRV_GREETING *sequence name or number*  ``` -If haptic feedback is enabled, the keyboard will vibrate to a specific sqeuence during startup. That can be selected using the following define: +If haptic feedback is enabled, the keyboard will vibrate to a specific sequence during startup. That can be selected using the following define:  ```  #define DRV_MODE_DEFAULT *sequence name or number* @@ -207,4 +207,4 @@ With the entry of `#define NO_HAPTIC_LOCKKEYS` in config.h, none of the followin  With the entry of `#define NO_HAPTIC_NAV` in config.h, none of the following keys will trigger a feedback: Print Screen, Pause, Insert, Delete, Page Down, Page Up, Left Arrow, Up Arrow, Right Arrow, Down Arrow, End, Home.  ### NO_HAPTIC_NUMERIC -With the entry of `#define NO_HAPTIC_NUMERIC` in config.h, none of the following keys between 0 and 9 (KC_1 ... KC_0) will trigger a feedback.
\ No newline at end of file +With the entry of `#define NO_HAPTIC_NUMERIC` in config.h, none of the following keys between 0 and 9 (KC_1 ... KC_0) will trigger a feedback. diff --git a/docs/feature_key_lock.md b/docs/feature_key_lock.md index 8e6e29f0e6..7681394229 100644 --- a/docs/feature_key_lock.md +++ b/docs/feature_key_lock.md @@ -19,4 +19,5 @@ First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Th  Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).  This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held. -Switching layers will not cancel the Key Lock. +Switching layers will not cancel the Key Lock. The Key Lock can be cancelled by calling the `cancel_key_lock()` function. + diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md index bd7fb36589..f8de92f3b4 100644 --- a/docs/feature_pointing_device.md +++ b/docs/feature_pointing_device.md @@ -30,7 +30,7 @@ The ADNS 5050 sensor uses a serial type protocol for communication, and requires  The CPI range is 125-1375, in increments of 125. Defaults to 500 CPI. -### ADSN 9800 Sensor +### ADNS 9800 Sensor  To use the ADNS 9800 sensor, add this to your `rules.mk` @@ -69,7 +69,7 @@ The Analog Joystick is an analog (ADC) driven sensor.  There are a variety of jo  |`ANALOG_JOYSTICK_AXIS_MAX`        | (Optional) Sets the upper range to be considered movement.                 | `1023`        |  |`ANALOG_JOYSTICK_SPEED_REGULATOR` | (Optional) The divisor used to slow down movement. (lower makes it faster) | `20`          |  |`ANALOG_JOYSTICK_READ_INTERVAL`   | (Optional) The interval in milliseconds between reads.                     | `10`          | -|`ANALOG_JOYSTICK_SPEED_MAX`       | (Optional) The maxiumum value used for motion.                             | `2`           | +|`ANALOG_JOYSTICK_SPEED_MAX`       | (Optional) The maximum value used for motion.                              | `2`           |  |`ANALOG_JOYSTICK_CLICK_PIN`       | (Optional) The pin wired up to the press switch of the analog stick.       | _not defined_ | @@ -127,11 +127,10 @@ The Pimoroni Trackball module is a I2C based breakout board with an RGB enable t  | Setting                             | Description                                                                        | Default |  |-------------------------------------|------------------------------------------------------------------------------------|---------|  |`PIMORONI_TRACKBALL_ADDRESS`         | (Required) Sets the I2C Address for the Pimoroni Trackball.                        | `0x0A`  | -|`PIMORONI_TRACKBALL_TIMEOUT`         | (Optional) The timeout for i2c communication with the trackpad in milliseconds.    | `100`   | -|`PIMORONI_TRACKBALL_INTERVAL_MS`     | (Optional) The update/read interval for the sensor in milliseconds.                | `8`     | +|`PIMORONI_TRACKBALL_TIMEOUT`         | (Optional) The timeout for i2c communication with the trackball in milliseconds.   | `100`   |  |`PIMORONI_TRACKBALL_SCALE`           | (Optional) The multiplier used to generate reports from the sensor.                | `5`     |  |`PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press.        | `20`    | -|`PIMORONI_TRACKBALL_ERROR_COUNT`     | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10`  | +|`PIMORONI_TRACKBALL_ERROR_COUNT`     | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10`    |  ### PMW 3360 Sensor @@ -171,14 +170,35 @@ void           pointing_device_driver_set_cpi(uint16_t cpi) {}  ## Common Configuration -| Setting                       | Description                                                           | Default       | -|-------------------------------|-----------------------------------------------------------------------|---------------| -|`POINTING_DEVICE_ROTATION_90`  | (Optional) Rotates the X and Y data by  90 degrees.                   | _not defined_ | -|`POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees.                   | _not defined_ | -|`POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees.                   | _not defined_ | -|`POINTING_DEVICE_INVERT_X`     | (Optional) Inverts the X axis report.                                 | _not defined_ | -|`POINTING_DEVICE_INVERT_Y`     | (Optional) Inverts the Y axis report.                                 | _not defined_ | -|`POINTING_DEVICE_MOTION_PIN`   | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ | +| Setting                          | Description                                                           | Default           | +|----------------------------------|-----------------------------------------------------------------------|-------------------| +|`POINTING_DEVICE_ROTATION_90`     | (Optional) Rotates the X and Y data by  90 degrees.                   | _not defined_     | +|`POINTING_DEVICE_ROTATION_180`    | (Optional) Rotates the X and Y data by 180 degrees.                   | _not defined_     | +|`POINTING_DEVICE_ROTATION_270`    | (Optional) Rotates the X and Y data by 270 degrees.                   | _not defined_     | +|`POINTING_DEVICE_INVERT_X`        | (Optional) Inverts the X axis report.                                 | _not defined_     | +|`POINTING_DEVICE_INVERT_Y`        | (Optional) Inverts the Y axis report.                                 | _not defined_     | +|`POINTING_DEVICE_MOTION_PIN`      | (Optional) If supported, will only read from sensor if pin is active. | _not defined_     | +|`POINTING_DEVICE_TASK_THROTTLE_MS`      | (Optional) Limits the frequency that the sensor is polled for motion. | _not defined_     | + +!> When using `SPLIT_POINTING_ENABLE` the `POINTING_DEVICE_MOTION_PIN` functionality is not supported and would recommend `POINTING_DEVICE_TASK_THROTTLE_MS` be set to `1`. Increasing this value will increase transport performance at the cost of possible mouse responsiveness. + + +## Split Keyboard Configuration + +The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](feature_split_keyboard.md?id=data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device. + +| Setting                                | Description                                                           | Default       | +|----------------------------------------|-----------------------------------------------------------------------|---------------| +|`POINTING_DEVICE_LEFT`                  | Pointing device on the left side (Required - pick one only)           | _not defined_ | +|`POINTING_DEVICE_RIGHT`                 | Pointing device on the right side (Required - pick one only)          | _not defined_ | +|`POINTING_DEVICE_COMBINED`              | Pointing device on both sides (Required - pick one only)              | _not defined_ | +|`POINTING_DEVICE_ROTATION_90_RIGHT`     | (Optional) Rotates the X and Y data by  90 degrees.                   | _not defined_ | +|`POINTING_DEVICE_ROTATION_180_RIGHT`    | (Optional) Rotates the X and Y data by 180 degrees.                   | _not defined_ | +|`POINTING_DEVICE_ROTATION_270_RIGHT`    | (Optional) Rotates the X and Y data by 270 degrees.                   | _not defined_ | +|`POINTING_DEVICE_INVERT_X_RIGHT`        | (Optional) Inverts the X axis report.                                 | _not defined_ | +|`POINTING_DEVICE_INVERT_Y_RIGHT`        | (Optional) Inverts the Y axis report.                                 | _not defined_ | + +!> If there is a `_RIGHT` configuration option or callback, the [common configuration](feature_pointing_device.md?id=common-configuration) option will work for the left. For correct left/right detection you should setup a [handedness option](feature_split_keyboard?id=setting-handedness), `EE_HANDS` is usually a good option for an existing board that doesn't do handedness by hardware.  ## Callbacks and Functions  @@ -188,7 +208,7 @@ void           pointing_device_driver_set_cpi(uint16_t cpi) {}  | `pointing_device_init_kb(void)`                            | Callback to allow for keyboard level initialization. Useful for additional hardware sensors.                  |  | `pointing_device_init_user(void)`                          | Callback to allow for user level initialization. Useful for additional hardware sensors.                      |  | `pointing_device_task_kb(mouse_report)`                    | Callback that sends sensor data, so keyboard code can intercept and modify the data.  Returns a mouse report. | -| `pointing_device_task_user(mouse_report)`                  | Callback that sends sensor data, so user coe can intercept and modify the data.  Returns a mouse report.      | +| `pointing_device_task_user(mouse_report)`                  | Callback that sends sensor data, so user code can intercept and modify the data.  Returns a mouse report.     |  | `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`.                                              |  | `pointing_device_get_cpi(void)`                            | Gets the current CPI/DPI setting from the sensor, if supported.                                               |  | `pointing_device_set_cpi(uint16_t)`                        | Sets the CPI/DPI, if supported.                                                                               | @@ -196,6 +216,21 @@ void           pointing_device_driver_set_cpi(uint16_t cpi) {}  | `pointing_device_set_report(mouse_report)`                 | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function.                |   | `pointing_device_send(void)`                               | Sends the current mouse report to the host system.  Function can be replaced.                                 |   | `has_mouse_report_changed(old, new)`                       | Compares the old and new `mouse_report_t` data and returns true only if it has changed.                       | +| `pointing_device_adjust_by_defines(mouse_report)`          | Applies rotations and invert configurations to a raw mouse report.                                             | + + +## Split Keyboard Callbacks and Functions + +The combined functions below are only available when using `SPLIT_POINTING_ENABLE` and `POINTING_DEVICE_COMBINED`. The 2 callbacks `pointing_device_task_combined_*` replace the single sided equivalents above. See the [combined pointing devices example](feature_pointing_device.md?id=combined-pointing-devices) + +| Function                                                        | Description                                                                                                              | +|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------| +| `pointing_device_set_shared_report(mouse_report)`               | Sets the shared mouse report to the assigned `mouse_report_t` data structured passed to the function.                    | +| `pointing_device_set_cpi_on_side(bool, uint16_t)`               | Sets the CPI/DPI of one side, if supported. Passing `true` will set the left and `false` the right`                      | +| `pointing_device_combine_reports(left_report, right_report)`    | Returns a combined mouse_report of left_report and right_report (as a `mouse_report_t` data structure)                   | +| `pointing_device_task_combined_kb(left_report, right_report)`   | Callback, so keyboard code can intercept and modify the data. Returns a combined mouse report.                           | +| `pointing_device_task_combined_user(left_report, right_report)` | Callback, so user code can intercept and modify. Returns a combined mouse report using `pointing_device_combine_reports` | +| `pointing_device_adjust_by_defines_right(mouse_report)`         | Applies right side rotations and invert configurations to a raw mouse report.                                            |  # Manipulating Mouse Reports @@ -242,3 +277,62 @@ case MS_SPECIAL:  ```  Recall that the mouse report is set to zero (except the buttons) whenever it is sent, so the scrolling would only occur once in each case. + +## Split Examples + +The following examples make use the `SPLIT_POINTING_ENABLE` functionality and show how to manipulate the mouse report for a scrolling mode. + +### Single Pointing Device + +The following example will work with either `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` and enables scrolling mode while on a particular layer. + +```c + +static bool scrolling_mode = false; + +layer_state_t layer_state_set_user(layer_state_t state) { +    switch (get_highest_layer(state)) { +        case _RAISE:  // If we're on the _RAISE layer enable scrolling mode +            scrolling_mode = true; +            pointing_device_set_cpi(2000); +            break; +        default: +            if (scrolling_mode) {  // check if we were scrolling before and set disable if so +                scrolling_mode = false; +                pointing_device_set_cpi(8000); +            } +            break; +    } +    return state; +} + +report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { +    if (scrolling_mode) { +        mouse_report.h = mouse_report.x; +        mouse_report.v = mouse_report.y; +        mouse_report.x = 0; +        mouse_report.y = 0; +    } +    return mouse_report; +} + +``` + +### Combined Pointing Devices + +The following example requires `POINTING_DEVICE_COMBINED` and sets the left side pointing device to scroll only. + +```c +void keyboard_post_init_user(void) { +    pointing_device_set_cpi_on_side(true, 1000); //Set cpi on left side to a low value for slower scrolling. +    pointing_device_set_cpi_on_side(false, 8000); //Set cpi on right side to a reasonable value for mousing. +} + +report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report) { +    left_report.h = left_report.x; +    left_report.v = left_report.y; +    left_report.x = 0; +    left_report.y = 0; +    return pointing_device_combine_reports(left_report, right_report); +} +``` diff --git a/docs/feature_split_keyboard.md b/docs/feature_split_keyboard.md index c8ba18beeb..b51593308e 100644 --- a/docs/feature_split_keyboard.md +++ b/docs/feature_split_keyboard.md @@ -266,6 +266,14 @@ This enables transmitting the current OLED on/off status to the slave side of th  This enables transmitting the current ST7565 on/off status to the slave side of the split keyboard. The purpose of this feature is to support state (on/off state only) syncing. +```c +#define SPLIT_POINTING_ENABLE +``` + +This enables transmitting the pointing device status to the master side of the split keyboard. The purpose of this feature is to enable use pointing devices on the slave side.  + +!> There is additional required configuration for `SPLIT_POINTING_ENABLE` outlined in the [pointing device documentation](feature_pointing_device.md?id=split-keyboard-configuration). +  ### Custom data sync between sides :id=custom-data-sync  QMK's split transport allows for arbitrary data transactions at both the keyboard and user levels. This is modelled on a remote procedure call, with the master invoking a function on the slave side, with the ability to send data from master to slave, process it slave side, and send data back from slave to master. diff --git a/docs/feature_wpm.md b/docs/feature_wpm.md index 87145c97e3..9f98ef8336 100644 --- a/docs/feature_wpm.md +++ b/docs/feature_wpm.md @@ -16,7 +16,7 @@ For split keyboards using soft serial, the computed WPM score will be available  | `WPM_ALLOW_COUNT_REGRESSION` | _Not defined_ | If defined allows the WPM to be decreased when hitting Delete or Backspace               |  | `WPM_UNFILTERED`             | _Not defined_ | If undefined (the default), WPM values will be smoothed to avoid sudden changes in value |  | `WPM_SAMPLE_SECONDS`         | `5`           | This defines how many seconds of typing to average, when calculating WPM                 | -| `WPM_SAMPLE_PERIODS`         | `50`          | This defines how many sampling periods to use when calculating WPM                       | +| `WPM_SAMPLE_PERIODS`         | `25`          | This defines how many sampling periods to use when calculating WPM                       |  | `WPM_LAUNCH_CONTROL`         | _Not defined_ | If defined, WPM values will be calculated using partial buffers when typing begins       |  'WPM_UNFILTERED' is potentially useful if you're filtering data in some other way (and also because it reduces the code required for the WPM feature), or if reducing measurement latency to a minimum is important for you. diff --git a/docs/internals_gpio_control.md b/docs/internals_gpio_control.md index ccd3f8c74d..e1f1515b71 100644 --- a/docs/internals_gpio_control.md +++ b/docs/internals_gpio_control.md @@ -6,17 +6,19 @@ QMK has a GPIO control abstraction layer which is microcontroller agnostic. This  The following functions provide basic control of GPIOs and are found in `platforms/<platform>/gpio.h`. -|Function                |Description                                       | Old AVR Examples                                | Old ChibiOS/ARM Examples                        | -|------------------------|--------------------------------------------------|-------------------------------------------------|-------------------------------------------------| -| `setPinInput(pin)`     | Set pin as input with high impedance (High-Z)    | `DDRB &= ~(1<<2)`                               | `palSetLineMode(pin, PAL_MODE_INPUT)`           | -| `setPinInputHigh(pin)` | Set pin as input with builtin pull-up resistor   | `DDRB &= ~(1<<2); PORTB \|= (1<<2)`             | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)`    | -| `setPinInputLow(pin)`  | Set pin as input with builtin pull-down resistor | N/A (Not supported on AVR)                      | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)`  | -| `setPinOutput(pin)`    | Set pin as output                                | `DDRB \|= (1<<2)`                               | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` | -| `writePinHigh(pin)`    | Set pin level as high, assuming it is an output  | `PORTB \|= (1<<2)`                              | `palSetLine(pin)`                               | -| `writePinLow(pin)`     | Set pin level as low, assuming it is an output   | `PORTB &= ~(1<<2)`                              | `palClearLine(pin)`                             | -| `writePin(pin, level)` | Set pin level, assuming it is an output          | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` | -| `readPin(pin)`         | Returns the level of the pin                     | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)`           | `palReadLine(pin)`                              | -| `togglePin(pin)`       | Invert pin level, assuming it is an output       | `PORTB ^= (1<<2)`                               | `palToggleLine(pin)`                            | +| Function                     | Description                                         | Old AVR Examples                                | Old ChibiOS/ARM Examples                         | +|------------------------------|-----------------------------------------------------|-------------------------------------------------|--------------------------------------------------| +| `setPinInput(pin)`           | Set pin as input with high impedance (High-Z)       | `DDRB &= ~(1<<2)`                               | `palSetLineMode(pin, PAL_MODE_INPUT)`            | +| `setPinInputHigh(pin)`       | Set pin as input with builtin pull-up resistor      | `DDRB &= ~(1<<2); PORTB \|= (1<<2)`             | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)`     | +| `setPinInputLow(pin)`        | Set pin as input with builtin pull-down resistor    | N/A (Not supported on AVR)                      | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)`   | +| `setPinOutput(pin)`          | Set pin as output (alias of `setPinOutputPushPull`) | `DDRB \|= (1<<2)`                               | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)`  | +| `setPinOutputPushPull(pin)`  | Set pin as output, push/pull mode                   | `DDRB \|= (1<<2)`                               | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)`  | +| `setPinOutputOpenDrain(pin)` | Set pin as output, open-drain mode                  | N/A (Not implemented on AVR)                    | `palSetLineMode(pin, PAL_MODE_OUTPUT_OPENDRAIN)` | +| `writePinHigh(pin)`          | Set pin level as high, assuming it is an output     | `PORTB \|= (1<<2)`                              | `palSetLine(pin)`                                | +| `writePinLow(pin)`           | Set pin level as low, assuming it is an output      | `PORTB &= ~(1<<2)`                              | `palClearLine(pin)`                              | +| `writePin(pin, level)`       | Set pin level, assuming it is an output             | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)`  | +| `readPin(pin)`               | Returns the level of the pin                        | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)`           | `palReadLine(pin)`                               | +| `togglePin(pin)`             | Invert pin level, assuming it is an output          | `PORTB ^= (1<<2)`                               | `palToggleLine(pin)`                             |  ## Advanced Settings :id=advanced-settings diff --git a/docs/keycodes.md b/docs/keycodes.md index ba06e1b8b6..2ea4fc74e2 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -326,6 +326,7 @@ See also: [Magic Keycodes](keycodes_magic.md)  |----------------------------------|---------|--------------------------------------------------------------------------|  |`MAGIC_SWAP_CONTROL_CAPSLOCK`     |`CL_SWAP`|Swap Caps Lock and Left Control                                           |  |`MAGIC_UNSWAP_CONTROL_CAPSLOCK`   |`CL_NORM`|Unswap Caps Lock and Left Control                                         | +|`MAGIC_TOGGLE_CONTROL_CAPSLOCK`   |`CL_TOGG`|Toggle Caps Lock and Left Control swap                                    |  |`MAGIC_CAPSLOCK_TO_CONTROL`       |`CL_CTRL`|Treat Caps Lock as Control                                                |  |`MAGIC_UNCAPSLOCK_TO_CONTROL`     |`CL_CAPS`|Stop treating Caps Lock as Control                                        |  |`MAGIC_SWAP_LCTL_LGUI`            |`LCG_SWP`|Swap Left Control and GUI                                                 | diff --git a/docs/keycodes_magic.md b/docs/keycodes_magic.md index 7e1b1a4f62..01eb69168e 100644 --- a/docs/keycodes_magic.md +++ b/docs/keycodes_magic.md @@ -6,6 +6,7 @@  |----------------------------------|---------|--------------------------------------------------------------------------|  |`MAGIC_SWAP_CONTROL_CAPSLOCK`     |`CL_SWAP`|Swap Caps Lock and Left Control                                           |  |`MAGIC_UNSWAP_CONTROL_CAPSLOCK`   |`CL_NORM`|Unswap Caps Lock and Left Control                                         | +|`MAGIC_TOGGLE_CONTROL_CAPSLOCK`   |`CL_TOGG`|Toggle Caps Lock and Left Control swap                                    |  |`MAGIC_CAPSLOCK_TO_CONTROL`       |`CL_CTRL`|Treat Caps Lock as Control                                                |  |`MAGIC_UNCAPSLOCK_TO_CONTROL`     |`CL_CAPS`|Stop treating Caps Lock as Control                                        |  |`MAGIC_SWAP_LCTL_LGUI`            |`LCG_SWP`|Swap Left Control and GUI                                                 | diff --git a/drivers/bluetooth/rn42.c b/drivers/bluetooth/rn42.c new file mode 100644 index 0000000000..2ef40bb7e0 --- /dev/null +++ b/drivers/bluetooth/rn42.c @@ -0,0 +1,99 @@ +/* Copyright 2021 + * + * 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 "report.h" +#include "uart.h" + +#ifndef RN42_BAUD_RATE +#    define RN42_BAUD_RATE 115200 +#endif + +// https://cdn.sparkfun.com/datasheets/Wireless/Bluetooth/bluetooth_cr_UG-v1.0r.pdf#G7.663734 +static inline uint16_t rn42_consumer_usage_to_bitmap(uint16_t usage) { +    switch (usage) { +        case AC_HOME: +            return 0x0001; +        case AL_EMAIL: +            return 0x0002; +        case AC_SEARCH: +            return 0x0004; +        case AL_KEYBOARD_LAYOUT: +            return 0x0008; +        case AUDIO_VOL_UP: +            return 0x0010; +        case AUDIO_VOL_DOWN: +            return 0x0020; +        case AUDIO_MUTE: +            return 0x0040; +        case TRANSPORT_PLAY_PAUSE: +            return 0x0080; +        case TRANSPORT_NEXT_TRACK: +            return 0x0100; +        case TRANSPORT_PREV_TRACK: +            return 0x0200; +        case TRANSPORT_STOP: +            return 0x0400; +        case TRANSPORT_EJECT: +            return 0x0800; +        case TRANSPORT_FAST_FORWARD: +            return 0x1000; +        case TRANSPORT_REWIND: +            return 0x2000; +        case TRANSPORT_STOP_EJECT: +            return 0x4000; +        case AL_LOCAL_BROWSER: +            return 0x8000; +        default: +            return 0; +    } +} + +void rn42_init(void) { uart_init(RN42_BAUD_RATE); } + +void rn42_send_keyboard(report_keyboard_t *report) { +    uart_write(0xFD); +    uart_write(0x09); +    uart_write(0x01); +    uart_write(report->mods); +    uart_write(0x00); +    for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { +        uart_write(report->keys[i]); +    } +} + +void rn42_send_mouse(report_mouse_t *report) { +    uart_write(0xFD); +    uart_write(0x00); +    uart_write(0x03); +    uart_write(report->buttons); +    uart_write(report->x); +    uart_write(report->y); +    uart_write(report->v);  // should try sending the wheel v here +    uart_write(report->h);  // should try sending the wheel h here +    uart_write(0x00); +} + +void rn42_send_consumer(uint16_t data) { +    static uint16_t last_data = 0; +    if (data == last_data) return; +    last_data       = data; +    uint16_t bitmap = rn42_consumer_usage_to_bitmap(data); +    uart_write(0xFD); +    uart_write(0x03); +    uart_write(0x03); +    uart_write(bitmap & 0xFF); +    uart_write((bitmap >> 8) & 0xFF); +} diff --git a/drivers/bluetooth/rn42.h b/drivers/bluetooth/rn42.h new file mode 100644 index 0000000000..4747759111 --- /dev/null +++ b/drivers/bluetooth/rn42.h @@ -0,0 +1,25 @@ +/* Copyright 2021 + * + * 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 "report.h" + +void rn42_init(void); + +void rn42_send_keyboard(report_keyboard_t *report); + +void rn42_send_mouse(report_mouse_t *report); + +void rn42_send_consumer(uint16_t data); diff --git a/drivers/sensors/adns9800.c b/drivers/sensors/adns9800.c index c52f991804..425cf9912f 100644 --- a/drivers/sensors/adns9800.c +++ b/drivers/sensors/adns9800.c @@ -154,8 +154,8 @@ void adns9800_init() {  }  config_adns9800_t adns9800_get_config(void) { -    uint8_t config_1 = adns9800_read(REG_Configuration_I); -    return (config_adns9800_t){(config_1 & 0xFF) * CPI_STEP}; +    uint8_t cpival = adns9800_read(REG_Configuration_I); +    return (config_adns9800_t){(cpival & 0xFF) * CPI_STEP};  }  void adns9800_set_config(config_adns9800_t config) { @@ -164,8 +164,8 @@ void adns9800_set_config(config_adns9800_t config) {  }  uint16_t adns9800_get_cpi(void) { -    uint8_t config_1 = adns9800_read(REG_Configuration_I); -    return (uint16_t){(config_1 & 0xFF) * CPI_STEP}; +    uint8_t cpival = adns9800_read(REG_Configuration_I); +    return (uint16_t)(cpival & 0xFF) * CPI_STEP;  }  void adns9800_set_cpi(uint16_t cpi) { @@ -184,7 +184,7 @@ static int16_t convertDeltaToInt(uint8_t high, uint8_t low) {  }  report_adns9800_t adns9800_get_report(void) { -    report_adns9800_t report = {0, 0}; +    report_adns9800_t report = {0};      adns9800_spi_start(); diff --git a/drivers/sensors/pimoroni_trackball.c b/drivers/sensors/pimoroni_trackball.c index 7d390056ea..2867e763bc 100644 --- a/drivers/sensors/pimoroni_trackball.c +++ b/drivers/sensors/pimoroni_trackball.c @@ -33,8 +33,24 @@  static uint16_t precision = 128; -float pimoroni_trackball_get_precision(void) { return ((float)precision / 128); } -void  pimoroni_trackball_set_precision(float floatprecision) { precision = (floatprecision * 128); } +uint16_t pimoroni_trackball_get_cpi(void) { return (precision * 125); } +/** + * @brief Sets the scaling value for pimoroni trackball + * + * Sets a scaling value for pimoroni trackball to allow runtime adjustment. This isn't used by the sensor and is an + * approximation so the functions are consistent across drivers. + * + * NOTE: This rounds down to the nearest number divisable by 125 that's a positive integer, values below 125 are clamped to 125. + * + * @param cpi uint16_t + */ +void pimoroni_trackball_set_cpi(uint16_t cpi) { +    if (cpi < 249) { +        precision = 1; +    } else { +        precision = (cpi - (cpi % 125)) / 125; +    } +}  void pimoroni_trackball_set_rgbw(uint8_t r, uint8_t g, uint8_t b, uint8_t w) {      uint8_t                              data[4] = {r, g, b, w}; @@ -60,7 +76,7 @@ i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data) {      return status;  } -__attribute__((weak)) void pimironi_trackball_device_init(void) { +__attribute__((weak)) void pimoroni_trackball_device_init(void) {      i2c_init();      pimoroni_trackball_set_rgbw(0x00, 0x00, 0x00, 0x00);  } diff --git a/drivers/sensors/pimoroni_trackball.h b/drivers/sensors/pimoroni_trackball.h index 59ee8724ba..e20ee748a7 100644 --- a/drivers/sensors/pimoroni_trackball.h +++ b/drivers/sensors/pimoroni_trackball.h @@ -23,9 +23,6 @@  #ifndef PIMORONI_TRACKBALL_ADDRESS  #    define PIMORONI_TRACKBALL_ADDRESS 0x0A  #endif -#ifndef PIMORONI_TRACKBALL_INTERVAL_MS -#    define PIMORONI_TRACKBALL_INTERVAL_MS 8 -#endif  #ifndef PIMORONI_TRACKBALL_SCALE  #    define PIMORONI_TRACKBALL_SCALE 5  #endif @@ -52,10 +49,10 @@ typedef struct {      uint8_t click;  } pimoroni_data_t; -void         pimironi_trackball_device_init(void); +void         pimoroni_trackball_device_init(void);  void         pimoroni_trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white);  int16_t      pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_dir, uint8_t scale);  void         pimoroni_trackball_adapt_values(int8_t* mouse, int16_t* offset); -float        pimoroni_trackball_get_precision(void); -void         pimoroni_trackball_set_precision(float precision); +uint16_t     pimoroni_trackball_get_cpi(void); +void         pimoroni_trackball_set_cpi(uint16_t cpi);  i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data); diff --git a/drivers/sensors/pmw3360.c b/drivers/sensors/pmw3360.c index 50d1c35801..4854ba5f47 100644 --- a/drivers/sensors/pmw3360.c +++ b/drivers/sensors/pmw3360.c @@ -16,6 +16,7 @@   * along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ +#include "spi_master.h"  #include "pmw3360.h"  #include "wait.h"  #include "debug.h" @@ -24,55 +25,57 @@  // Registers  // clang-format off -#define REG_Product_ID                 0x00 -#define REG_Revision_ID                0x01 -#define REG_Motion                     0x02 -#define REG_Delta_X_L                  0x03 -#define REG_Delta_X_H                  0x04 -#define REG_Delta_Y_L                  0x05 -#define REG_Delta_Y_H                  0x06 -#define REG_SQUAL                      0x07 -#define REG_Raw_Data_Sum               0x08 -#define REG_Maximum_Raw_data           0x09 -#define REG_Minimum_Raw_data           0x0A -#define REG_Shutter_Lower              0x0B -#define REG_Shutter_Upper              0x0C -#define REG_Control                    0x0D -#define REG_Config1                    0x0F -#define REG_Config2                    0x10 -#define REG_Angle_Tune                 0x11 -#define REG_Frame_Capture              0x12 -#define REG_SROM_Enable                0x13 -#define REG_Run_Downshift              0x14 -#define REG_Rest1_Rate_Lower           0x15 -#define REG_Rest1_Rate_Upper           0x16 -#define REG_Rest1_Downshift            0x17 -#define REG_Rest2_Rate_Lower           0x18 -#define REG_Rest2_Rate_Upper           0x19 -#define REG_Rest2_Downshift            0x1A -#define REG_Rest3_Rate_Lower           0x1B -#define REG_Rest3_Rate_Upper           0x1C -#define REG_Observation                0x24 -#define REG_Data_Out_Lower             0x25 -#define REG_Data_Out_Upper             0x26 -#define REG_Raw_Data_Dump              0x29 -#define REG_SROM_ID                    0x2A -#define REG_Min_SQ_Run                 0x2B -#define REG_Raw_Data_Threshold         0x2C -#define REG_Config5                    0x2F -#define REG_Power_Up_Reset             0x3A -#define REG_Shutdown                   0x3B -#define REG_Inverse_Product_ID         0x3F -#define REG_LiftCutoff_Tune3           0x41 -#define REG_Angle_Snap                 0x42 -#define REG_LiftCutoff_Tune1           0x4A -#define REG_Motion_Burst               0x50 -#define REG_LiftCutoff_Tune_Timeout    0x58 -#define REG_LiftCutoff_Tune_Min_Length 0x5A -#define REG_SROM_Load_Burst            0x62 -#define REG_Lift_Config                0x63 -#define REG_Raw_Data_Burst             0x64 -#define REG_LiftCutoff_Tune2           0x65 +#define REG_Product_ID                   0x00 +#define REG_Revision_ID                  0x01 +#define REG_Motion                       0x02 +#define REG_Delta_X_L                    0x03 +#define REG_Delta_X_H                    0x04 +#define REG_Delta_Y_L                    0x05 +#define REG_Delta_Y_H                    0x06 +#define REG_SQUAL                        0x07 +#define REG_Raw_Data_Sum                 0x08 +#define REG_Maximum_Raw_data             0x09 +#define REG_Minimum_Raw_data             0x0a +#define REG_Shutter_Lower                0x0b +#define REG_Shutter_Upper                0x0c +#define REG_Control                      0x0d +#define REG_Config1                      0x0f +#define REG_Config2                      0x10 +#define REG_Angle_Tune                   0x11 +#define REG_Frame_Capture                0x12 +#define REG_SROM_Enable                  0x13 +#define REG_Run_Downshift                0x14 +#define REG_Rest1_Rate_Lower             0x15 +#define REG_Rest1_Rate_Upper             0x16 +#define REG_Rest1_Downshift              0x17 +#define REG_Rest2_Rate_Lower             0x18 +#define REG_Rest2_Rate_Upper             0x19 +#define REG_Rest2_Downshift              0x1a +#define REG_Rest3_Rate_Lower             0x1b +#define REG_Rest3_Rate_Upper             0x1c +#define REG_Observation                  0x24 +#define REG_Data_Out_Lower               0x25 +#define REG_Data_Out_Upper               0x26 +#define REG_Raw_Data_Dump                0x29 +#define REG_SROM_ID                      0x2a +#define REG_Min_SQ_Run                   0x2b +#define REG_Raw_Data_Threshold           0x2c +#define REG_Config5                      0x2f +#define REG_Power_Up_Reset               0x3a +#define REG_Shutdown                     0x3b +#define REG_Inverse_Product_ID           0x3f +#define REG_LiftCutoff_Tune3             0x41 +#define REG_Angle_Snap                   0x42 +#define REG_LiftCutoff_Tune1             0x4a +#define REG_Motion_Burst                 0x50 +#define REG_LiftCutoff_Tune_Timeout      0x58 +#define REG_LiftCutoff_Tune_Min_Length   0x5a +#define REG_SROM_Load_Burst              0x62 +#define REG_Lift_Config                  0x63 +#define REG_Raw_Data_Burst               0x64 +#define REG_LiftCutoff_Tune2             0x65 + +#define CPI_STEP          100  // clang-format on  #ifndef MAX_CPI @@ -86,41 +89,36 @@ void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1'  #endif  #define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt))) -bool spi_start_adv(void) { +bool pmw3360_spi_start(void) {      bool status = spi_start(PMW3360_CS_PIN, PMW3360_SPI_LSBFIRST, PMW3360_SPI_MODE, PMW3360_SPI_DIVISOR);      wait_us(1);      return status;  } -void spi_stop_adv(void) { -    wait_us(1); -    spi_stop(); -} +spi_status_t pmw3360_write(uint8_t reg_addr, uint8_t data) { +    pmw3360_spi_start(); -spi_status_t spi_write_adv(uint8_t reg_addr, uint8_t data) {      if (reg_addr != REG_Motion_Burst) {          _inBurst = false;      } -    spi_start_adv();      // send address of the register, with MSBit = 1 to indicate it's a write      spi_status_t status = spi_write(reg_addr | 0x80);      status              = spi_write(data);      // tSCLK-NCS for write operation -    wait_us(20); +    wait_us(35); -    // tSWW/tSWR (=120us) minus tSCLK-NCS. Could be shortened, but is looks like a safe lower bound -    wait_us(100); +    // tSWW/tSWR (=180us) minus tSCLK-NCS. Could be shortened, but is looks like a safe lower bound +    wait_us(145);      spi_stop();      return status;  } -uint8_t spi_read_adv(uint8_t reg_addr) { -    spi_start_adv(); +uint8_t pmw3360_read(uint8_t reg_addr) { +    pmw3360_spi_start();      // send adress of the register, with MSBit = 0 to indicate it's a read      spi_write(reg_addr & 0x7f); -      uint8_t data = spi_read();      // tSCLK-NCS for read operation is 120ns @@ -133,19 +131,6 @@ uint8_t spi_read_adv(uint8_t reg_addr) {      return data;  } -void pmw3360_set_cpi(uint16_t cpi) { -    uint8_t cpival = constrain((cpi / 100) - 1, 0, MAX_CPI); - -    spi_start_adv(); -    spi_write_adv(REG_Config1, cpival); -    spi_stop(); -} - -uint16_t pmw3360_get_cpi(void) { -    uint8_t cpival = spi_read_adv(REG_Config1); -    return (uint16_t)((cpival + 1) & 0xFF) * 100; -} -  bool pmw3360_init(void) {      setPinOutput(PMW3360_CS_PIN); @@ -153,42 +138,51 @@ bool pmw3360_init(void) {      _inBurst = false;      spi_stop(); -    spi_start_adv(); +    pmw3360_spi_start();      spi_stop(); -    spi_write_adv(REG_Shutdown, 0xb6);  // Shutdown first +    pmw3360_write(REG_Shutdown, 0xb6);  // Shutdown first      wait_ms(300); -    spi_start_adv(); +    pmw3360_spi_start();      wait_us(40); -    spi_stop_adv(); +    spi_stop();      wait_us(40); -    spi_write_adv(REG_Power_Up_Reset, 0x5a); +    // reboot +    pmw3360_write(REG_Power_Up_Reset, 0x5a);      wait_ms(50); -    spi_read_adv(REG_Motion); -    spi_read_adv(REG_Delta_X_L); -    spi_read_adv(REG_Delta_X_H); -    spi_read_adv(REG_Delta_Y_L); -    spi_read_adv(REG_Delta_Y_H); +    // read registers and discard +    pmw3360_read(REG_Motion); +    pmw3360_read(REG_Delta_X_L); +    pmw3360_read(REG_Delta_X_H); +    pmw3360_read(REG_Delta_Y_L); +    pmw3360_read(REG_Delta_Y_H);      pmw3360_upload_firmware(); -    spi_stop_adv(); +    spi_stop();      wait_ms(10);      pmw3360_set_cpi(PMW3360_CPI);      wait_ms(1); -    spi_write_adv(REG_Config2, 0x00); +    pmw3360_write(REG_Config2, 0x00); -    spi_write_adv(REG_Angle_Tune, constrain(ROTATIONAL_TRANSFORM_ANGLE, -30, 30)); +    pmw3360_write(REG_Angle_Tune, constrain(ROTATIONAL_TRANSFORM_ANGLE, -127, 127)); -    spi_write_adv(REG_Lift_Config, PMW3360_LIFTOFF_DISTANCE); +    pmw3360_write(REG_Lift_Config, PMW3360_LIFTOFF_DISTANCE);      bool init_success = pmw3360_check_signature(); +#ifdef CONSOLE_ENABLE +    if (init_success) { +        dprintf("pmw3360 signature verified"); +    } else { +        dprintf("pmw3360 signature verification failed!"); +    } +#endif      writePinLow(PMW3360_CS_PIN); @@ -196,13 +190,13 @@ bool pmw3360_init(void) {  }  void pmw3360_upload_firmware(void) { -    spi_write_adv(REG_SROM_Enable, 0x1d); +    pmw3360_write(REG_SROM_Enable, 0x1d);      wait_ms(10); -    spi_write_adv(REG_SROM_Enable, 0x18); +    pmw3360_write(REG_SROM_Enable, 0x18); -    spi_start_adv(); +    pmw3360_spi_start();      spi_write(REG_SROM_Load_Burst | 0x80);      wait_us(15); @@ -214,68 +208,72 @@ void pmw3360_upload_firmware(void) {      }      wait_us(200); -    spi_read_adv(REG_SROM_ID); - -    spi_write_adv(REG_Config2, 0x00); - -    spi_stop(); -    wait_ms(10); +    pmw3360_read(REG_SROM_ID); +    pmw3360_write(REG_Config2, 0x00);  }  bool pmw3360_check_signature(void) { -    uint8_t pid      = spi_read_adv(REG_Product_ID); -    uint8_t iv_pid   = spi_read_adv(REG_Inverse_Product_ID); -    uint8_t SROM_ver = spi_read_adv(REG_SROM_ID); +    uint8_t pid      = pmw3360_read(REG_Product_ID); +    uint8_t iv_pid   = pmw3360_read(REG_Inverse_Product_ID); +    uint8_t SROM_ver = pmw3360_read(REG_SROM_ID);      return (pid == firmware_signature[0] && iv_pid == firmware_signature[1] && SROM_ver == firmware_signature[2]);  // signature for SROM 0x04  } +uint16_t pmw3360_get_cpi(void) { +    uint8_t cpival = pmw3360_read(REG_Config1); +    return (uint16_t)((cpival + 1) & 0xFF) * CPI_STEP; +} + +void pmw3360_set_cpi(uint16_t cpi) { +    uint8_t cpival = constrain((cpi / CPI_STEP) - 1, 0, MAX_CPI); +    pmw3360_write(REG_Config1, cpival); +} +  report_pmw3360_t pmw3360_read_burst(void) { +    report_pmw3360_t report = {0}; +      if (!_inBurst) {  #ifdef CONSOLE_ENABLE          dprintf("burst on");  #endif -        spi_write_adv(REG_Motion_Burst, 0x00); +        pmw3360_write(REG_Motion_Burst, 0x00);          _inBurst = true;      } -    spi_start_adv(); +    pmw3360_spi_start();      spi_write(REG_Motion_Burst);      wait_us(35);  // waits for tSRAD -    report_pmw3360_t data = {0}; - -    data.motion = spi_read(); +    report.motion = spi_read();      spi_write(0x00);  // skip Observation -    data.dx  = spi_read(); -    data.mdx = spi_read(); -    data.dy  = spi_read(); -    data.mdy = spi_read(); +    report.dx  = spi_read(); +    report.mdx = spi_read(); +    report.dy  = spi_read(); +    report.mdy = spi_read();      spi_stop();  #ifdef CONSOLE_ENABLE      if (debug_mouse) { -        print_byte(data.motion); -        print_byte(data.dx); -        print_byte(data.mdx); -        print_byte(data.dy); -        print_byte(data.mdy); +        print_byte(report.motion); +        print_byte(report.dx); +        print_byte(report.mdx); +        print_byte(report.dy); +        print_byte(report.mdy);          dprintf("\n");      }  #endif -    data.isMotion    = (data.motion & 0x80) != 0; -    data.isOnSurface = (data.motion & 0x08) == 0; -    data.dx |= (data.mdx << 8); -    data.dx = data.dx * -1; -    data.dy |= (data.mdy << 8); -    data.dy = data.dy * -1; - -    spi_stop(); +    report.isMotion    = (report.motion & 0x80) != 0; +    report.isOnSurface = (report.motion & 0x08) == 0; +    report.dx |= (report.mdx << 8); +    report.dx = report.dx * -1; +    report.dy |= (report.mdy << 8); +    report.dy = report.dy * -1; -    if (data.motion & 0b111) {  // panic recovery, sometimes burst mode works weird. +    if (report.motion & 0b111) {  // panic recovery, sometimes burst mode works weird.          _inBurst = false;      } -    return data; +    return report;  } diff --git a/drivers/sensors/pmw3360.h b/drivers/sensors/pmw3360.h index 9aa8e13f8e..b46fc9056e 100644 --- a/drivers/sensors/pmw3360.h +++ b/drivers/sensors/pmw3360.h @@ -19,8 +19,6 @@  #pragma once  #include <stdint.h> -#include "report.h" -#include "spi_master.h"  #ifndef PMW3360_CPI  #    define PMW3360_CPI 1600 @@ -69,10 +67,6 @@ This should work for the 3390 and 3391 too, in theory.  #    define PMW3360_FIRMWARE_H "pmw3360_firmware.h"  #endif -#ifdef CONSOLE_ENABLE -void print_byte(uint8_t byte); -#endif -  typedef struct {      int8_t  motion;      bool    isMotion;     // True if a motion is detected. @@ -83,16 +77,10 @@ typedef struct {      int8_t  mdy;  } report_pmw3360_t; -bool             spi_start_adv(void); -void             spi_stop_adv(void); -spi_status_t     spi_write_adv(uint8_t reg_addr, uint8_t data); -uint8_t          spi_read_adv(uint8_t reg_addr); -bool             pmw3360_init(void); -void             pmw3360_set_cpi(uint16_t cpi); -uint16_t         pmw3360_get_cpi(void); -void             pmw3360_upload_firmware(void); -bool             pmw3360_check_signature(void); +bool     pmw3360_init(void); +void     pmw3360_upload_firmware(void); +bool     pmw3360_check_signature(void); +uint16_t pmw3360_get_cpi(void); +void     pmw3360_set_cpi(uint16_t cpi); +/* Reads and clears the current delta values on the sensor */  report_pmw3360_t pmw3360_read_burst(void); - -#define degToRad(angleInDegrees) ((angleInDegrees)*M_PI / 180.0) -#define radToDeg(angleInRadians) ((angleInRadians)*180.0 / M_PI) diff --git a/keyboards/40percentclub/ut47/keymaps/default/keymap.c b/keyboards/40percentclub/ut47/keymaps/default/keymap.c index 0fa7838dfd..4eb2c190c1 100644 --- a/keyboards/40percentclub/ut47/keymaps/default/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/default/keymap.c @@ -15,7 +15,7 @@   */  #include QMK_KEYBOARD_H  #ifdef LED_ENABLE -  #include "protocol/serial.h" +  #include "uart.h"  #endif  #define LT3_TAB LT(3, KC_TAB) @@ -108,11 +108,11 @@ LAYOUT( /* Tab */  //LED keymap functions   #ifdef LED_ENABLE  void led_chmode(void) { -  serial_send(101); +  uart_write(0x65);  }  void led_toggle(void) { -  serial_send(100); +  uart_write(0x64);  }  bool process_record_user(uint16_t keycode, keyrecord_t *record) { diff --git a/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c index 0c1c2e7599..8a0ba7b391 100644 --- a/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c @@ -15,7 +15,7 @@   */  #include QMK_KEYBOARD_H  #ifdef LED_ENABLE -  #include "protocol/serial.h" +  #include "uart.h"  #endif  #define LT3_TAB LT(3, KC_TAB) @@ -108,11 +108,11 @@ LAYOUT( /* Tab */  //LED keymap functions   #ifdef LED_ENABLE  void led_chmode(void) { -  serial_send(101); +  uart_write(0x65);  }  void led_toggle(void) { -  serial_send(100); +  uart_write(0x64);  }  bool process_record_user(uint16_t keycode, keyrecord_t *record) { diff --git a/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c index 52372e2857..5e79cdb9a4 100644 --- a/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c @@ -15,7 +15,7 @@   */  #include QMK_KEYBOARD_H  #ifdef LED_ENABLE -  #include "protocol/serial.h" +  #include "uart.h"  #endif @@ -151,11 +151,11 @@ LAYOUT( /* GAMING, toggled on and off - L5 */  //LED keymap functions   #ifdef LED_ENABLE  void led_chmode(void) { -  serial_send(101); +  uart_write(0x65);  }  void led_toggle(void) { -  serial_send(100); +  uart_write(0x64);  }  bool process_record_user(uint16_t keycode, keyrecord_t *record) { diff --git a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c index ae8ad3e378..75dba3a2d4 100644 --- a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c @@ -15,7 +15,7 @@   */  #include QMK_KEYBOARD_H  #ifdef LED_ENABLE -  #include "protocol/serial.h" +  #include "uart.h"  #endif  #define LT3_TAB LT(3, KC_TAB) @@ -60,11 +60,11 @@ LAYOUT( /* Tab */  //LED keymap functions   #ifdef LED_ENABLE  void led_chmode(void) { -  serial_send(101); +  uart_write(0x65);  }  void led_toggle(void) { -  serial_send(100); +  uart_write(0x64);  }  bool process_record_user(uint16_t keycode, keyrecord_t *record) { diff --git a/keyboards/40percentclub/ut47/matrix.c b/keyboards/40percentclub/ut47/matrix.c index e47c7f8e13..89537592c5 100644 --- a/keyboards/40percentclub/ut47/matrix.c +++ b/keyboards/40percentclub/ut47/matrix.c @@ -26,10 +26,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "debug.h"  #include "util.h"  #include "matrix.h" -#ifdef LED_ENABLE -    #include "protocol/serial.h" -#endif -  #ifndef DEBOUNCE  #   define DEBOUNCE	5 @@ -69,10 +65,6 @@ void matrix_init(void)          matrix[i] = 0;          matrix_debouncing[i] = 0;      } -   -#ifdef LED_ENABLE -    serial_init(); -#endif  }  uint8_t matrix_scan(void) @@ -104,12 +96,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/40percentclub/ut47/rules.mk b/keyboards/40percentclub/ut47/rules.mk index 29cee474ff..6c9805e0fc 100644 --- a/keyboards/40percentclub/ut47/rules.mk +++ b/keyboards/40percentclub/ut47/rules.mk @@ -18,4 +18,5 @@ AUDIO_ENABLE = no           # Audio output  # custom matrix setup  CUSTOM_MATRIX = yes -SRC += matrix.c protocol/serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/40percentclub/ut47/ut47.c b/keyboards/40percentclub/ut47/ut47.c index 9054335e5a..864edaeb57 100644 --- a/keyboards/40percentclub/ut47/ut47.c +++ b/keyboards/40percentclub/ut47/ut47.c @@ -15,7 +15,11 @@   */  #include "ut47.h"  #ifdef LED_ENABLE -  #include "protocol/serial.h" +  #include "uart.h" + +void matrix_init_kb() { +  uart_init(9600); +}  #endif  bool process_record_kb(uint16_t keycode, keyrecord_t *record) { @@ -23,7 +27,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {  	// runs for every action, just before processing by the firmware    if (record->event.pressed) {      #ifdef LED_ENABLE -      serial_send((record->event.key.row*16)+record->event.key.col); +      uart_write((record->event.key.row*16)+record->event.key.col);      #endif    }  	return process_record_user(keycode, record); diff --git a/keyboards/ai03/orbit/config.h b/keyboards/ai03/orbit/config.h index 9ad384c8ff..0e4f4c3baf 100644 --- a/keyboards/ai03/orbit/config.h +++ b/keyboards/ai03/orbit/config.h @@ -44,13 +44,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define MATRIX_COL_PINS { C7, B4, D7, D6, D4, F1, F0 }  #define MATRIX_ROW_PINS_RIGHT { B6, B5, B4, D7, E6 }  #define MATRIX_COL_PINS_RIGHT { D4, D6, F1, F0, F4, F5, C6 } - -#define SPLIT_HAND_PIN D5 - -//#define USE_I2C - -#define SELECT_SOFT_SERIAL_SPEED 1 -  #define UNUSED_PINS  /* COL2ROW, ROW2COL */ @@ -60,6 +53,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.   * 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 SELECT_SOFT_SERIAL_SPEED 1 + +#define SPLIT_LED_STATE_ENABLE +#define SPLIT_LAYER_STATE_ENABLE + +#define SPLIT_HAND_PIN D5  #define BACKLIGHT_PIN B7  // #define BACKLIGHT_BREATHING diff --git a/keyboards/ai03/orbit/keymaps/default/keymap.c b/keyboards/ai03/orbit/keymaps/default/keymap.c index fa383d7c00..c9696ccde6 100644 --- a/keyboards/ai03/orbit/keymaps/default/keymap.c +++ b/keyboards/ai03/orbit/keymaps/default/keymap.c @@ -48,25 +48,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {  bool process_record_user(uint16_t keycode, keyrecord_t *record) {  	switch (keycode) {  		case MANUAL: -			if (record->event.pressed)  -			{ -				// Keypress +			if (record->event.pressed) {  				SEND_STRING("https://kb.ai03.me/redir/orbit"); -			}  -			else  -			{ -				// Key release  			}  			break;  		case DBLZERO: -			if (record->event.pressed)  -			{ -				// Keypress +			if (record->event.pressed) {  				SEND_STRING("00"); -			}  -			else  -			{ -				// Key release  			}  			break;    } diff --git a/keyboards/ai03/orbit/matrix.c b/keyboards/ai03/orbit/matrix.c deleted file mode 100644 index b8e3296686..0000000000 --- a/keyboards/ai03/orbit/matrix.c +++ /dev/null @@ -1,328 +0,0 @@ -/* -Copyright 2012 Jun Wako <wakojun@gmail.com> - -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/>. -*/ - -/* - * scan matrix - */ -#include <stdint.h> -#include <stdbool.h> -#include "wait.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "config.h" -#include "split_flags.h" -#include "quantum.h" -#include "debounce.h" -#include "transport.h" - -#if (MATRIX_COLS <= 8) -#  define print_matrix_header() print("\nr/c 01234567\n") -#  define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) -#  define matrix_bitpop(i) bitpop(matrix[i]) -#  define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#  define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") -#  define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) -#  define matrix_bitpop(i) bitpop16(matrix[i]) -#  define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#  define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#  define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) -#  define matrix_bitpop(i) bitpop32(matrix[i]) -#  define ROW_SHIFTER ((uint32_t)1) -#endif - -#define ERROR_DISCONNECT_COUNT 5 - -//#define ROWS_PER_HAND (MATRIX_ROWS / 2) - -#ifdef DIRECT_PINS -static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS; -#else -static pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t raw_matrix[ROWS_PER_HAND]; - -// row offsets for each hand -uint8_t thisHand, thatHand; - -// user-defined overridable functions - -__attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); } - -__attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); } - -__attribute__((weak)) void matrix_init_user(void) {} - -__attribute__((weak)) void matrix_scan_user(void) {} - -__attribute__((weak)) void matrix_slave_scan_user(void) {} - -// helper functions - -inline uint8_t matrix_rows(void) { return MATRIX_ROWS; } - -inline uint8_t matrix_cols(void) { return MATRIX_COLS; } - -bool matrix_is_modified(void) { -  if (debounce_active()) return false; -  return true; -} - -inline bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & ((matrix_row_t)1 << col)); } - -inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } - -void matrix_print(void) { -  print_matrix_header(); - -  for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -    print_hex8(row); -    print(": "); -    print_matrix_row(row); -    print("\n"); -  } -} - -uint8_t matrix_key_count(void) { -  uint8_t count = 0; -  for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -    count += matrix_bitpop(i); -  } -  return count; -} - -// 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 : (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 < ROWS_PER_HAND; 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++) { -    // Populate the matrix row with the state of the col pin -    current_matrix[current_row] |= readPin(col_pins[col_index]) ? 0 : (ROW_SHIFTER << col_index); -  } - -  // Unselect row -  unselect_row(current_row); - -  return (last_row_value != current_matrix[current_row]); -} - -#elif (DIODE_DIRECTION == ROW2COL) - -static void select_col(uint8_t col) { -  setPinOutput(col_pins[col]); -  writePinLow(col_pins[col]); -} - -static void unselect_col(uint8_t col) { setPinInputHigh(col_pins[col]); } - -static void unselect_cols(void) { -  for (uint8_t x = 0; x < MATRIX_COLS; x++) { -    setPinInputHigh(col_pins[x]); -  } -} - -static void init_pins(void) { -  unselect_cols(); -  for (uint8_t x = 0; x < ROWS_PER_HAND; 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 selecton to stabilize -  select_col(current_col); -  wait_us(30); - -  // For each row... -  for (uint8_t row_index = 0; row_index < ROWS_PER_HAND; 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])) { -      // Pin HI, clear col bit -      current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); -    } else { -      // Pin LO, set col bit -      current_matrix[row_index] |= (ROW_SHIFTER << current_col); -    } - -    // Determine if the matrix changed state -    if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) { -      matrix_changed = true; -    } -  } - -  // Unselect col -  unselect_col(current_col); - -  return matrix_changed; -} - -#endif - -void matrix_init(void) { -  debug_enable = true; -  debug_matrix = true; -  debug_mouse  = true; - -  // Set pinout for right half if pinout for that half is defined -  if (!isLeftHand) { -#ifdef MATRIX_ROW_PINS_RIGHT -    const uint8_t row_pins_right[MATRIX_ROWS] = MATRIX_ROW_PINS_RIGHT; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -      row_pins[i] = row_pins_right[i]; -    } -#endif -#ifdef MATRIX_COL_PINS_RIGHT -    const uint8_t col_pins_right[MATRIX_COLS] = MATRIX_COL_PINS_RIGHT; -    for (uint8_t i = 0; i < MATRIX_COLS; i++) { -      col_pins[i] = col_pins_right[i]; -    } -#endif -  } - -  thisHand = isLeftHand ? 0 : (ROWS_PER_HAND); -  thatHand = ROWS_PER_HAND - thisHand; - -  // initialize key pins -  init_pins(); - -  // initialize matrix state: all keys off -  for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -    matrix[i] = 0; -  } - -  debounce_init(ROWS_PER_HAND); - -  matrix_init_quantum(); -} - -uint8_t _matrix_scan(void) { -  bool changed = false; - -#if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW) -  // Set row, read cols -  for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { -    changed |= read_cols_on_row(raw_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(raw_matrix, current_col); -  } -#endif - -  debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed); - -  return 1; -} - -uint8_t matrix_scan(void) { -  uint8_t ret = _matrix_scan(); - -  if (is_keyboard_master()) { -    static uint8_t error_count; - -    if (!transport_master(matrix + thatHand)) { -      error_count++; - -      if (error_count > ERROR_DISCONNECT_COUNT) { -        // reset other half if disconnected -        for (int i = 0; i < ROWS_PER_HAND; ++i) { -          matrix[thatHand + i] = 0; -        } -      } -    } else { -      error_count = 0; -    } - -    matrix_scan_quantum(); -  } else { -    transport_slave(matrix + thisHand); -    matrix_slave_scan_user(); -  } - -  return ret; -} diff --git a/keyboards/ai03/orbit/orbit.c b/keyboards/ai03/orbit/orbit.c index 97553e318a..5097f9cd90 100644 --- a/keyboards/ai03/orbit/orbit.c +++ b/keyboards/ai03/orbit/orbit.c @@ -15,196 +15,124 @@   */  #include "orbit.h"  #include "split_util.h" -#include "transport.h" +void led_init_ports(void) { +    // Initialize indicator LEDs to output +    if (isLeftHand) { +        setPinOutput(C6); +        setPinOutput(B6); +        setPinOutput(B5); +    } else { +        setPinOutput(F6); +        setPinOutput(F7); +        setPinOutput(C7); +    } + +    set_layer_indicators(0); +}  // Call led_toggle to set LEDs easily  // LED IDs: -//  +//  // (LEFT) 0 1 2   |   3 4 5 (RIGHT) - -void led_toggle(int id, bool on) { -	 -	if (isLeftHand) { -		switch(id) { -			case 0: -				// Left hand C6 -				if (on) -					//PORTC |= (1<<6); -					writePinHigh(C6); -				else -					//PORTC &= ~(1<<6); -					writePinLow(C6); -				break; -			case 1: -				// Left hand B6 -				if (on) -					//PORTB |= (1<<6); -					writePinHigh(B6); -				else -					//PORTB &= ~(1<<6); -					writePinLow(B6); -				break; -			case 2: -				// Left hand B5 -				if (on) -					//PORTB |= (1<<5); -					writePinHigh(B5); -				else -					//PORTB &= ~(1<<5); -					writePinLow(B5); -				break; -			default: -				break; -		} -	} else { -		switch(id) { -			case 3: -				// Right hand F6 -				if (on) -					//PORTF |= (1<<6); -					writePinHigh(F6); -				else -					//PORTF &= ~(1<<6); -					writePinLow(F6); -				break; -			case 4: -				// Right hand F7 -				if (on) -					//PORTF |= (1<<7); -					writePinHigh(F7); -				else -					//PORTF &= ~(1<<7); -					writePinLow(F7); -				break; -			case 5: -				// Right hand C7 -				if (on) -					//PORTC |= (1<<7); -					writePinHigh(C7); -				else -					//PORTC &= ~(1<<7); -					writePinLow(C7); -				break; -			default: -				break; -		} -	} +void led_toggle(uint8_t id, bool on) { +    if (isLeftHand) { +        switch (id) { +            case 0: +                // Left hand C6 +                writePin(C6, on); +                break; +            case 1: +                // Left hand B6 +                writePin(B6, on); +                break; +            case 2: +                // Left hand B5 +                writePin(B5, on); +                break; +            default: +                break; +        } +    } else { +        switch (id) { +            case 3: +                // Right hand F6 +                writePin(F6, on); +                break; +            case 4: +                // Right hand F7 +                writePin(F7, on); +                break; +            case 5: +                // Right hand C7 +                writePin(C7, on); +                break; +            default: +                break; +        } +    }  }  // Set all LEDs at once using an array of 6 booleans  // LED IDs: -//  +//  // (LEFT) 0 1 2   |   3 4 5 (RIGHT) -//  +//  // Ex. set_all_leds({ false, false, false, true, true, true }) would turn off left hand, turn on right hand  void set_all_leds(bool leds[6]) { -	for (int i = 0; i < 6; i++) { -		led_toggle(i, leds[i]); -	} +    for (int i = 0; i < 6; i++) { +        led_toggle(i, leds[i]); +    }  }  void set_layer_indicators(uint8_t layer) { -	 -	switch (layer) -	{ -		case 0: -			led_toggle(0, true); -			led_toggle(1, false); -			led_toggle(2, false); -			break; -		case 1: -			led_toggle(0, true); -			led_toggle(1, true); -			led_toggle(2, false); -			break; -		case 2: -			led_toggle(0, true); -			led_toggle(1, true); -			led_toggle(2, true); -			break; -		case 3: -			led_toggle(0, false); -			led_toggle(1, true); -			led_toggle(2, true); -			break; -		case 4: -			led_toggle(0, false); -			led_toggle(1, false); -			led_toggle(2, true); -			break; -		default: -			led_toggle(0, true); -			led_toggle(1, false); -			led_toggle(2, true); -			break; -	} -	 +    switch (layer) { +        case 0: +            led_toggle(0, true); +            led_toggle(1, false); +            led_toggle(2, false); +            break; +        case 1: +            led_toggle(0, true); +            led_toggle(1, true); +            led_toggle(2, false); +            break; +        case 2: +            led_toggle(0, true); +            led_toggle(1, true); +            led_toggle(2, true); +            break; +        case 3: +            led_toggle(0, false); +            led_toggle(1, true); +            led_toggle(2, true); +            break; +        case 4: +            led_toggle(0, false); +            led_toggle(1, false); +            led_toggle(2, true); +            break; +        default: +            led_toggle(0, true); +            led_toggle(1, false); +            led_toggle(2, true); +            break; +    }  } -void matrix_init_kb(void) { -	// put your keyboard start-up code here -	// runs once when the firmware starts up -	 -	// Initialize indicator LEDs to output -	if (isLeftHand) -	{ -		setPinOutput(C6); -		setPinOutput(B6); -		setPinOutput(B5); -		//DDRC |= (1<<6); -		//DDRB |= (1<<6); -		//DDRB |= (1<<5); -	} -	else -	{ -		setPinOutput(F6); -		setPinOutput(F7); -		setPinOutput(C7); -		//DDRF |= (1<<6); -		//DDRF |= (1<<7); -		//DDRC |= (1<<7); -	} - -	set_layer_indicators(0); -	 -	matrix_init_user(); +bool led_update_kb(led_t led_state) { +    bool res = led_update_user(led_state); +    if (res) { +        led_toggle(3, led_state.num_lock); +        led_toggle(4, led_state.caps_lock); +        led_toggle(5, led_state.scroll_lock); +    } +    return res;  } -void led_set_kb(uint8_t usb_led) { -	// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here -	 -	if (is_keyboard_master()) { -	 -		serial_m2s_buffer.nlock_led = IS_LED_ON(usb_led, USB_LED_NUM_LOCK); -		serial_m2s_buffer.clock_led = IS_LED_ON(usb_led, USB_LED_CAPS_LOCK); -		serial_m2s_buffer.slock_led = IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK); - -		led_toggle(3, IS_LED_ON(usb_led, USB_LED_NUM_LOCK)); -		led_toggle(4, IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)); -		led_toggle(5, IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)); -		 -	} - -	led_set_user(usb_led); -} +layer_state_t layer_state_set_kb(layer_state_t state) { +    set_layer_indicators(get_highest_layer(state)); -uint32_t layer_state_set_kb(uint32_t state) { -	 -	if (is_keyboard_master()) -	{ -		serial_m2s_buffer.current_layer = biton32(state); -		 -		// If left half, do the LED toggle thing -		if (isLeftHand) -		{ -			set_layer_indicators(biton32(state)); -		} -		 -	} -	// NOTE: Do not set slave LEDs here. -	// This is not called on slave -	 -	return layer_state_set_user(state); +    return layer_state_set_user(state);  } diff --git a/keyboards/ai03/orbit/orbit.h b/keyboards/ai03/orbit/orbit.h index 39f1ebb0e3..7f3b1aca32 100644 --- a/keyboards/ai03/orbit/orbit.h +++ b/keyboards/ai03/orbit/orbit.h @@ -18,6 +18,8 @@  #include "quantum.h" +#define XXX KC_NO +  /* This a shortcut to help you visually see your layout.   *   * The first section contains all of the arguments representing the physical @@ -26,17 +28,6 @@   * The second converts the arguments into a two-dimensional array which   * represents the switch matrix.   */ -  -#ifdef USE_I2C -#include <stddef.h> -#ifdef __AVR__ -  #include <avr/io.h> -  #include <avr/interrupt.h> -#endif -#endif - -#define XXX KC_NO -  #define LAYOUT( \      L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \      L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ @@ -56,6 +47,6 @@      { R40, R41, R42, R43, R44, R45, XXX } \  } -extern void led_toggle(int id, bool on); +void led_toggle(uint8_t id, bool on);  void set_all_leds(bool leds[6]); -extern void set_layer_indicators(uint8_t layer); +void set_layer_indicators(uint8_t layer); diff --git a/keyboards/ai03/orbit/readme.md b/keyboards/ai03/orbit/readme.md index 58ba2079d5..0c320929b6 100644 --- a/keyboards/ai03/orbit/readme.md +++ b/keyboards/ai03/orbit/readme.md @@ -4,9 +4,9 @@  A split ergonomic keyboard project.   -Keyboard Maintainer: [ai03](https://github.com/ai03-2725)   -Hardware Supported: The [Orbit PCB](https://github.com/ai03-2725/Orbit)   -Hardware Availability: [This repository](https://github.com/ai03-2725/Orbit) has PCB files. Case group buy orders are currently closed.   +* Keyboard Maintainer: [ai03](https://github.com/ai03-2725) +* Hardware Supported: The [Orbit PCB](https://github.com/ai03-2725/Orbit) +* Hardware Availability: [This repository](https://github.com/ai03-2725/Orbit) has PCB files. Case group buy orders are currently closed.  Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/ai03/orbit/rules.mk b/keyboards/ai03/orbit/rules.mk index f98e2382f1..a0f1ab94a9 100644 --- a/keyboards/ai03/orbit/rules.mk +++ b/keyboards/ai03/orbit/rules.mk @@ -16,12 +16,4 @@ NKRO_ENABLE = yes           # Enable N-Key Rollover  BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality  RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow  AUDIO_ENABLE = no           # Audio output -USE_I2C = no                # I2C for split communication -CUSTOM_MATRIX = yes			# For providing custom matrix.c (in this case, override regular matrix.c with split matrix.c) -# SPLIT_KEYBOARD = yes		# Split keyboard flag disabled as manual edits had to be done to the split common files - -SRC += split_util.c \ -	   split_flags.c \ -	   serial.c \ -	   transport.c \ -	   matrix.c +SPLIT_KEYBOARD = yes		# Split keyboard flag disabled as manual edits had to be done to the split common files diff --git a/keyboards/ai03/orbit/serial.c b/keyboards/ai03/orbit/serial.c deleted file mode 100644 index 636dfa0906..0000000000 --- a/keyboards/ai03/orbit/serial.c +++ /dev/null @@ -1,545 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - * - * 2018-10-28 checked - *  avr-gcc 4.9.2 - *  avr-gcc 5.4.0 - *  avr-gcc 7.3.0 - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include <avr/io.h> -#include <avr/interrupt.h> -#include <util/delay.h> -#include <stddef.h> -#include <stdbool.h> -#include "serial.h" - -#ifdef SOFT_SERIAL_PIN - -#ifdef __AVR_ATmega32U4__ -  // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. -  #ifdef USE_AVR_I2C -    #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 -      #error Using ATmega32U4 I2C, so can not use PD0, PD1 -    #endif -  #endif - -  #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 -    #define SERIAL_PIN_DDR   DDRD -    #define SERIAL_PIN_PORT  PORTD -    #define SERIAL_PIN_INPUT PIND -    #if SOFT_SERIAL_PIN == D0 -      #define SERIAL_PIN_MASK _BV(PD0) -      #define EIMSK_BIT       _BV(INT0) -      #define EICRx_BIT       (~(_BV(ISC00) | _BV(ISC01))) -      #define SERIAL_PIN_INTERRUPT INT0_vect -    #elif  SOFT_SERIAL_PIN == D1 -      #define SERIAL_PIN_MASK _BV(PD1) -      #define EIMSK_BIT       _BV(INT1) -      #define EICRx_BIT       (~(_BV(ISC10) | _BV(ISC11))) -      #define SERIAL_PIN_INTERRUPT INT1_vect -    #elif  SOFT_SERIAL_PIN == D2 -      #define SERIAL_PIN_MASK _BV(PD2) -      #define EIMSK_BIT       _BV(INT2) -      #define EICRx_BIT       (~(_BV(ISC20) | _BV(ISC21))) -      #define SERIAL_PIN_INTERRUPT INT2_vect -    #elif  SOFT_SERIAL_PIN == D3 -      #define SERIAL_PIN_MASK _BV(PD3) -      #define EIMSK_BIT       _BV(INT3) -      #define EICRx_BIT       (~(_BV(ISC30) | _BV(ISC31))) -      #define SERIAL_PIN_INTERRUPT INT3_vect -    #endif -  #elif  SOFT_SERIAL_PIN == E6 -    #define SERIAL_PIN_DDR   DDRE -    #define SERIAL_PIN_PORT  PORTE -    #define SERIAL_PIN_INPUT PINE -    #define SERIAL_PIN_MASK  _BV(PE6) -    #define EIMSK_BIT        _BV(INT6) -    #define EICRx_BIT        (~(_BV(ISC60) | _BV(ISC61))) -    #define SERIAL_PIN_INTERRUPT INT6_vect -  #else -  #error invalid SOFT_SERIAL_PIN value -  #endif - -#else - #error serial.c now support ATmega32U4 only -#endif - -#define ALWAYS_INLINE __attribute__((always_inline)) -#define NO_INLINE __attribute__((noinline)) -#define _delay_sub_us(x)    __builtin_avr_delay_cycles(x) - -// parity check -#define ODD_PARITY 1 -#define EVEN_PARITY 0 -#define PARITY EVEN_PARITY - -#ifdef SERIAL_DELAY -  // custom setup in config.h -  // #define TID_SEND_ADJUST 2 -  // #define SERIAL_DELAY 6             // micro sec -  // #define READ_WRITE_START_ADJUST 30 // cycles -  // #define READ_WRITE_WIDTH_ADJUST 8 // cycles -#else -// ============ Standard setups ============ - -#ifndef SELECT_SOFT_SERIAL_SPEED -#define SELECT_SOFT_SERIAL_SPEED 1 -//  0: about 189kbps (Experimental only) -//  1: about 137kbps (default) -//  2: about 75kbps -//  3: about 39kbps -//  4: about 26kbps -//  5: about 20kbps -#endif - -#if __GNUC__ < 6 -  #define TID_SEND_ADJUST 14 -#else -  #define TID_SEND_ADJUST 2 -#endif - -#if SELECT_SOFT_SERIAL_SPEED == 0 -  // Very High speed -  #define SERIAL_DELAY 4             // micro sec -  #if __GNUC__ < 6 -    #define READ_WRITE_START_ADJUST 33 // cycles -    #define READ_WRITE_WIDTH_ADJUST 3 // cycles -  #else -    #define READ_WRITE_START_ADJUST 34 // cycles -    #define READ_WRITE_WIDTH_ADJUST 7 // cycles -  #endif -#elif SELECT_SOFT_SERIAL_SPEED == 1 -  // High speed -  #define SERIAL_DELAY 6             // micro sec -  #if __GNUC__ < 6 -    #define READ_WRITE_START_ADJUST 30 // cycles -    #define READ_WRITE_WIDTH_ADJUST 3 // cycles -  #else -    #define READ_WRITE_START_ADJUST 33 // cycles -    #define READ_WRITE_WIDTH_ADJUST 7 // cycles -  #endif -#elif SELECT_SOFT_SERIAL_SPEED == 2 -  // Middle speed -  #define SERIAL_DELAY 12            // micro sec -  #define READ_WRITE_START_ADJUST 30 // cycles -  #if __GNUC__ < 6 -    #define READ_WRITE_WIDTH_ADJUST 3 // cycles -  #else -    #define READ_WRITE_WIDTH_ADJUST 7 // cycles -  #endif -#elif SELECT_SOFT_SERIAL_SPEED == 3 -  // Low speed -  #define SERIAL_DELAY 24            // micro sec -  #define READ_WRITE_START_ADJUST 30 // cycles -  #if __GNUC__ < 6 -    #define READ_WRITE_WIDTH_ADJUST 3 // cycles -  #else -    #define READ_WRITE_WIDTH_ADJUST 7 // cycles -  #endif -#elif SELECT_SOFT_SERIAL_SPEED == 4 -  // Very Low speed -  #define SERIAL_DELAY 36            // micro sec -  #define READ_WRITE_START_ADJUST 30 // cycles -  #if __GNUC__ < 6 -    #define READ_WRITE_WIDTH_ADJUST 3 // cycles -  #else -    #define READ_WRITE_WIDTH_ADJUST 7 // cycles -  #endif -#elif SELECT_SOFT_SERIAL_SPEED == 5 -  // Ultra Low speed -  #define SERIAL_DELAY 48            // micro sec -  #define READ_WRITE_START_ADJUST 30 // cycles -  #if __GNUC__ < 6 -    #define READ_WRITE_WIDTH_ADJUST 3 // cycles -  #else -    #define READ_WRITE_WIDTH_ADJUST 7 // cycles -  #endif -#else -#error invalid SELECT_SOFT_SERIAL_SPEED value -#endif /* SELECT_SOFT_SERIAL_SPEED */ -#endif /* SERIAL_DELAY */ - -#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) -#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) - -#define SLAVE_INT_WIDTH_US 1 -#ifndef SERIAL_USE_MULTI_TRANSACTION -  #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY -#else -  #define SLAVE_INT_ACK_WIDTH_UNIT 2 -  #define SLAVE_INT_ACK_WIDTH 4 -#endif - -static SSTD_t *Transaction_table = NULL; -static uint8_t Transaction_table_size = 0; - -inline static void serial_delay(void) ALWAYS_INLINE; -inline static -void serial_delay(void) { -  _delay_us(SERIAL_DELAY); -} - -inline static void serial_delay_half1(void) ALWAYS_INLINE; -inline static -void serial_delay_half1(void) { -  _delay_us(SERIAL_DELAY_HALF1); -} - -inline static void serial_delay_half2(void) ALWAYS_INLINE; -inline static -void serial_delay_half2(void) { -  _delay_us(SERIAL_DELAY_HALF2); -} - -inline static void serial_output(void) ALWAYS_INLINE; -inline static -void serial_output(void) { -  SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static void serial_input_with_pullup(void) ALWAYS_INLINE; -inline static -void serial_input_with_pullup(void) { -  SERIAL_PIN_DDR  &= ~SERIAL_PIN_MASK; -  SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; -inline static -uint8_t serial_read_pin(void) { -  return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static void serial_low(void) ALWAYS_INLINE; -inline static -void serial_low(void) { -  SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static void serial_high(void) ALWAYS_INLINE; -inline static -void serial_high(void) { -  SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) -{ -    Transaction_table = sstd_table; -    Transaction_table_size = (uint8_t)sstd_table_size; -    serial_output(); -    serial_high(); -} - -void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) -{ -    Transaction_table = sstd_table; -    Transaction_table_size = (uint8_t)sstd_table_size; -    serial_input_with_pullup(); - -    // Enable INT0-INT3,INT6 -    EIMSK |= EIMSK_BIT; -#if SERIAL_PIN_MASK == _BV(PE6) -    // Trigger on falling edge of INT6 -    EICRB &= EICRx_BIT; -#else -    // Trigger on falling edge of INT0-INT3 -    EICRA &= EICRx_BIT; -#endif -} - -// Used by the sender to synchronize timing with the reciver. -static void sync_recv(void) NO_INLINE; -static -void sync_recv(void) { -  for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { -  } -  // This shouldn't hang if the target disconnects because the -  // serial line will float to high if the target does disconnect. -  while (!serial_read_pin()); -} - -// Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void) NO_INLINE; -static -void sync_send(void) { -  serial_low(); -  serial_delay(); -  serial_high(); -} - -// Reads a byte from the serial line -static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE; -static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { -    uint8_t byte, i, p, pb; - -  _delay_sub_us(READ_WRITE_START_ADJUST); -  for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { -      serial_delay_half1();   // read the middle of pulses -      if( serial_read_pin() ) { -          byte = (byte << 1) | 1; p ^= 1; -      } else { -          byte = (byte << 1) | 0; p ^= 0; -      } -      _delay_sub_us(READ_WRITE_WIDTH_ADJUST); -      serial_delay_half2(); -  } -  /* recive parity bit */ -  serial_delay_half1();   // read the middle of pulses -  pb = serial_read_pin(); -  _delay_sub_us(READ_WRITE_WIDTH_ADJUST); -  serial_delay_half2(); - -  *pterrcount += (p != pb)? 1 : 0; - -  return byte; -} - -// Sends a byte with MSB ordering -void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; -void serial_write_chunk(uint8_t data, uint8_t bit) { -    uint8_t b, p; -    for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { -        if(data & b) { -            serial_high(); p ^= 1; -        } else { -            serial_low();  p ^= 0; -        } -        serial_delay(); -    } -    /* send parity bit */ -    if(p & 1) { serial_high(); } -    else      { serial_low(); } -    serial_delay(); - -    serial_low(); // sync_send() / senc_recv() need raise edge -} - -static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; -static -void serial_send_packet(uint8_t *buffer, uint8_t size) { -  for (uint8_t i = 0; i < size; ++i) { -    uint8_t data; -    data = buffer[i]; -    sync_send(); -    serial_write_chunk(data,8); -  } -} - -static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE; -static -uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) { -  uint8_t pecount = 0; -  for (uint8_t i = 0; i < size; ++i) { -    uint8_t data; -    sync_recv(); -    data = serial_read_chunk(&pecount, 8); -    buffer[i] = data; -  } -  return pecount == 0; -} - -inline static -void change_sender2reciver(void) { -    sync_send();          //0 -    serial_delay_half1(); //1 -    serial_low();         //2 -    serial_input_with_pullup(); //2 -    serial_delay_half1(); //3 -} - -inline static -void change_reciver2sender(void) { -    sync_recv();     //0 -    serial_delay();  //1 -    serial_low();    //3 -    serial_output(); //3 -    serial_delay_half1(); //4 -} - -static inline uint8_t nibble_bits_count(uint8_t bits) -{ -    bits = (bits & 0x5) + (bits >> 1 & 0x5); -    bits = (bits & 0x3) + (bits >> 2 & 0x3); -    return bits; -} - -// interrupt handle to be used by the target device -ISR(SERIAL_PIN_INTERRUPT) { - -#ifndef SERIAL_USE_MULTI_TRANSACTION -  serial_low(); -  serial_output(); -  SSTD_t *trans = Transaction_table; -#else -  // recive transaction table index -  uint8_t tid, bits; -  uint8_t pecount = 0; -  sync_recv(); -  bits = serial_read_chunk(&pecount,7); -  tid = bits>>3; -  bits = (bits&7) != nibble_bits_count(tid); -  if( bits || pecount> 0 || tid > Transaction_table_size ) { -      return; -  } -  serial_delay_half1(); - -  serial_high(); // response step1 low->high -  serial_output(); -  _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH); -  SSTD_t *trans = &Transaction_table[tid]; -  serial_low(); // response step2 ack high->low -#endif - -  // target send phase -  if( trans->target2initiator_buffer_size > 0 ) -      serial_send_packet((uint8_t *)trans->target2initiator_buffer, -                         trans->target2initiator_buffer_size); -  // target switch to input -  change_sender2reciver(); - -  // target recive phase -  if( trans->initiator2target_buffer_size > 0 ) { -      if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, -                               trans->initiator2target_buffer_size) ) { -          *trans->status = TRANSACTION_ACCEPTED; -      } else { -          *trans->status = TRANSACTION_DATA_ERROR; -      } -  } else { -      *trans->status = TRANSACTION_ACCEPTED; -  } - -  sync_recv(); //weit initiator output to high -} - -///////// -//  start transaction by initiator -// -// int  soft_serial_transaction(int sstd_index) -// -// Returns: -//    TRANSACTION_END -//    TRANSACTION_NO_RESPONSE -//    TRANSACTION_DATA_ERROR -// this code is very time dependent, so we need to disable interrupts -#ifndef SERIAL_USE_MULTI_TRANSACTION -int  soft_serial_transaction(void) { -  SSTD_t *trans = Transaction_table; -#else -int  soft_serial_transaction(int sstd_index) { -  if( sstd_index > Transaction_table_size ) -      return TRANSACTION_TYPE_ERROR; -  SSTD_t *trans = &Transaction_table[sstd_index]; -#endif -  cli(); - -  // signal to the target that we want to start a transaction -  serial_output(); -  serial_low(); -  _delay_us(SLAVE_INT_WIDTH_US); - -#ifndef SERIAL_USE_MULTI_TRANSACTION -  // wait for the target response -  serial_input_with_pullup(); -  _delay_us(SLAVE_INT_RESPONSE_TIME); - -  // check if the target is present -  if (serial_read_pin()) { -    // target failed to pull the line low, assume not present -    serial_output(); -    serial_high(); -    *trans->status = TRANSACTION_NO_RESPONSE; -    sei(); -    return TRANSACTION_NO_RESPONSE; -  } - -#else -  // send transaction table index -  int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); -  sync_send(); -  _delay_sub_us(TID_SEND_ADJUST); -  serial_write_chunk(tid, 7); -  serial_delay_half1(); - -  // wait for the target response (step1 low->high) -  serial_input_with_pullup(); -  while( !serial_read_pin() ) { -      _delay_sub_us(2); -  } - -  // check if the target is present (step2 high->low) -  for( int i = 0; serial_read_pin(); i++ ) { -      if (i > SLAVE_INT_ACK_WIDTH + 1) { -          // slave failed to pull the line low, assume not present -          serial_output(); -          serial_high(); -          *trans->status = TRANSACTION_NO_RESPONSE; -          sei(); -          return TRANSACTION_NO_RESPONSE; -      } -      _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); -  } -#endif - -  // initiator recive phase -  // if the target is present syncronize with it -  if( trans->target2initiator_buffer_size > 0 ) { -      if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, -                                trans->target2initiator_buffer_size) ) { -          serial_output(); -          serial_high(); -          *trans->status = TRANSACTION_DATA_ERROR; -          sei(); -          return TRANSACTION_DATA_ERROR; -      } -   } - -  // initiator switch to output -  change_reciver2sender(); - -  // initiator send phase -  if( trans->initiator2target_buffer_size > 0 ) { -      serial_send_packet((uint8_t *)trans->initiator2target_buffer, -                         trans->initiator2target_buffer_size); -  } - -  // always, release the line when not in use -  sync_send(); - -  *trans->status = TRANSACTION_END; -  sei(); -  return TRANSACTION_END; -} - -#ifdef SERIAL_USE_MULTI_TRANSACTION -int soft_serial_get_and_clean_status(int sstd_index) { -    SSTD_t *trans = &Transaction_table[sstd_index]; -    cli(); -    int retval = *trans->status; -    *trans->status = 0;; -    sei(); -    return retval; -} -#endif - -#endif - -// Helix serial.c history -//   2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) -//   2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) -//             (adjusted with avr-gcc 4.9.2) -//   2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) -//             (adjusted with avr-gcc 4.9.2) -//   2018-8-11 add support multi-type transaction (#3608, feb5e4aae) -//             (adjusted with avr-gcc 4.9.2) -//   2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) -//             (adjusted with avr-gcc 7.3.0) -//   2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) -//             (adjusted with avr-gcc 5.4.0, 7.3.0) -//   2018-12-17 copy to TOP/quantum/split_common/ and remove backward compatibility code (#4669) diff --git a/keyboards/ai03/orbit/serial.h b/keyboards/ai03/orbit/serial.h deleted file mode 100644 index 1c1e640069..0000000000 --- a/keyboards/ai03/orbit/serial.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once - -#include <stdbool.h> - -// ///////////////////////////////////////////////////////////////// -// Need Soft Serial defines in config.h -// ///////////////////////////////////////////////////////////////// -// ex. -//  #define SOFT_SERIAL_PIN ??   // ?? = D0,D1,D2,D3,E6 -//  OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 -//                                               //  1: about 137kbps (default) -//                                               //  2: about 75kbps -//                                               //  3: about 39kbps -//                                               //  4: about 26kbps -//                                               //  5: about 20kbps -// -// //// USE simple API (using signle-type transaction function) -//   /* nothing */ -// //// USE flexible API (using multi-type transaction function) -//   #define SERIAL_USE_MULTI_TRANSACTION -// -// ///////////////////////////////////////////////////////////////// - -// Soft Serial Transaction Descriptor -typedef struct _SSTD_t  { -    uint8_t *status; -    uint8_t initiator2target_buffer_size; -    uint8_t *initiator2target_buffer; -    uint8_t target2initiator_buffer_size; -    uint8_t *target2initiator_buffer; -} SSTD_t; -#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) - -// initiator is transaction start side -void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); -// target is interrupt accept side -void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); - -// initiator resullt -#define TRANSACTION_END 0 -#define TRANSACTION_NO_RESPONSE 0x1 -#define TRANSACTION_DATA_ERROR  0x2 -#define TRANSACTION_TYPE_ERROR  0x4 -#ifndef SERIAL_USE_MULTI_TRANSACTION -int  soft_serial_transaction(void); -#else -int  soft_serial_transaction(int sstd_index); -#endif - -// target status -// *SSTD_t.status has -//   initiator: -//       TRANSACTION_END -//    or TRANSACTION_NO_RESPONSE -//    or TRANSACTION_DATA_ERROR -//   target: -//       TRANSACTION_DATA_ERROR -//    or TRANSACTION_ACCEPTED -#define TRANSACTION_ACCEPTED 0x8 -#ifdef SERIAL_USE_MULTI_TRANSACTION -int  soft_serial_get_and_clean_status(int sstd_index); -#endif diff --git a/keyboards/ai03/orbit/split_flags.c b/keyboards/ai03/orbit/split_flags.c deleted file mode 100644 index 1f5825d650..0000000000 --- a/keyboards/ai03/orbit/split_flags.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "split_flags.h" - -volatile bool RGB_DIRTY = false; - -volatile bool BACKLIT_DIRTY = false;
\ No newline at end of file diff --git a/keyboards/ai03/orbit/split_flags.h b/keyboards/ai03/orbit/split_flags.h deleted file mode 100644 index aaac474a7d..0000000000 --- a/keyboards/ai03/orbit/split_flags.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include <stdbool.h> -#include <stdint.h> - -/** -* Global Flags -**/ - -//RGB Stuff -extern volatile bool RGB_DIRTY; - - -//Backlight Stuff -extern volatile bool BACKLIT_DIRTY; diff --git a/keyboards/ai03/orbit/split_util.c b/keyboards/ai03/orbit/split_util.c deleted file mode 100644 index 2352e5a111..0000000000 --- a/keyboards/ai03/orbit/split_util.c +++ /dev/null @@ -1,87 +0,0 @@ -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "config.h" -#include "timer.h" -#include "split_flags.h" -#include "transport.h" -#include "quantum.h" - -#ifdef EE_HANDS -#   include "eeprom.h" -#   include "eeconfig.h" -#endif - -volatile bool isLeftHand = true; - -__attribute__((weak)) -bool is_keyboard_left(void) { -  #ifdef SPLIT_HAND_PIN -    // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand -    setPinInput(SPLIT_HAND_PIN); -    return readPin(SPLIT_HAND_PIN); -  #else -    #ifdef EE_HANDS -      return eeprom_read_byte(EECONFIG_HANDEDNESS); -    #else -      #ifdef MASTER_RIGHT -        return !is_keyboard_master(); -      #else -        return is_keyboard_master(); -      #endif -    #endif -  #endif -} - -bool is_keyboard_master(void) -{ -#ifdef __AVR__ -  static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN; - -  // only check once, as this is called often -  if (usbstate == UNKNOWN) -  { -    USBCON |= (1 << OTGPADE);  // enables VBUS pad -    wait_us(5); - -    usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE;  // checks state of VBUS -  } - -  return (usbstate == MASTER); -#else -  return true; -#endif -} - -static void keyboard_master_setup(void) { -#if defined(USE_I2C) -  #ifdef SSD1306OLED -    matrix_master_OLED_init (); -  #endif -#endif -  transport_master_init(); - -  // For master the Backlight info needs to be sent on startup -  // Otherwise the salve won't start with the proper info until an update -  BACKLIT_DIRTY = true; -} - -static void keyboard_slave_setup(void) -{ -  transport_slave_init(); -} - -// this code runs before the usb and keyboard is initialized -void matrix_setup(void) -{ -  isLeftHand = is_keyboard_left(); - -  if (is_keyboard_master()) -  { -    keyboard_master_setup(); -  } -  else -  { -    keyboard_slave_setup(); -  } -} diff --git a/keyboards/ai03/orbit/split_util.h b/keyboards/ai03/orbit/split_util.h deleted file mode 100644 index 20f7535bf4..0000000000 --- a/keyboards/ai03/orbit/split_util.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> - -extern volatile bool isLeftHand; - -void matrix_master_OLED_init (void); diff --git a/keyboards/ai03/orbit/transport.c b/keyboards/ai03/orbit/transport.c deleted file mode 100644 index 447fafed14..0000000000 --- a/keyboards/ai03/orbit/transport.c +++ /dev/null @@ -1,238 +0,0 @@ - -#include "transport.h" - -#include "config.h" -#include "matrix.h" -#include "quantum.h" - -#include "orbit.h" - -#define ROWS_PER_HAND (MATRIX_ROWS/2) - -#ifdef RGBLIGHT_ENABLE -#   include "rgblight.h" -#endif - -#ifdef BACKLIGHT_ENABLE -# include "backlight.h" -  extern backlight_config_t backlight_config; -#endif - -#if defined(USE_I2C) - -#include "i2c.h" - -#ifndef SLAVE_I2C_ADDRESS -#  define SLAVE_I2C_ADDRESS           0x32 -#endif - -#if (MATRIX_COLS > 8) -#  error "Currently only supports 8 COLS" -#endif - -// Get rows from other half over i2c -bool transport_master(matrix_row_t matrix[]) { -  int err = 0; - -  // write backlight info -#ifdef BACKLIGHT_ENABLE -  if (BACKLIT_DIRTY) { -    err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); -    if (err) { goto i2c_error; } - -    // Backlight location -    err = i2c_master_write(I2C_BACKLIT_START); -    if (err) { goto i2c_error; } - -    // Write backlight -    i2c_master_write(get_backlight_level()); - -    BACKLIT_DIRTY = false; -  } -#endif - -  err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); -  if (err) { goto i2c_error; } - -  // start of matrix stored at I2C_KEYMAP_START -  err = i2c_master_write(I2C_KEYMAP_START); -  if (err) { goto i2c_error; } - -  // Start read -  err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); -  if (err) { goto i2c_error; } - -  if (!err) { -    int i; -    for (i = 0; i < ROWS_PER_HAND-1; ++i) { -      matrix[i] = i2c_master_read(I2C_ACK); -    } -    matrix[i] = i2c_master_read(I2C_NACK); -    i2c_master_stop(); -  } else { -i2c_error: // the cable is disconnceted, or something else went wrong -    i2c_reset_state(); -    return false; -  } - -#ifdef RGBLIGHT_ENABLE -  if (RGB_DIRTY) { -    err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); -    if (err) { goto i2c_error; } - -    // RGB Location -    err = i2c_master_write(I2C_RGB_START); -    if (err) { goto i2c_error; } - -    uint32_t dword = eeconfig_read_rgblight(); - -    // Write RGB -    err = i2c_master_write_data(&dword, 4); -    if (err) { goto i2c_error; } - -    RGB_DIRTY = false; -    i2c_master_stop(); -  } -#endif - -  return true; -} - -void transport_slave(matrix_row_t matrix[]) { - -  for (int i = 0; i < ROWS_PER_HAND; ++i) -  { -    i2c_slave_buffer[I2C_KEYMAP_START + i] = matrix[i]; -  } -  // Read Backlight Info -  #ifdef BACKLIGHT_ENABLE -  if (BACKLIT_DIRTY) -  { -    backlight_set(i2c_slave_buffer[I2C_BACKLIT_START]); -    BACKLIT_DIRTY = false; -  } -  #endif -  #ifdef RGBLIGHT_ENABLE -  if (RGB_DIRTY) -  { -    // Disable interupts (RGB data is big) -    cli(); -    // Create new DWORD for RGB data -    uint32_t dword; - -    // Fill the new DWORD with the data that was sent over -    uint8_t * dword_dat = (uint8_t *)(&dword); -    for (int i = 0; i < 4; i++) -    { -      dword_dat[i] = i2c_slave_buffer[I2C_RGB_START + i]; -    } - -    // Update the RGB now with the new data and set RGB_DIRTY to false -    rgblight_update_dword(dword); -    RGB_DIRTY = false; -    // Re-enable interupts now that RGB is set -    sei(); -  } -  #endif -} - -void transport_master_init(void) { -  i2c_master_init(); -} - -void transport_slave_init(void) { -  i2c_slave_init(SLAVE_I2C_ADDRESS); -} - -#else // USE_SERIAL - -#include "serial.h" - - - -volatile Serial_s2m_buffer_t serial_s2m_buffer = {}; -volatile Serial_m2s_buffer_t serial_m2s_buffer = {}; -uint8_t volatile status0 = 0; - -SSTD_t transactions[] = { -  { (uint8_t *)&status0, -    sizeof(serial_m2s_buffer), (uint8_t *)&serial_m2s_buffer, -    sizeof(serial_s2m_buffer), (uint8_t *)&serial_s2m_buffer -  } -}; - -uint8_t slave_layer_cache; -uint8_t slave_nlock_cache; -uint8_t slave_clock_cache; -uint8_t slave_slock_cache; - -void transport_master_init(void) -{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } - -void transport_slave_init(void) -{  -	soft_serial_target_init(transactions, TID_LIMIT(transactions));  -	slave_layer_cache = 255; -	slave_nlock_cache = 255; -	slave_clock_cache = 255; -	slave_slock_cache = 255; -} - -bool transport_master(matrix_row_t matrix[]) { - -  if (soft_serial_transaction()) { -    return false; -  } - -  // TODO:  if MATRIX_COLS > 8 change to unpack() -  for (int i = 0; i < ROWS_PER_HAND; ++i) { -    matrix[i] = serial_s2m_buffer.smatrix[i]; -  } - -  #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) -    // Code to send RGB over serial goes here (not implemented yet) -  #endif - -  #ifdef BACKLIGHT_ENABLE -    // Write backlight level for slave to read -    serial_m2s_buffer.backlight_level = backlight_config.enable ? backlight_config.level : 0; -  #endif - -  return true; -} - -void transport_slave(matrix_row_t matrix[]) { - -  // TODO: if MATRIX_COLS > 8 change to pack() -  for (int i = 0; i < ROWS_PER_HAND; ++i) -  { -    serial_s2m_buffer.smatrix[i] = matrix[i]; -  } -  #ifdef BACKLIGHT_ENABLE -    backlight_set(serial_m2s_buffer.backlight_level); -  #endif -  #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) -  // Add serial implementation for RGB here -  #endif -   -  if (slave_layer_cache != serial_m2s_buffer.current_layer) {   -	slave_layer_cache = serial_m2s_buffer.current_layer; -	set_layer_indicators(slave_layer_cache); -  } -   -  if (slave_nlock_cache != serial_m2s_buffer.nlock_led) { -	slave_nlock_cache = serial_m2s_buffer.nlock_led; -	led_toggle(3, slave_nlock_cache); -  } -  if (slave_clock_cache != serial_m2s_buffer.clock_led) { -	slave_clock_cache = serial_m2s_buffer.clock_led; -	led_toggle(4, slave_clock_cache); -  } -  if (slave_slock_cache != serial_m2s_buffer.slock_led) { -	slave_slock_cache = serial_m2s_buffer.slock_led; -	led_toggle(5, slave_slock_cache); -  } -   -} - -#endif diff --git a/keyboards/ai03/orbit/transport.h b/keyboards/ai03/orbit/transport.h deleted file mode 100644 index 757eae6f5c..0000000000 --- a/keyboards/ai03/orbit/transport.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "matrix.h" - -#define ROWS_PER_HAND (MATRIX_ROWS/2) - -typedef struct _Serial_s2m_buffer_t { -  // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack -  matrix_row_t smatrix[ROWS_PER_HAND]; -} Serial_s2m_buffer_t; - -typedef struct _Serial_m2s_buffer_t { -#ifdef BACKLIGHT_ENABLE -    uint8_t backlight_level; -#endif -#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) -    rgblight_config_t rgblight_config; //not yet use -    // -    // When MCUs on both sides drive their respective RGB LED chains, -    // it is necessary to synchronize, so it is necessary to communicate RGB information. -    // In that case, define the RGBLIGHT_SPLIT macro. -    // -    // Otherwise, if the master side MCU drives both sides RGB LED chains, -    // there is no need to communicate. -#endif - -	uint8_t current_layer; -	uint8_t nlock_led; -	uint8_t clock_led; -	uint8_t slock_led; - -} Serial_m2s_buffer_t; - -extern volatile Serial_s2m_buffer_t serial_s2m_buffer; -extern volatile Serial_m2s_buffer_t serial_m2s_buffer; - -void transport_master_init(void); -void transport_slave_init(void); - -// returns false if valid data not received from slave -bool transport_master(matrix_row_t matrix[]); -void transport_slave(matrix_row_t matrix[]); diff --git a/keyboards/amj96/matrix.c b/keyboards/amj96/matrix.c index 8e7bbaa791..ffd66d120f 100644 --- a/keyboards/amj96/matrix.c +++ b/keyboards/amj96/matrix.c @@ -108,12 +108,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/angel64/alpha/matrix.c b/keyboards/angel64/alpha/matrix.c index 474fbec030..2851859cf2 100644 --- a/keyboards/angel64/alpha/matrix.c +++ b/keyboards/angel64/alpha/matrix.c @@ -90,13 +90,6 @@ uint8_t matrix_cols(void) {      return MATRIX_COLS;  } -//Deprecated. -bool matrix_is_modified(void) -{ -    if (debounce_active()) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/angel64/rev1/matrix.c b/keyboards/angel64/rev1/matrix.c index 474fbec030..2851859cf2 100644 --- a/keyboards/angel64/rev1/matrix.c +++ b/keyboards/angel64/rev1/matrix.c @@ -90,13 +90,6 @@ uint8_t matrix_cols(void) {      return MATRIX_COLS;  } -//Deprecated. -bool matrix_is_modified(void) -{ -    if (debounce_active()) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/bpiphany/kitten_paw/matrix.c b/keyboards/bpiphany/kitten_paw/matrix.c index b59089cdf4..56114858f1 100644 --- a/keyboards/bpiphany/kitten_paw/matrix.c +++ b/keyboards/bpiphany/kitten_paw/matrix.c @@ -117,13 +117,6 @@ uint8_t matrix_scan(void) {    return 1;  } -bool matrix_is_modified(void) { -  if (debouncing) -    return false; -  else -    return true; -} -  inline bool matrix_is_on(uint8_t row, uint8_t col) {    return (matrix[row] & ((matrix_row_t)1<<col));  } diff --git a/keyboards/bpiphany/pegasushoof/2013/matrix.c b/keyboards/bpiphany/pegasushoof/2013/matrix.c index 037f323c00..09244982d9 100644 --- a/keyboards/bpiphany/pegasushoof/2013/matrix.c +++ b/keyboards/bpiphany/pegasushoof/2013/matrix.c @@ -110,13 +110,6 @@ uint8_t matrix_scan(void)  	return 1;  } -bool matrix_is_modified(void) -{ -	if (debouncing) -		return false; -	return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/centromere/config.h b/keyboards/centromere/config.h index e502e2534b..b4cae20332 100644 --- a/keyboards/centromere/config.h +++ b/keyboards/centromere/config.h @@ -56,12 +56,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 500000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/centromere/matrix.c b/keyboards/centromere/matrix.c index 7256cd5cb5..bbd771f41b 100644 --- a/keyboards/centromere/matrix.c +++ b/keyboards/centromere/matrix.c @@ -15,80 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} -void matrix_init(void) { +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(500000);  } -uint8_t matrix_scan(void) -{ +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF remote slave to send the matrix information -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates, erase the last set of data      uint8_t uart_data[11] = {0}; @@ -96,58 +37,27 @@ uint8_t matrix_scan(void)      //there are 10 bytes corresponding to 1w columns, and an end byte      for (uint8_t i = 0; i < 11; i++) {          //wait for the serial data, timeout if it's been too long -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } - -    matrix_scan_quantum(); -    return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/centromere/rules.mk b/keyboards/centromere/rules.mk index ed777e1b9e..113e1e6aff 100644 --- a/keyboards/centromere/rules.mk +++ b/keyboards/centromere/rules.mk @@ -11,16 +11,19 @@ BOOTLOADER = caterina  #   change yes to no to disable  #  BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = yes	# Mouse keys -EXTRAKEY_ENABLE = yes	# Audio control and System control -CONSOLE_ENABLE = yes	# Console for debug -COMMAND_ENABLE = yes   # Commands for debug and configuration -CUSTOM_MATRIX = yes    # Remote matrix from the wireless bridge -NKRO_ENABLE = yes           # Enable N-Key Rollover -BACKLIGHT_ENABLE = no  # Enable keyboard backlight functionality -UNICODE_ENABLE = yes 		# Unicode +MOUSEKEY_ENABLE = yes       # 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 +UNICODE_ENABLE = yes +CUSTOM_MATRIX = lite -# # project specific files -SRC += matrix.c serial_uart.c +# project specific files +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c  LAYOUTS = split_3x5_3 split_3x6_3 diff --git a/keyboards/chimera_ergo/config.h b/keyboards/chimera_ergo/config.h index 0767a218b5..3c0cc5c162 100644 --- a/keyboards/chimera_ergo/config.h +++ b/keyboards/chimera_ergo/config.h @@ -56,12 +56,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/chimera_ergo/matrix.c b/keyboards/chimera_ergo/matrix.c index 577176c466..603ad0f386 100644 --- a/keyboards/chimera_ergo/matrix.c +++ b/keyboards/chimera_ergo/matrix.c @@ -15,89 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - -__attribute__ ((weak)) -void matrix_init_quantum(void) { -    matrix_init_kb(); -} - -__attribute__ ((weak)) -void matrix_scan_quantum(void) { -    matrix_scan_kb(); -} - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} - -void matrix_init(void) { +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[14] = {0}; @@ -107,58 +39,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 6; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 6; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } - -    matrix_scan_quantum(); -    return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/chimera_ergo/rules.mk b/keyboards/chimera_ergo/rules.mk index a8bd3a027a..8cb1736147 100644 --- a/keyboards/chimera_ergo/rules.mk +++ b/keyboards/chimera_ergo/rules.mk @@ -8,13 +8,16 @@ BOOTLOADER = caterina  #   change yes to no to disable  #  BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = yes	# Mouse keys -EXTRAKEY_ENABLE = yes	# Audio control and System control -CONSOLE_ENABLE = yes	# Console for debug -COMMAND_ENABLE = yes   # Commands for debug and configuration -CUSTOM_MATRIX = yes    # Remote matrix from the wireless bridge +MOUSEKEY_ENABLE = yes       # 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 = yes           # Enable N-Key Rollover -# BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow +AUDIO_ENABLE = no           # Audio output +CUSTOM_MATRIX = lite -# # project specific files -SRC += matrix.c serial_uart.c +# project specific files +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/chimera_ls/config.h b/keyboards/chimera_ls/config.h index 2eb028471d..ca92e1e2e4 100644 --- a/keyboards/chimera_ls/config.h +++ b/keyboards/chimera_ls/config.h @@ -56,12 +56,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/chimera_ls/matrix.c b/keyboards/chimera_ls/matrix.c index 9edd91818f..a92c3e8431 100644 --- a/keyboards/chimera_ls/matrix.c +++ b/keyboards/chimera_ls/matrix.c @@ -15,93 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#elif (MATRIX_COLS <= 64) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse64(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop64(matrix[i]) -#    define ROW_SHIFTER  ((uint64_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - -__attribute__ ((weak)) -void matrix_init_quantum(void) { -    matrix_init_kb(); -} - -__attribute__ ((weak)) -void matrix_scan_quantum(void) { -    matrix_scan_kb(); -} - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -void matrix_init(void) { -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[11] = {0}; @@ -111,58 +39,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } - -    matrix_scan_quantum(); -    return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/chimera_ls/rules.mk b/keyboards/chimera_ls/rules.mk index 377c379911..b7f6db5aa5 100644 --- a/keyboards/chimera_ls/rules.mk +++ b/keyboards/chimera_ls/rules.mk @@ -8,16 +8,19 @@ BOOTLOADER = caterina  #   change yes to no to disable  #  BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = yes	# Mouse keys -EXTRAKEY_ENABLE = yes	# Audio control and System control -CONSOLE_ENABLE = yes	# Console for debug -COMMAND_ENABLE = yes   # Commands for debug and configuration -CUSTOM_MATRIX = yes    # Remote matrix from the wireless bridge +MOUSEKEY_ENABLE = yes       # 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 = yes           # Enable N-Key Rollover -# BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow +AUDIO_ENABLE = no           # Audio output +CUSTOM_MATRIX = lite  # project specific files -SRC += matrix.c serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c  LAYOUTS = ortho_4x12 diff --git a/keyboards/chimera_ortho/config.h b/keyboards/chimera_ortho/config.h index 974502525c..3d86343a67 100644 --- a/keyboards/chimera_ortho/config.h +++ b/keyboards/chimera_ortho/config.h @@ -56,12 +56,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/chimera_ortho/matrix.c b/keyboards/chimera_ortho/matrix.c index 34930af7e2..a92c3e8431 100644 --- a/keyboards/chimera_ortho/matrix.c +++ b/keyboards/chimera_ortho/matrix.c @@ -15,79 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} -void matrix_init(void) { +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[11] = {0}; @@ -97,58 +39,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } - -    matrix_scan_quantum(); -    return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/chimera_ortho/rules.mk b/keyboards/chimera_ortho/rules.mk index fbe6872001..8cb1736147 100644 --- a/keyboards/chimera_ortho/rules.mk +++ b/keyboards/chimera_ortho/rules.mk @@ -8,13 +8,16 @@ BOOTLOADER = caterina  #   change yes to no to disable  #  BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = yes	# Mouse keys -EXTRAKEY_ENABLE = yes	# Audio control and System control -CONSOLE_ENABLE = yes	# Console for debug -COMMAND_ENABLE = yes   # Commands for debug and configuration -CUSTOM_MATRIX = yes    # Remote matrix from the wireless bridge +MOUSEKEY_ENABLE = yes       # 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 = yes           # Enable N-Key Rollover -# BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow +AUDIO_ENABLE = no           # Audio output +CUSTOM_MATRIX = lite  # project specific files -SRC += matrix.c serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/chimera_ortho_plus/config.h b/keyboards/chimera_ortho_plus/config.h index 4b12796e95..ebffb85657 100644 --- a/keyboards/chimera_ortho_plus/config.h +++ b/keyboards/chimera_ortho_plus/config.h @@ -56,12 +56,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/chimera_ortho_plus/matrix.c b/keyboards/chimera_ortho_plus/matrix.c index 818e05ac98..603ad0f386 100644 --- a/keyboards/chimera_ortho_plus/matrix.c +++ b/keyboards/chimera_ortho_plus/matrix.c @@ -15,79 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} -void matrix_init(void) { +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[14] = {0}; @@ -97,58 +39,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 6; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 6; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } - -    matrix_scan_quantum(); -    return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/chimera_ortho_plus/rules.mk b/keyboards/chimera_ortho_plus/rules.mk index e99e79c327..0a8a31e7dd 100644 --- a/keyboards/chimera_ortho_plus/rules.mk +++ b/keyboards/chimera_ortho_plus/rules.mk @@ -17,7 +17,8 @@ BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality  RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow  AUDIO_ENABLE = no           # Audio output  UNICODE_ENABLE = yes -CUSTOM_MATRIX = yes +CUSTOM_MATRIX = lite  # project specific files -SRC += matrix.c serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/comet46/config.h b/keyboards/comet46/config.h index 067dabb103..5ea40c14c5 100644 --- a/keyboards/comet46/config.h +++ b/keyboards/comet46/config.h @@ -62,12 +62,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define MODS_CTRL_MASK  (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL))  #define MODS_ALT_MASK  (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))  #define MODS_GUI_MASK  (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)) - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/comet46/matrix.c b/keyboards/comet46/matrix.c index 34930af7e2..a92c3e8431 100644 --- a/keyboards/comet46/matrix.c +++ b/keyboards/comet46/matrix.c @@ -15,79 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} -void matrix_init(void) { +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[11] = {0}; @@ -97,58 +39,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } - -    matrix_scan_quantum(); -    return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/comet46/rules.mk b/keyboards/comet46/rules.mk index 814622226a..e177fc6441 100644 --- a/keyboards/comet46/rules.mk +++ b/keyboards/comet46/rules.mk @@ -8,16 +8,18 @@ BOOTLOADER = caterina  #   change yes to no to disable  #  BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = no    # Mouse keys -EXTRAKEY_ENABLE = no    # Audio control and System control -CONSOLE_ENABLE = no     # Console for debug -COMMAND_ENABLE = no     # Commands for debug and configuration -CUSTOM_MATRIX = yes     # Remote matrix from the wireless bridge +MOUSEKEY_ENABLE = no        # Mouse keys +EXTRAKEY_ENABLE = no        # Audio control and System control +CONSOLE_ENABLE = no         # Console for debug +COMMAND_ENABLE = no         # Commands for debug and configuration  NKRO_ENABLE = yes           # Enable N-Key Rollover -# BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow +AUDIO_ENABLE = no           # Audio output +CUSTOM_MATRIX = lite  # project specific files  SRC += matrix.c \         i2c.c \ -       ssd1306.c \ -       serial_uart.c +       ssd1306.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/converter/palm_usb/config.h b/keyboards/converter/palm_usb/config.h index 4afc654e85..35032835cd 100644 --- a/keyboards/converter/palm_usb/config.h +++ b/keyboards/converter/palm_usb/config.h @@ -60,58 +60,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.      get_mods() == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \      get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \  ) - - -/* Serial(USART) configuration - *     asynchronous, negative logic, 9600baud, no flow control - *     1-start bit, 8-data bit, non parity, 1-stop bit - */ -#define SERIAL_SOFT_BAUD            9600 -#define SERIAL_SOFT_PARITY_NONE -#define SERIAL_SOFT_BIT_ORDER_LSB -#if (HANDSPRING == 0) -    #define SERIAL_SOFT_LOGIC_NEGATIVE  //RS232 logic -#endif -/* RXD Port */ -#define SERIAL_SOFT_RXD_ENABLE - -// we are using Pro micro pin 3 / D0 as serial -#define SERIAL_SOFT_RXD_DDR         DDRD -#define SERIAL_SOFT_RXD_PORT        PORTD -#define SERIAL_SOFT_RXD_PIN         PIND -#define SERIAL_SOFT_RXD_BIT         0 -#define SERIAL_SOFT_RXD_VECT        INT0_vect - -/* RXD Interupt */ -#define SERIAL_SOFT_RXD_INIT()      do { \ -    /* pin configuration: input with pull-up */ \ -    SERIAL_SOFT_RXD_DDR &= ~(1<<SERIAL_SOFT_RXD_BIT); \ -    SERIAL_SOFT_RXD_PORT |= (1<<SERIAL_SOFT_RXD_BIT); \ -    /* enable interrupt: INT0(rising edge) */ \ -    EICRA |= ((1<<ISC01)|(1<<ISC00)); \ -    EIMSK |= (1<<INT0); \ -    sei(); \ -} while (0) -#define SERIAL_SOFT_RXD_INT_ENTER() -#define SERIAL_SOFT_RXD_INT_EXIT()  do { \ -    /* clear interrupt  flag */ \ -    EIFR = (1<<INTF0); \ -} while (0) -#define SERIAL_SOFT_RXD_READ()      (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT)) - -/* TXD Port */ -#define SERIAL_SOFT_TXD_ENABLE -#define SERIAL_SOFT_TXD_DDR         DDRD -#define SERIAL_SOFT_TXD_PORT        PORTD -#define SERIAL_SOFT_TXD_PIN         PIND -#define SERIAL_SOFT_TXD_BIT         3 -#define SERIAL_SOFT_TXD_HI()        do { SERIAL_SOFT_TXD_PORT |=  (1<<SERIAL_SOFT_TXD_BIT); } while (0) -#define SERIAL_SOFT_TXD_LO()        do { SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); } while (0) -#define SERIAL_SOFT_TXD_INIT()      do { \ -    /* pin configuration: output */ \ -    SERIAL_SOFT_TXD_DDR |= (1<<SERIAL_SOFT_TXD_BIT); \ -    /* idle */ \ -    SERIAL_SOFT_TXD_ON(); \ -} while (0) - - diff --git a/keyboards/converter/palm_usb/matrix.c b/keyboards/converter/palm_usb/matrix.c index 289284b616..010fd56c79 100644 --- a/keyboards/converter/palm_usb/matrix.c +++ b/keyboards/converter/palm_usb/matrix.c @@ -18,7 +18,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */  #include QMK_KEYBOARD_H -#include "protocol/serial.h" +#include "uart.h"  #include "timer.h" @@ -58,8 +58,6 @@ static uint16_t disconnect_counter = 0;  #define COL(code)    ((code & COL_MASK) )  #define KEYUP(code) ((code & KEY_MASK) >>7 ) -static bool is_modified = false; -  __attribute__ ((weak))  void matrix_init_kb(void) {      matrix_init_user(); @@ -166,7 +164,7 @@ uint8_t rts_reset(void) {  uint8_t get_serial_byte(void) {      static uint8_t code;      while(1) { -        code = serial_recv(); +        code = uart_read();          if (code) {               debug_hex(code); debug(" ");              return code; @@ -242,7 +240,7 @@ void matrix_init(void)      debug_enable = true;      //debug_matrix =true; -    serial_init(); // arguments all #defined  +    uart_init(9600); // arguments all #defined   #if (HANDSPRING == 0)      pins_init(); // set all inputs and outputs.  @@ -292,7 +290,7 @@ void matrix_init(void)  uint8_t matrix_scan(void)  {      uint8_t code; -    code = serial_recv(); +    code = uart_read();      if (!code) {  /*                   disconnect_counter ++; @@ -354,11 +352,6 @@ uint8_t matrix_scan(void)      return code;  } -bool matrix_is_modified(void) -{ -    return is_modified; -} -  inline  bool matrix_has_ghost(void)  { diff --git a/keyboards/converter/palm_usb/post_rules.mk b/keyboards/converter/palm_usb/post_rules.mk deleted file mode 100644 index 9c11076701..0000000000 --- a/keyboards/converter/palm_usb/post_rules.mk +++ /dev/null @@ -1,7 +0,0 @@ -ifdef HARDWARE_SERIAL -  # Untested with palm_usb -  SRC += protocol/serial_uart.c -  OPT_DEFS += -DHARDWARE_SERIAL -else -  SRC += protocol/serial_soft.c -endif diff --git a/keyboards/converter/palm_usb/rules.mk b/keyboards/converter/palm_usb/rules.mk index c5e680b883..a1d2e39b23 100644 --- a/keyboards/converter/palm_usb/rules.mk +++ b/keyboards/converter/palm_usb/rules.mk @@ -20,5 +20,6 @@ RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  CUSTOM_MATRIX = yes  SRC += matrix.c +QUANTUM_LIB_SRC += uart.c  DEFAULT_FOLDER = converter/palm_usb/stowaway diff --git a/keyboards/converter/sun_usb/command_extra.c b/keyboards/converter/sun_usb/command_extra.c index 756a9160bb..332776ab90 100644 --- a/keyboards/converter/sun_usb/command_extra.c +++ b/keyboards/converter/sun_usb/command_extra.c @@ -1,5 +1,5 @@  #include QMK_KEYBOARD_H -#include "protocol/serial.h" +#include "uart.h"  bool sun_bell = false;  bool sun_click = false; @@ -20,41 +20,41 @@ bool command_extra(uint8_t code)              return false;          case KC_DEL:              print("Reset\n"); -            serial_send(0x01); +            uart_write(0x01);              break;          case KC_HOME:  	    sun_bell = !sun_bell;  	    if (sun_bell) {                  print("Bell On\n"); -	        serial_send(0x02); +	        uart_write(0x02);  	    } else {  	        print("Bell Off\n"); -	        serial_send(0x03); +	        uart_write(0x03);  	    }              break;          case KC_END:  	    sun_click = !sun_click;  	    if (sun_click) {  	        print("Click On\n"); -		serial_send(0x0A); +		uart_write(0x0A);  	    } else {  	        print("Click Off\n"); -                serial_send(0x0B); +                uart_write(0x0B);  	    }  	    break;          case KC_PGUP:              print("LED all on\n"); -            serial_send(0x0E); -            serial_send(0xFF); +            uart_write(0x0E); +            uart_write(0xFF);              break;          case KC_PGDOWN:              print("LED all off\n"); -            serial_send(0x0E); -            serial_send(0x00); +            uart_write(0x0E); +            uart_write(0x00);              break;          case KC_INSERT:              print("layout\n"); -            serial_send(0x0F); +            uart_write(0x0F);              break;          default:              xprintf("Unknown extra command: %02X\n", code); diff --git a/keyboards/converter/sun_usb/config.h b/keyboards/converter/sun_usb/config.h index c67ae5ebae..0a4aa019f7 100644 --- a/keyboards/converter/sun_usb/config.h +++ b/keyboards/converter/sun_usb/config.h @@ -33,50 +33,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.      get_mods() == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \      get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \  ) - - -/* Serial(USART) configuration - *     asynchronous, negative logic, 1200baud, no flow control - *     1-start bit, 8-data bit, non parity, 1-stop bit - */ -#define SERIAL_SOFT_BAUD            1200 -#define SERIAL_SOFT_PARITY_NONE -#define SERIAL_SOFT_BIT_ORDER_LSB -#define SERIAL_SOFT_LOGIC_NEGATIVE -/* RXD Port */ -#define SERIAL_SOFT_RXD_ENABLE -#define SERIAL_SOFT_RXD_DDR         DDRD -#define SERIAL_SOFT_RXD_PORT        PORTD -#define SERIAL_SOFT_RXD_PIN         PIND -#define SERIAL_SOFT_RXD_BIT         2 -#define SERIAL_SOFT_RXD_VECT        INT2_vect -/* RXD Interupt */ -#define SERIAL_SOFT_RXD_INIT()      do { \ -    /* pin configuration: input with pull-up */ \ -    SERIAL_SOFT_RXD_DDR &= ~(1<<SERIAL_SOFT_RXD_BIT); \ -    SERIAL_SOFT_RXD_PORT |= (1<<SERIAL_SOFT_RXD_BIT); \ -    /* enable interrupt: INT2(rising edge) */ \ -    EICRA |= ((1<<ISC21)|(1<<ISC20)); \ -    EIMSK |= (1<<INT2); \ -    sei(); \ -} while (0) -#define SERIAL_SOFT_RXD_INT_ENTER() -#define SERIAL_SOFT_RXD_INT_EXIT()  do { \ -    /* clear interrupt  flag */ \ -    EIFR = (1<<INTF2); \ -} while (0) -#define SERIAL_SOFT_RXD_READ()      (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT)) -/* TXD Port */ -#define SERIAL_SOFT_TXD_ENABLE -#define SERIAL_SOFT_TXD_DDR         DDRD -#define SERIAL_SOFT_TXD_PORT        PORTD -#define SERIAL_SOFT_TXD_PIN         PIND -#define SERIAL_SOFT_TXD_BIT         3 -#define SERIAL_SOFT_TXD_HI()        do { SERIAL_SOFT_TXD_PORT |=  (1<<SERIAL_SOFT_TXD_BIT); } while (0) -#define SERIAL_SOFT_TXD_LO()        do { SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); } while (0) -#define SERIAL_SOFT_TXD_INIT()      do { \ -    /* pin configuration: output */ \ -    SERIAL_SOFT_TXD_DDR |= (1<<SERIAL_SOFT_TXD_BIT); \ -    /* idle */ \ -    SERIAL_SOFT_TXD_ON(); \ -} while (0) diff --git a/keyboards/converter/sun_usb/led.c b/keyboards/converter/sun_usb/led.c index a409699e92..f8d183fd48 100644 --- a/keyboards/converter/sun_usb/led.c +++ b/keyboards/converter/sun_usb/led.c @@ -16,7 +16,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */  #include QMK_KEYBOARD_H -#include "protocol/serial.h" +#include "uart.h"  void led_set(uint8_t usb_led)  { @@ -27,6 +27,6 @@ void led_set(uint8_t usb_led)      if (usb_led & (1<<USB_LED_CAPS_LOCK))   sun_led |= (1<<3);      xprintf("LED: %02X\n", usb_led); -    serial_send(0x0E); -    serial_send(sun_led); +    uart_write(0x0E); +    uart_write(sun_led);  } diff --git a/keyboards/converter/sun_usb/matrix.c b/keyboards/converter/sun_usb/matrix.c index 21f45111ec..e28d165d52 100644 --- a/keyboards/converter/sun_usb/matrix.c +++ b/keyboards/converter/sun_usb/matrix.c @@ -16,7 +16,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */  #include QMK_KEYBOARD_H -#include "protocol/serial.h" +#include "uart.h"  /*   * Matrix Array usage: @@ -38,8 +38,6 @@ static uint8_t matrix[MATRIX_ROWS];  #define ROW(code)      ((code>>3)&0xF)  #define COL(code)      (code&0x07) -static bool is_modified = false; -  __attribute__ ((weak))  void matrix_init_kb(void) {      matrix_init_user(); @@ -76,7 +74,7 @@ void matrix_init(void)      /* PORTD |= (1<<6); */      debug_enable = true; -    serial_init(); +    uart_init(1200);      // initialize matrix state: all keys off      for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; @@ -86,12 +84,12 @@ void matrix_init(void)      /* print("Reseting "); */      /* while (1) { */      /*     print("."); */ -    /*     while (serial_recv()); */ -    /*     serial_send(0x01); */ +    /*     while (uart_read()); */ +    /*     uart_write(0x01); */      /*     _delay_ms(500); */ -    /*     if (serial_recv() == 0xFF) { */ +    /*     if (uart_read() == 0xFF) { */      /*         _delay_ms(500); */ -    /*         if (serial_recv() == 0x04) */ +    /*         if (uart_read() == 0x04) */      /*             break; */      /*     } */      /* } */ @@ -106,7 +104,7 @@ void matrix_init(void)  uint8_t matrix_scan(void)  {      uint8_t code; -    code = serial_recv(); +    code = uart_read();      if (!code) return 0;      debug_hex(code); debug(" "); @@ -115,7 +113,7 @@ uint8_t matrix_scan(void)          case 0xFF:  // reset success: FF 04              print("reset: ");              _delay_ms(500); -            code = serial_recv(); +            code = uart_read();              xprintf("%02X\n", code);              if (code == 0x04) {                  // LED status @@ -125,12 +123,12 @@ uint8_t matrix_scan(void)          case 0xFE:  // layout: FE <layout>              print("layout: ");              _delay_ms(500); -            xprintf("%02X\n", serial_recv()); +            xprintf("%02X\n", uart_read());              return 0;          case 0x7E:  // reset fail: 7E 01              print("reset fail: ");              _delay_ms(500); -            xprintf("%02X\n", serial_recv()); +            xprintf("%02X\n", uart_read());              return 0;          case 0x7F:              // all keys up @@ -154,11 +152,6 @@ uint8_t matrix_scan(void)      return code;  } -bool matrix_is_modified(void) -{ -    return is_modified; -} -  inline  bool matrix_has_ghost(void)  { diff --git a/keyboards/converter/sun_usb/post_rules.mk b/keyboards/converter/sun_usb/post_rules.mk deleted file mode 100644 index 2ea1f0a5bf..0000000000 --- a/keyboards/converter/sun_usb/post_rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -ifdef HARDWARE_SERIAL -  SRC += protocol/serial_uart.c -  OPT_DEFS += -DHARDWARE_SERIAL -else -  SRC += protocol/serial_soft.c -endif diff --git a/keyboards/converter/sun_usb/rules.mk b/keyboards/converter/sun_usb/rules.mk index 2f2ddde1d0..d25bcc7ffa 100644 --- a/keyboards/converter/sun_usb/rules.mk +++ b/keyboards/converter/sun_usb/rules.mk @@ -20,5 +20,6 @@ RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  CUSTOM_MATRIX = yes  SRC += matrix.c led.c +QUANTUM_LIB_SRC += uart.c  DEFAULT_FOLDER = converter/sun_usb/type5 diff --git a/keyboards/converter/usb_usb/custom_matrix.cpp b/keyboards/converter/usb_usb/custom_matrix.cpp index 296f7fcd02..91986f6eb9 100644 --- a/keyboards/converter/usb_usb/custom_matrix.cpp +++ b/keyboards/converter/usb_usb/custom_matrix.cpp @@ -192,10 +192,6 @@ extern "C"          return 1;      } -    bool matrix_is_modified(void) { -        return matrix_is_mod; -    } -      bool matrix_is_on(uint8_t row, uint8_t col) {          uint8_t code = CODE(row, col); diff --git a/keyboards/bat43/.noci b/keyboards/dailycraft/bat43/.noci index e69de29bb2..e69de29bb2 100644 --- a/keyboards/bat43/.noci +++ b/keyboards/dailycraft/bat43/.noci diff --git a/keyboards/bat43/bat43.c b/keyboards/dailycraft/bat43/bat43.c index 5d52c672b6..5d52c672b6 100644 --- a/keyboards/bat43/bat43.c +++ b/keyboards/dailycraft/bat43/bat43.c diff --git a/keyboards/bat43/bat43.h b/keyboards/dailycraft/bat43/bat43.h index 42d44107b4..046788a0a1 100644 --- a/keyboards/bat43/bat43.h +++ b/keyboards/dailycraft/bat43/bat43.h @@ -1,9 +1,9 @@  #pragma once -#ifdef KEYBOARD_bat43_rev1 +#ifdef KEYBOARD_dailycraft_bat43_rev1      #include "rev1.h"  #endif -#ifdef KEYBOARD_bat43_rev2 +#ifdef KEYBOARD_dailycraft_bat43_rev2      #include "rev2.h"  #endif diff --git a/keyboards/bat43/config.h b/keyboards/dailycraft/bat43/config.h index 19b485fd16..19b485fd16 100644 --- a/keyboards/bat43/config.h +++ b/keyboards/dailycraft/bat43/config.h diff --git a/keyboards/bat43/keymaps/default/keymap.c b/keyboards/dailycraft/bat43/keymaps/default/keymap.c index 5e4faccf98..5e4faccf98 100644 --- a/keyboards/bat43/keymaps/default/keymap.c +++ b/keyboards/dailycraft/bat43/keymaps/default/keymap.c diff --git a/keyboards/bat43/keymaps/default/readme.md b/keyboards/dailycraft/bat43/keymaps/default/readme.md index f72376d89e..f72376d89e 100644 --- a/keyboards/bat43/keymaps/default/readme.md +++ b/keyboards/dailycraft/bat43/keymaps/default/readme.md diff --git a/keyboards/bat43/keymaps/via/keymap.c b/keyboards/dailycraft/bat43/keymaps/via/keymap.c index 0bd07b6017..0bd07b6017 100644 --- a/keyboards/bat43/keymaps/via/keymap.c +++ b/keyboards/dailycraft/bat43/keymaps/via/keymap.c diff --git a/keyboards/bat43/keymaps/via/readme.md b/keyboards/dailycraft/bat43/keymaps/via/readme.md index f72376d89e..f72376d89e 100644 --- a/keyboards/bat43/keymaps/via/readme.md +++ b/keyboards/dailycraft/bat43/keymaps/via/readme.md diff --git a/keyboards/bat43/keymaps/via/rules.mk b/keyboards/dailycraft/bat43/keymaps/via/rules.mk index 1e5b99807c..1e5b99807c 100644 --- a/keyboards/bat43/keymaps/via/rules.mk +++ b/keyboards/dailycraft/bat43/keymaps/via/rules.mk diff --git a/keyboards/bat43/readme.md b/keyboards/dailycraft/bat43/readme.md index 7097aa7af5..6b58aa5ca3 100644 --- a/keyboards/bat43/readme.md +++ b/keyboards/dailycraft/bat43/readme.md @@ -6,10 +6,21 @@ A 43-key keyboard.  * Keyboard Maintainer: [yfuku](https://github.com/yfuku)  * Hardware Supported: bat43 PCB, Pro Micro -* Hardware Availability: https://yfuku.booth.pm/ +* Hardware Availability: https://shop.dailycraft.jp/  Make example for this keyboard (after setting up your build environment): -    make bat43:default +    make dailycraft/bat43:default + +Flashing example for this keyboard: + +    make dailycraft/bat43:default:flash  See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 2 ways: + +* **Physical reset button**: Briefly press the button on the PCB +* **Keycode in layout**: Press the key mapped to `RESET` if it is available diff --git a/keyboards/bat43/rev1/.noci b/keyboards/dailycraft/bat43/rev1/.noci index e69de29bb2..e69de29bb2 100644 --- a/keyboards/bat43/rev1/.noci +++ b/keyboards/dailycraft/bat43/rev1/.noci diff --git a/keyboards/bat43/rev1/info.json b/keyboards/dailycraft/bat43/rev1/info.json index 0384bb5feb..0384bb5feb 100644 --- a/keyboards/bat43/rev1/info.json +++ b/keyboards/dailycraft/bat43/rev1/info.json diff --git a/keyboards/bat43/rev1/rev1.c b/keyboards/dailycraft/bat43/rev1/rev1.c index cff7598740..cff7598740 100644 --- a/keyboards/bat43/rev1/rev1.c +++ b/keyboards/dailycraft/bat43/rev1/rev1.c diff --git a/keyboards/bat43/rev1/rev1.h b/keyboards/dailycraft/bat43/rev1/rev1.h index cf21486a9e..cf21486a9e 100644 --- a/keyboards/bat43/rev1/rev1.h +++ b/keyboards/dailycraft/bat43/rev1/rev1.h diff --git a/keyboards/bat43/rev1/rules.mk b/keyboards/dailycraft/bat43/rev1/rules.mk index 8b13789179..8b13789179 100644 --- a/keyboards/bat43/rev1/rules.mk +++ b/keyboards/dailycraft/bat43/rev1/rules.mk diff --git a/keyboards/bat43/rev2/.noci b/keyboards/dailycraft/bat43/rev2/.noci index e69de29bb2..e69de29bb2 100644 --- a/keyboards/bat43/rev2/.noci +++ b/keyboards/dailycraft/bat43/rev2/.noci diff --git a/keyboards/bat43/rev2/info.json b/keyboards/dailycraft/bat43/rev2/info.json index 352d9a6beb..352d9a6beb 100644 --- a/keyboards/bat43/rev2/info.json +++ b/keyboards/dailycraft/bat43/rev2/info.json diff --git a/keyboards/bat43/rev2/rev2.c b/keyboards/dailycraft/bat43/rev2/rev2.c index cffc0acd32..cffc0acd32 100644 --- a/keyboards/bat43/rev2/rev2.c +++ b/keyboards/dailycraft/bat43/rev2/rev2.c diff --git a/keyboards/bat43/rev2/rev2.h b/keyboards/dailycraft/bat43/rev2/rev2.h index f84cdbaa4d..f84cdbaa4d 100644 --- a/keyboards/bat43/rev2/rev2.h +++ b/keyboards/dailycraft/bat43/rev2/rev2.h diff --git a/keyboards/bat43/rev2/rules.mk b/keyboards/dailycraft/bat43/rev2/rules.mk index 8b13789179..8b13789179 100644 --- a/keyboards/bat43/rev2/rules.mk +++ b/keyboards/dailycraft/bat43/rev2/rules.mk diff --git a/keyboards/bat43/rules.mk b/keyboards/dailycraft/bat43/rules.mk index 7bd7394e4f..c2e1c5755f 100644 --- a/keyboards/bat43/rules.mk +++ b/keyboards/dailycraft/bat43/rules.mk @@ -17,4 +17,4 @@ BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality  RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow  AUDIO_ENABLE = no           # Audio output -DEFAULT_FOLDER = bat43/rev2 +DEFAULT_FOLDER = dailycraft/bat43/rev2 diff --git a/keyboards/claw44/.noci b/keyboards/dailycraft/claw44/.noci index e69de29bb2..e69de29bb2 100644 --- a/keyboards/claw44/.noci +++ b/keyboards/dailycraft/claw44/.noci diff --git a/keyboards/claw44/claw44.c b/keyboards/dailycraft/claw44/claw44.c index d87103065c..d87103065c 100644 --- a/keyboards/claw44/claw44.c +++ b/keyboards/dailycraft/claw44/claw44.c diff --git a/keyboards/claw44/claw44.h b/keyboards/dailycraft/claw44/claw44.h index 4ca25fcb2b..76ecda6e90 100644 --- a/keyboards/claw44/claw44.h +++ b/keyboards/dailycraft/claw44/claw44.h @@ -1,5 +1,5 @@  #pragma once -#ifdef KEYBOARD_claw44_rev1 +#ifdef KEYBOARD_dailycraft_claw44_rev1    #include "rev1.h"  #endif diff --git a/keyboards/claw44/config.h b/keyboards/dailycraft/claw44/config.h index 0bd74ff833..0bd74ff833 100644 --- a/keyboards/claw44/config.h +++ b/keyboards/dailycraft/claw44/config.h diff --git a/keyboards/claw44/keymaps/default/config.h b/keyboards/dailycraft/claw44/keymaps/default/config.h index 98469e4ccf..98469e4ccf 100644 --- a/keyboards/claw44/keymaps/default/config.h +++ b/keyboards/dailycraft/claw44/keymaps/default/config.h diff --git a/keyboards/claw44/keymaps/default/keymap.c b/keyboards/dailycraft/claw44/keymaps/default/keymap.c index 204c0c94e6..204c0c94e6 100644 --- a/keyboards/claw44/keymaps/default/keymap.c +++ b/keyboards/dailycraft/claw44/keymaps/default/keymap.c diff --git a/keyboards/claw44/keymaps/oled/config.h b/keyboards/dailycraft/claw44/keymaps/oled/config.h index 5379ce677d..5379ce677d 100644 --- a/keyboards/claw44/keymaps/oled/config.h +++ b/keyboards/dailycraft/claw44/keymaps/oled/config.h diff --git a/keyboards/claw44/keymaps/oled/keymap.c b/keyboards/dailycraft/claw44/keymaps/oled/keymap.c index 1778ac6167..1778ac6167 100644 --- a/keyboards/claw44/keymaps/oled/keymap.c +++ b/keyboards/dailycraft/claw44/keymaps/oled/keymap.c diff --git a/keyboards/claw44/keymaps/oled/rules.mk b/keyboards/dailycraft/claw44/keymaps/oled/rules.mk index d34d066ded..d34d066ded 100644 --- a/keyboards/claw44/keymaps/oled/rules.mk +++ b/keyboards/dailycraft/claw44/keymaps/oled/rules.mk diff --git a/keyboards/claw44/keymaps/via/config.h b/keyboards/dailycraft/claw44/keymaps/via/config.h index 98469e4ccf..98469e4ccf 100644 --- a/keyboards/claw44/keymaps/via/config.h +++ b/keyboards/dailycraft/claw44/keymaps/via/config.h diff --git a/keyboards/claw44/keymaps/via/keymap.c b/keyboards/dailycraft/claw44/keymaps/via/keymap.c index 5373b76876..5373b76876 100644 --- a/keyboards/claw44/keymaps/via/keymap.c +++ b/keyboards/dailycraft/claw44/keymaps/via/keymap.c diff --git a/keyboards/claw44/keymaps/via/rules.mk b/keyboards/dailycraft/claw44/keymaps/via/rules.mk index 1e5b99807c..1e5b99807c 100644 --- a/keyboards/claw44/keymaps/via/rules.mk +++ b/keyboards/dailycraft/claw44/keymaps/via/rules.mk diff --git a/keyboards/claw44/lib/glcdfont.c b/keyboards/dailycraft/claw44/lib/glcdfont.c index 9fa1c806aa..9fa1c806aa 100644 --- a/keyboards/claw44/lib/glcdfont.c +++ b/keyboards/dailycraft/claw44/lib/glcdfont.c diff --git a/keyboards/claw44/readme.md b/keyboards/dailycraft/claw44/readme.md index 7e72e08971..e533bd7c82 100644 --- a/keyboards/claw44/readme.md +++ b/keyboards/dailycraft/claw44/readme.md @@ -4,12 +4,23 @@  A split keyboard with 3x6 vertically staggered keys and 4 thumb keys. -Keyboard Maintainer: [@yfuku_](https://twitter.com/yfuku_)   -Hardware Supported: Claw44 PCB, ProMicro   -Hardware Availability: https://yfuku.booth.pm/   +* Keyboard Maintainer: [yfuku](https://github.com/yfuku) +* Hardware Supported: Claw44 PCB, ProMicro +* Hardware Availability: https://shop.dailycraft.jp/  Make example for this keyboard (after setting up your build environment): -    make claw44:default +    make dailycraft/claw44:default + +Flashing example for this keyboard: + +    make dailycraft/claw44:default:flash  See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 2 ways: + +* **Physical reset button**: Briefly press the button on the PCB +* **Keycode in layout**: Press the key mapped to `RESET` if it is available diff --git a/keyboards/claw44/rev1/.noci b/keyboards/dailycraft/claw44/rev1/.noci index e69de29bb2..e69de29bb2 100644 --- a/keyboards/claw44/rev1/.noci +++ b/keyboards/dailycraft/claw44/rev1/.noci diff --git a/keyboards/claw44/rev1/config.h b/keyboards/dailycraft/claw44/rev1/config.h index 8116b605cd..8116b605cd 100644 --- a/keyboards/claw44/rev1/config.h +++ b/keyboards/dailycraft/claw44/rev1/config.h diff --git a/keyboards/claw44/rev1/info.json b/keyboards/dailycraft/claw44/rev1/info.json index 3301e7d2ec..3301e7d2ec 100644 --- a/keyboards/claw44/rev1/info.json +++ b/keyboards/dailycraft/claw44/rev1/info.json diff --git a/keyboards/claw44/rev1/readme.md b/keyboards/dailycraft/claw44/rev1/readme.md index 5ad967af80..5ad967af80 100644 --- a/keyboards/claw44/rev1/readme.md +++ b/keyboards/dailycraft/claw44/rev1/readme.md diff --git a/keyboards/claw44/rev1/rev1.c b/keyboards/dailycraft/claw44/rev1/rev1.c index 520a869e57..520a869e57 100644 --- a/keyboards/claw44/rev1/rev1.c +++ b/keyboards/dailycraft/claw44/rev1/rev1.c diff --git a/keyboards/claw44/rev1/rev1.h b/keyboards/dailycraft/claw44/rev1/rev1.h index 9a05977153..9a05977153 100644 --- a/keyboards/claw44/rev1/rev1.h +++ b/keyboards/dailycraft/claw44/rev1/rev1.h diff --git a/keyboards/claw44/rev1/rules.mk b/keyboards/dailycraft/claw44/rev1/rules.mk index a66eb7d352..a66eb7d352 100644 --- a/keyboards/claw44/rev1/rules.mk +++ b/keyboards/dailycraft/claw44/rev1/rules.mk diff --git a/keyboards/claw44/rules.mk b/keyboards/dailycraft/claw44/rules.mk index 6ba5e853fb..69c59f28e6 100644 --- a/keyboards/claw44/rules.mk +++ b/keyboards/dailycraft/claw44/rules.mk @@ -17,4 +17,4 @@ BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality  AUDIO_ENABLE = no           # Audio output  RGBLIGHT_ENABLE = no       # Enable WS2812 RGB underlight.  -DEFAULT_FOLDER = claw44/rev1 +DEFAULT_FOLDER = dailycraft/claw44/rev1 diff --git a/keyboards/owl8/config.h b/keyboards/dailycraft/owl8/config.h index d28fd9c927..d28fd9c927 100644 --- a/keyboards/owl8/config.h +++ b/keyboards/dailycraft/owl8/config.h diff --git a/keyboards/owl8/info.json b/keyboards/dailycraft/owl8/info.json index e50484ba90..e50484ba90 100644 --- a/keyboards/owl8/info.json +++ b/keyboards/dailycraft/owl8/info.json diff --git a/keyboards/owl8/keymaps/default/keymap.c b/keyboards/dailycraft/owl8/keymaps/default/keymap.c index e840263639..e840263639 100644 --- a/keyboards/owl8/keymaps/default/keymap.c +++ b/keyboards/dailycraft/owl8/keymaps/default/keymap.c diff --git a/keyboards/owl8/keymaps/default/readme.md b/keyboards/dailycraft/owl8/keymaps/default/readme.md index e0129daa2d..e0129daa2d 100644 --- a/keyboards/owl8/keymaps/default/readme.md +++ b/keyboards/dailycraft/owl8/keymaps/default/readme.md diff --git a/keyboards/owl8/keymaps/via/keymap.c b/keyboards/dailycraft/owl8/keymaps/via/keymap.c index 6e3f6ea90b..6e3f6ea90b 100644 --- a/keyboards/owl8/keymaps/via/keymap.c +++ b/keyboards/dailycraft/owl8/keymaps/via/keymap.c diff --git a/keyboards/owl8/keymaps/via/readme.md b/keyboards/dailycraft/owl8/keymaps/via/readme.md index c4fa65987c..c4fa65987c 100644 --- a/keyboards/owl8/keymaps/via/readme.md +++ b/keyboards/dailycraft/owl8/keymaps/via/readme.md diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/via/rules.mk b/keyboards/dailycraft/owl8/keymaps/via/rules.mk index 1e5b99807c..1e5b99807c 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/via/rules.mk +++ b/keyboards/dailycraft/owl8/keymaps/via/rules.mk diff --git a/keyboards/owl8/owl8.c b/keyboards/dailycraft/owl8/owl8.c index a31289891a..a31289891a 100644 --- a/keyboards/owl8/owl8.c +++ b/keyboards/dailycraft/owl8/owl8.c diff --git a/keyboards/owl8/owl8.h b/keyboards/dailycraft/owl8/owl8.h index 5e561f580c..5e561f580c 100644 --- a/keyboards/owl8/owl8.h +++ b/keyboards/dailycraft/owl8/owl8.h diff --git a/keyboards/owl8/readme.md b/keyboards/dailycraft/owl8/readme.md index b40a5f35cb..c7fab17476 100644 --- a/keyboards/owl8/readme.md +++ b/keyboards/dailycraft/owl8/readme.md @@ -6,14 +6,21 @@ macropad  * Keyboard Maintainer: [yfuku](https://github.com/yfuku)  * Hardware Supported: owl8 PCB, Pro Micro -* Hardware Availability: https://yfuku.booth.pm/ +* Hardware Availability: https://shop.dailycraft.jp/  Make example for this keyboard (after setting up your build environment): -    make owl8:default +    make dailycraft/owl8:default  Flashing example for this keyboard: -    make owl8:default:flash +    make dailycraft/owl8:default:flash  See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 2 ways: + +* **Physical reset button**: Briefly press the button on the PCB +* **Keycode in layout**: Press the key mapped to `RESET` if it is available diff --git a/keyboards/owl8/rules.mk b/keyboards/dailycraft/owl8/rules.mk index 284ea23e78..284ea23e78 100644 --- a/keyboards/owl8/rules.mk +++ b/keyboards/dailycraft/owl8/rules.mk diff --git a/keyboards/wings42/config.h b/keyboards/dailycraft/wings42/config.h index cfb6bf4ffc..cfb6bf4ffc 100644 --- a/keyboards/wings42/config.h +++ b/keyboards/dailycraft/wings42/config.h diff --git a/keyboards/wings42/rev2/readme.md b/keyboards/dailycraft/wings42/readme.md index 158372feb4..c919653397 100644 --- a/keyboards/wings42/rev2/readme.md +++ b/keyboards/dailycraft/wings42/readme.md @@ -6,16 +6,21 @@ A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.  * Keyboard Maintainer: [yfuku](https://github.com/yfuku)  * Hardware Supported: wings42 PCB, Pro Micro -* Hardware Availability: https://yfuku.booth.pm/ +* Hardware Availability: https://shop.dailycraft.jp/  Make example for this keyboard (after setting up your build environment): -    make wings42:default +    make dailycraft/wings42:default  Flashing example for this keyboard: -    make wings42:default:flash +    make dailycraft/wings42:default:flash  See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). -A build guide for this keyboard can be found here: [wings42 build guide](https://yfuku.com/wings42/buildguide/) +## Bootloader + +Enter the bootloader in 2 ways: + +* **Physical reset button**: Briefly press the button on the PCB +* **Keycode in layout**: Press the key mapped to `RESET` if it is available diff --git a/keyboards/wings42/rev1/config.h b/keyboards/dailycraft/wings42/rev1/config.h index cfb4274921..cfb4274921 100644 --- a/keyboards/wings42/rev1/config.h +++ b/keyboards/dailycraft/wings42/rev1/config.h diff --git a/keyboards/wings42/rev1/keymaps/default/keymap.c b/keyboards/dailycraft/wings42/rev1/keymaps/default/keymap.c index 442ba5ed9f..442ba5ed9f 100644 --- a/keyboards/wings42/rev1/keymaps/default/keymap.c +++ b/keyboards/dailycraft/wings42/rev1/keymaps/default/keymap.c diff --git a/keyboards/wings42/rev1/keymaps/default/readme.md b/keyboards/dailycraft/wings42/rev1/keymaps/default/readme.md index d99098ad0c..d99098ad0c 100644 --- a/keyboards/wings42/rev1/keymaps/default/readme.md +++ b/keyboards/dailycraft/wings42/rev1/keymaps/default/readme.md diff --git a/keyboards/wings42/rev1/keymaps/via/keymap.c b/keyboards/dailycraft/wings42/rev1/keymaps/via/keymap.c index 442ba5ed9f..442ba5ed9f 100644 --- a/keyboards/wings42/rev1/keymaps/via/keymap.c +++ b/keyboards/dailycraft/wings42/rev1/keymaps/via/keymap.c diff --git a/keyboards/owl8/keymaps/via/rules.mk b/keyboards/dailycraft/wings42/rev1/keymaps/via/rules.mk index 1e5b99807c..1e5b99807c 100644 --- a/keyboards/owl8/keymaps/via/rules.mk +++ b/keyboards/dailycraft/wings42/rev1/keymaps/via/rules.mk diff --git a/keyboards/wings42/rev1_extkeys/readme.md b/keyboards/dailycraft/wings42/rev1/readme.md index 7be464a141..959052c41d 100644 --- a/keyboards/wings42/rev1_extkeys/readme.md +++ b/keyboards/dailycraft/wings42/rev1/readme.md @@ -6,16 +6,21 @@ A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.  * Keyboard Maintainer: [yfuku](https://github.com/yfuku)  * Hardware Supported: wings42 PCB, Pro Micro -* Hardware Availability: https://yfuku.booth.pm/ +* Hardware Availability: https://shop.dailycraft.jp/  Make example for this keyboard (after setting up your build environment): -    make make wings42/rev1_extkeys:default +    make dailycraft/wings42/rev1:default  Flashing example for this keyboard: -    make make wings42/rev1_extkeys:default:flash +    make dailycraft/wings42/rev1:default:flash  See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). -A build guide for this keyboard can be found here: [wings42 build guide](https://yfuku.com/wings42/buildguide/) +## Bootloader + +Enter the bootloader in 2 ways: + +* **Physical reset button**: Briefly press the button on the PCB +* **Keycode in layout**: Press the key mapped to `RESET` if it is available diff --git a/keyboards/wings42/rev1/rev1.c b/keyboards/dailycraft/wings42/rev1/rev1.c index dccf24c746..dccf24c746 100644 --- a/keyboards/wings42/rev1/rev1.c +++ b/keyboards/dailycraft/wings42/rev1/rev1.c diff --git a/keyboards/wings42/rev1/rev1.h b/keyboards/dailycraft/wings42/rev1/rev1.h index cd6e35a711..cd6e35a711 100644 --- a/keyboards/wings42/rev1/rev1.h +++ b/keyboards/dailycraft/wings42/rev1/rev1.h diff --git a/keyboards/wings42/rev1/rules.mk b/keyboards/dailycraft/wings42/rev1/rules.mk index e69de29bb2..e69de29bb2 100644 --- a/keyboards/wings42/rev1/rules.mk +++ b/keyboards/dailycraft/wings42/rev1/rules.mk diff --git a/keyboards/wings42/rev1_extkeys/config.h b/keyboards/dailycraft/wings42/rev1_extkeys/config.h index f0f04eca59..f0f04eca59 100644 --- a/keyboards/wings42/rev1_extkeys/config.h +++ b/keyboards/dailycraft/wings42/rev1_extkeys/config.h diff --git a/keyboards/wings42/rev1_extkeys/keymaps/default/keymap.c b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/keymap.c index 64a2b00c31..64a2b00c31 100644 --- a/keyboards/wings42/rev1_extkeys/keymaps/default/keymap.c +++ b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/keymap.c diff --git a/keyboards/wings42/rev1_extkeys/keymaps/default/readme.md b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/readme.md index d99098ad0c..d99098ad0c 100644 --- a/keyboards/wings42/rev1_extkeys/keymaps/default/readme.md +++ b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/readme.md diff --git a/keyboards/wings42/rev1_extkeys/keymaps/via/keymap.c b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/keymap.c index 97c77e182b..97c77e182b 100644 --- a/keyboards/wings42/rev1_extkeys/keymaps/via/keymap.c +++ b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/keymap.c diff --git a/keyboards/wings42/rev1/keymaps/via/rules.mk b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/rules.mk index 1e5b99807c..1e5b99807c 100644 --- a/keyboards/wings42/rev1/keymaps/via/rules.mk +++ b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/rules.mk diff --git a/keyboards/wings42/readme.md b/keyboards/dailycraft/wings42/rev1_extkeys/readme.md index fc71d58ab6..4a34063ad4 100644 --- a/keyboards/wings42/readme.md +++ b/keyboards/dailycraft/wings42/rev1_extkeys/readme.md @@ -6,14 +6,21 @@ A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.  * Keyboard Maintainer: [yfuku](https://github.com/yfuku)  * Hardware Supported: wings42 PCB, Pro Micro -* Hardware Availability: https://yfuku.booth.pm/ +* Hardware Availability: https://shop.dailycraft.jp/  Make example for this keyboard (after setting up your build environment): -    make wings42:default +    make dailycraft/wings42/rev1_extkeys:default  Flashing example for this keyboard: -    make wings42:default:flash +    make dailycraft/wings42/rev1_extkeys:default:flash  See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 2 ways: + +* **Physical reset button**: Briefly press the button on the PCB +* **Keycode in layout**: Press the key mapped to `RESET` if it is available diff --git a/keyboards/wings42/rev1_extkeys/rev1_extkeys.c b/keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.c index 3d0d203704..3d0d203704 100644 --- a/keyboards/wings42/rev1_extkeys/rev1_extkeys.c +++ b/keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.c diff --git a/keyboards/wings42/rev1_extkeys/rev1_extkeys.h b/keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.h index 2ad58047f1..2ad58047f1 100644 --- a/keyboards/wings42/rev1_extkeys/rev1_extkeys.h +++ b/keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.h diff --git a/keyboards/wings42/rev1_extkeys/rules.mk b/keyboards/dailycraft/wings42/rev1_extkeys/rules.mk index e69de29bb2..e69de29bb2 100644 --- a/keyboards/wings42/rev1_extkeys/rules.mk +++ b/keyboards/dailycraft/wings42/rev1_extkeys/rules.mk diff --git a/keyboards/wings42/rev2/config.h b/keyboards/dailycraft/wings42/rev2/config.h index 836833718c..836833718c 100644 --- a/keyboards/wings42/rev2/config.h +++ b/keyboards/dailycraft/wings42/rev2/config.h diff --git a/keyboards/wings42/rev2/keymaps/default/keymap.c b/keyboards/dailycraft/wings42/rev2/keymaps/default/keymap.c index df572a6f5a..df572a6f5a 100644 --- a/keyboards/wings42/rev2/keymaps/default/keymap.c +++ b/keyboards/dailycraft/wings42/rev2/keymaps/default/keymap.c diff --git a/keyboards/wings42/rev2/keymaps/default/readme.md b/keyboards/dailycraft/wings42/rev2/keymaps/default/readme.md index d99098ad0c..d99098ad0c 100644 --- a/keyboards/wings42/rev2/keymaps/default/readme.md +++ b/keyboards/dailycraft/wings42/rev2/keymaps/default/readme.md diff --git a/keyboards/wings42/rev2/keymaps/via/config.h b/keyboards/dailycraft/wings42/rev2/keymaps/via/config.h index 3e0c8d146a..3e0c8d146a 100644 --- a/keyboards/wings42/rev2/keymaps/via/config.h +++ b/keyboards/dailycraft/wings42/rev2/keymaps/via/config.h diff --git a/keyboards/wings42/rev2/keymaps/via/keymap.c b/keyboards/dailycraft/wings42/rev2/keymaps/via/keymap.c index e6b4ef840a..e6b4ef840a 100644 --- a/keyboards/wings42/rev2/keymaps/via/keymap.c +++ b/keyboards/dailycraft/wings42/rev2/keymaps/via/keymap.c diff --git a/keyboards/wings42/rev2/keymaps/via/rules.mk b/keyboards/dailycraft/wings42/rev2/keymaps/via/rules.mk index eea5e1e2a2..eea5e1e2a2 100644 --- a/keyboards/wings42/rev2/keymaps/via/rules.mk +++ b/keyboards/dailycraft/wings42/rev2/keymaps/via/rules.mk diff --git a/keyboards/wings42/rev1/readme.md b/keyboards/dailycraft/wings42/rev2/readme.md index 4ddfe3e83c..c919653397 100644 --- a/keyboards/wings42/rev1/readme.md +++ b/keyboards/dailycraft/wings42/rev2/readme.md @@ -6,16 +6,21 @@ A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.  * Keyboard Maintainer: [yfuku](https://github.com/yfuku)  * Hardware Supported: wings42 PCB, Pro Micro -* Hardware Availability: https://yfuku.booth.pm/ +* Hardware Availability: https://shop.dailycraft.jp/  Make example for this keyboard (after setting up your build environment): -    make wings42/rev1:default +    make dailycraft/wings42:default  Flashing example for this keyboard: -    make wings42/rev1:default:flash +    make dailycraft/wings42:default:flash  See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). -A build guide for this keyboard can be found here: [wings42 build guide](https://yfuku.com/wings42/buildguide/) +## Bootloader + +Enter the bootloader in 2 ways: + +* **Physical reset button**: Briefly press the button on the PCB +* **Keycode in layout**: Press the key mapped to `RESET` if it is available diff --git a/keyboards/wings42/rev2/rev2.c b/keyboards/dailycraft/wings42/rev2/rev2.c index 96aa6cd314..96aa6cd314 100644 --- a/keyboards/wings42/rev2/rev2.c +++ b/keyboards/dailycraft/wings42/rev2/rev2.c diff --git a/keyboards/wings42/rev2/rev2.h b/keyboards/dailycraft/wings42/rev2/rev2.h index 4720592264..4720592264 100644 --- a/keyboards/wings42/rev2/rev2.h +++ b/keyboards/dailycraft/wings42/rev2/rev2.h diff --git a/keyboards/wings42/rev2/rules.mk b/keyboards/dailycraft/wings42/rev2/rules.mk index e69de29bb2..e69de29bb2 100644 --- a/keyboards/wings42/rev2/rules.mk +++ b/keyboards/dailycraft/wings42/rev2/rules.mk diff --git a/keyboards/wings42/rules.mk b/keyboards/dailycraft/wings42/rules.mk index 74e894efec..94459dbcc5 100644 --- a/keyboards/wings42/rules.mk +++ b/keyboards/dailycraft/wings42/rules.mk @@ -19,4 +19,4 @@ AUDIO_ENABLE = no           # Audio output  SPLIT_KEYBOARD = yes -DEFAULT_FOLDER = wings42/rev2 +DEFAULT_FOLDER = dailycraft/wings42/rev2 diff --git a/keyboards/wings42/wings42.c b/keyboards/dailycraft/wings42/wings42.c index 824b6cfbb6..824b6cfbb6 100644 --- a/keyboards/wings42/wings42.c +++ b/keyboards/dailycraft/wings42/wings42.c diff --git a/keyboards/wings42/wings42.h b/keyboards/dailycraft/wings42/wings42.h index 9412b7117a..d839f04884 100644 --- a/keyboards/wings42/wings42.h +++ b/keyboards/dailycraft/wings42/wings42.h @@ -18,13 +18,13 @@  #include "quantum.h" -#ifdef KEYBOARD_wings42_rev1 +#ifdef KEYBOARD_dailycraft_wings42_rev1  #    include "rev1.h"  #endif -#ifdef KEYBOARD_wings42_rev1_extkeys +#ifdef KEYBOARD_dailycraft_wings42_rev1_extkeys  #    include "rev1_extkeys.h"  #endif -#ifdef KEYBOARD_wings42_rev2 +#ifdef KEYBOARD_dailycraft_wings42_rev2  #    include "rev2.h"  #endif diff --git a/keyboards/dc01/arrow/matrix.c b/keyboards/dc01/arrow/matrix.c index 0102ad0fa4..b69e147914 100644 --- a/keyboards/dc01/arrow/matrix.c +++ b/keyboards/dc01/arrow/matrix.c @@ -205,14 +205,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/dc01/left/matrix.c b/keyboards/dc01/left/matrix.c index bf5aba8497..084978a1fd 100644 --- a/keyboards/dc01/left/matrix.c +++ b/keyboards/dc01/left/matrix.c @@ -230,14 +230,6 @@ if (i2c_transaction(SLAVE_I2C_ADDRESS_NUMPAD, 0x1FFFF, 11)) {      return 1;  } -bool matrix_is_modified(void) -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/dc01/numpad/matrix.c b/keyboards/dc01/numpad/matrix.c index 38130114eb..e8e2a1b14a 100644 --- a/keyboards/dc01/numpad/matrix.c +++ b/keyboards/dc01/numpad/matrix.c @@ -205,14 +205,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/dc01/right/matrix.c b/keyboards/dc01/right/matrix.c index 544c8dc538..2509bd7d4c 100644 --- a/keyboards/dc01/right/matrix.c +++ b/keyboards/dc01/right/matrix.c @@ -206,14 +206,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/dichotomy/config.h b/keyboards/dichotomy/config.h index 03e19b1388..40e7f18e6f 100644 --- a/keyboards/dichotomy/config.h +++ b/keyboards/dichotomy/config.h @@ -56,12 +56,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/dichotomy/dichotomy.c b/keyboards/dichotomy/dichotomy.c index 967d7e603c..afd52cc8b3 100755 --- a/keyboards/dichotomy/dichotomy.c +++ b/keyboards/dichotomy/dichotomy.c @@ -1,11 +1,13 @@  #include "dichotomy.h" +//#include "uart.h" +  void pointing_device_task(void){  	/*report_mouse_t currentReport = {};      uint32_t timeout = 0;      //the m character requests the RF slave to send the mouse report -    SERIAL_UART_DATA = 'm'; +    uart_write('m');      //trust the external inputs completely, erase old data      uint8_t uart_data[5] = {0}; @@ -15,7 +17,7 @@ void pointing_device_task(void){          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while(!uart_available()){              timeout++;              if (timeout > 10000){  		xprintf("\r\nTIMED OUT"); @@ -23,7 +25,7 @@ void pointing_device_task(void){              }          }  	xprintf("\r\nGOT DATA for %d",i); -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, bytes 1-4 are movement and scroll diff --git a/keyboards/dichotomy/matrix.c b/keyboards/dichotomy/matrix.c index ed83bd452c..806b66d498 100755 --- a/keyboards/dichotomy/matrix.c +++ b/keyboards/dichotomy/matrix.c @@ -29,7 +29,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "dichotomy.h"  #include "pointing_device.h"  #include "report.h" -#include "protocol/serial.h" +#include "uart.h"  #if (MATRIX_COLS <= 8)  #    define print_matrix_header()  print("\nr/c 01234567\n") @@ -94,7 +94,7 @@ uint8_t matrix_cols(void) {  void matrix_init(void) {      matrix_init_quantum(); -    serial_init(); +    uart_init(1000000);  }  uint8_t matrix_scan(void) @@ -104,7 +104,7 @@ uint8_t matrix_scan(void)      uint32_t timeout = 0;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[11] = {0}; @@ -114,14 +114,14 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while(!uart_available()){              timeout++;              if (timeout > 10000){  		xprintf("\r\nTime out in keyboard.");                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0 diff --git a/keyboards/dichotomy/rules.mk b/keyboards/dichotomy/rules.mk index 2b5eb0360c..a6029e3dbf 100755 --- a/keyboards/dichotomy/rules.mk +++ b/keyboards/dichotomy/rules.mk @@ -18,4 +18,5 @@ NKRO_ENABLE = yes           # Enable N-Key Rollover  # BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality  # # project specific files -SRC += matrix.c serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/dm9records/ergoinu/config.h b/keyboards/dm9records/ergoinu/config.h index 113eaf9f76..89ea9e7903 100644 --- a/keyboards/dm9records/ergoinu/config.h +++ b/keyboards/dm9records/ergoinu/config.h @@ -20,7 +20,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #pragma once  #include "config_common.h" -#include "serial_config.h"  /* USB Device descriptor parameter     VID & PID are lisenced from microchip sublisence program, Don't use other project! */ @@ -30,11 +29,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define MANUFACTURER    Dm9Records  #define PRODUCT         ergoinu -#define TAPPING_FORCE_HOLD -#define TAPPING_TERM 100 -  #define USE_SERIAL +/* serial.c configuration for split keyboard */ +#define SOFT_SERIAL_PIN D2 +  /* Select hand configuration */  #define MASTER_LEFT  // #define MASTER_RIGHT @@ -49,6 +48,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define MATRIX_COLS 7  #define MATRIX_COL_PINS { B4, E6, D7, C6, D4, F5, F4 } +/* COL2ROW, ROW2COL */ +#define DIODE_DIRECTION COL2ROW +  /* define if matrix has ghost */  //#define MATRIX_HAS_GHOST diff --git a/keyboards/dm9records/ergoinu/ergoinu.c b/keyboards/dm9records/ergoinu/ergoinu.c index c6d099a148..a01ac0a25c 100644 --- a/keyboards/dm9records/ergoinu/ergoinu.c +++ b/keyboards/dm9records/ergoinu/ergoinu.c @@ -1 +1,18 @@ +/* +Copyright 2018 Takuya Urakawa<twitter:@hsgw> + +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 "ergoinu.h" diff --git a/keyboards/dm9records/ergoinu/ergoinu.h b/keyboards/dm9records/ergoinu/ergoinu.h index 43249a8440..c275d3fa27 100644 --- a/keyboards/dm9records/ergoinu/ergoinu.h +++ b/keyboards/dm9records/ergoinu/ergoinu.h @@ -19,10 +19,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "quantum.h" -#ifdef RGBLIGHT_ENABLE -#include "ws2812.h" -#endif -  #define LAYOUT( \    L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \    L07, L08, L09, L10, L11, L12, L13, R07, R08, R09, R10, R11, R12, R13, \ @@ -41,4 +37,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.      { R27, R26, R25, R24, R23, R22, R21 }, \      { KC_NO, KC_NO, R32, R31, R30, R29, R28 } \    } - diff --git a/keyboards/dm9records/ergoinu/keymaps/default/config.h b/keyboards/dm9records/ergoinu/keymaps/default/config.h deleted file mode 100644 index bb266f25e7..0000000000 --- a/keyboards/dm9records/ergoinu/keymaps/default/config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako <wakojun@gmail.com> -Copyright 2015 Jack Humbert -Copyright 2018 Takuya Urakawa <Twitter:@hsgw> - -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 - -#define RGBLIGHT_ANIMATIONS diff --git a/keyboards/dm9records/ergoinu/keymaps/default/keymap.c b/keyboards/dm9records/ergoinu/keymaps/default/keymap.c index 00c5da820d..862b538829 100644 --- a/keyboards/dm9records/ergoinu/keymaps/default/keymap.c +++ b/keyboards/dm9records/ergoinu/keymaps/default/keymap.c @@ -5,14 +5,6 @@  extern rgblight_config_t rgblight_config;  #endif -#define JA_CLON KC_QUOT  // : and + -#define JA_AT   KC_LBRC  // @ and ` -#define JA_HAT  KC_EQL   // ^ and ~ -#define JA_ENUN KC_RO    // \ and _ (EN mark and UNder score) -#define JA_ENVL KC_JYEN  // \ and | (EN mark and Vertical Line) -#define JA_LBRC KC_RBRC  // [ and { -#define JA_RBRC KC_BSLS  // ] and } -  enum LAYER_NO {    BASE = 0,    META, @@ -24,33 +16,30 @@ enum CUSTOM_KEYCODES {    RGB_TYPE,  }; -// Fillers to make layering more clear -#define ______ KC_TRNS -#define XXXXXX KC_NO -  const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {    [BASE] = LAYOUT( -    KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,     KC_5,    KC_6,    KC_7,   KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,   KC_BSLS, -    KC_DEL,  KC_TAB,  KC_Q,    KC_W,    KC_E,     KC_R,    KC_T,    KC_Y,   KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC,  KC_RBRC, -    KC_LCTL,          KC_A,    KC_S,    KC_D,     KC_F,    KC_G,    KC_H,   KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,  KC_GRV, -    KC_LSFT,          KC_Z,    KC_X,    KC_C,     KC_V,    KC_B,    KC_N,   KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,  KC_RSFT, +    KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,     KC_5,    KC_6,    KC_7,   KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS, +    KC_DEL,  KC_TAB,  KC_Q,    KC_W,    KC_E,     KC_R,    KC_T,    KC_Y,   KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, +    KC_LCTL,          KC_A,    KC_S,    KC_D,     KC_F,    KC_G,    KC_H,   KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_GRV, +    KC_LSFT,          KC_Z,    KC_X,    KC_C,     KC_V,    KC_B,    KC_N,   KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT,                        MO(META),KC_LALT, KC_LGUI,  KC_ENT,  KC_SPC,  KC_ENT, KC_BSPC, KC_RGUI, KC_RALT, MO(META)    ),    [META] = LAYOUT(      MO(CONF),KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_INS, -    ______,  KC_CAPS, ______,  ______,  ______,  ______,  ______,  ______,  ______,  ______,  KC_SLCK, KC_PSCR, KC_HOME, KC_END, -    ______,           ______,  ______,  ______,  ______,  ______,  ______,  ______,  ______,  KC_PAUS, KC_PGUP, KC_UP,   KC_PGDN, -    ______,           ______,  ______,  ______,  ______,  ______,  ______,  ______,  ______,  ______,  KC_LEFT, KC_DOWN, KC_RGHT, -                      ______,  ______,  ______,  ______,  ______,  ______,  ______,  ______,  ______, ______ +    _______, KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, KC_SLCK, KC_PSCR, KC_HOME, KC_END, +    _______,          _______, _______, _______, _______, _______, _______, _______, _______, KC_PAUS, KC_PGUP, KC_UP,   KC_PGDN, +    _______,          _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, +                      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______    ), - [CONF] = LAYOUT( -    ______,  RGB_TYPE,RGB_MOD,  RGB_VAI, RGB_HUI, RGB_HUI,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX, -    RGB_RST, RGB_TOG, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_HUD,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX, -    XXXXXX,           XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX, -    XXXXXX,           XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX, -                      XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX + +  [CONF] = LAYOUT( +    _______, RGB_TYPE,RGB_MOD,  RGB_VAI, RGB_HUI, RGB_HUI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, +    RGB_RST, RGB_TOG, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_HUD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, +    XXXXXXX,          XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, +    XXXXXXX,          XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, +                      XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX    )  }; diff --git a/keyboards/dm9records/ergoinu/keymaps/default/rules.mk b/keyboards/dm9records/ergoinu/keymaps/default/rules.mk deleted file mode 100644 index 8567c2ae2e..0000000000 --- a/keyboards/dm9records/ergoinu/keymaps/default/rules.mk +++ /dev/null @@ -1,18 +0,0 @@ -BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = no       # Mouse keys -EXTRAKEY_ENABLE = no       # Audio control and System control -CONSOLE_ENABLE = no         # Console for debug -COMMAND_ENABLE = no        # Commands for debug and configuration -NKRO_ENABLE = no -BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality -AUDIO_ENABLE = no           # Audio output -RGBLIGHT_ENABLE = yes        # Enable WS2812 RGB underlight.  -SWAP_HANDS_ENABLE = no        # Enable one-hand typing - -# ergoinu configs -DISABLE_PROMICRO_LEDs = yes - -# Uncomment these for debugging -# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) -# $(info -- OPT_DEFS=$(OPT_DEFS)) -# $(info ) diff --git a/keyboards/dm9records/ergoinu/keymaps/default_jis/config.h b/keyboards/dm9records/ergoinu/keymaps/default_jis/config.h deleted file mode 100644 index bb266f25e7..0000000000 --- a/keyboards/dm9records/ergoinu/keymaps/default_jis/config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako <wakojun@gmail.com> -Copyright 2015 Jack Humbert -Copyright 2018 Takuya Urakawa <Twitter:@hsgw> - -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 - -#define RGBLIGHT_ANIMATIONS diff --git a/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c b/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c index a9a9f71f4d..32289c44db 100644 --- a/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c +++ b/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c @@ -24,10 +24,6 @@ enum CUSTOM_KEYCODES {    RGB_TYPE,  }; -// Fillers to make layering more clear -#define ______ KC_TRNS -#define XXXXXX KC_NO -  const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {    [BASE] = LAYOUT( @@ -38,20 +34,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {                        MO(META),KC_LALT, KC_ZKHK, KC_BSPC, KC_SPC,  KC_ENT, KC_BSPC, KC_MHEN, KC_KANA, MO(META)    ), -    [META] = LAYOUT(      MO(CONF),KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_INS, -    ______,  KC_CAPS, ______,  KC_UP,   ______,  ______,  ______,  ______,  ______,  ______,  KC_SLCK, KC_PSCR, KC_HOME, KC_END, -    ______,           KC_LEFT, KC_DOWN, KC_RGHT, ______,  ______,  ______,  ______,  ______,  KC_PAUS, KC_PGUP, KC_UP,   KC_PGDN, -    ______,           ______,  ______,  ______,  ______,  ______,  ______,  ______,  ______,  ______,  KC_LEFT, KC_DOWN, KC_RGHT, -                      ______,  ______,  KC_RGUI, KC_DEL,  KC_ENT,  ______,  KC_DEL,  KC_HENK, KC_LGUI, ______ +    _______, KC_CAPS, _______, KC_UP,   _______, _______, _______, _______, _______, _______, KC_SLCK, KC_PSCR, KC_HOME, KC_END, +    _______,          KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_PAUS, KC_PGUP, KC_UP,   KC_PGDN, +    _______,          _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, +                      _______, _______, KC_RGUI, KC_DEL,  KC_ENT,  _______, KC_DEL,  KC_HENK, KC_LGUI, _______    ), - [CONF] = LAYOUT( -    ______,  RGB_TYPE,RGB_MOD,  RGB_VAI, RGB_HUI, RGB_HUI,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX, -    RGB_RST, RGB_TOG, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_HUD,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX, -    XXXXXX,           XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX, -    XXXXXX,           XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX, -                      XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,   XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX,  XXXXXX + +  [CONF] = LAYOUT( +    _______, RGB_TYPE,RGB_MOD,  RGB_VAI, RGB_HUI, RGB_HUI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, +    RGB_RST, RGB_TOG, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_HUD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, +    XXXXXXX,          XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, +    XXXXXXX,          XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, +                      XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX    )  }; diff --git a/keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk b/keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk deleted file mode 100644 index 97154be636..0000000000 --- a/keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk +++ /dev/null @@ -1,18 +0,0 @@ -BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = no       # Mouse keys(+4700) -EXTRAKEY_ENABLE = no       # Audio control and System control(+450) -CONSOLE_ENABLE = no         # Console for debug(+400) -COMMAND_ENABLE = no        # Commands for debug and configuration -NKRO_ENABLE = no -BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality -AUDIO_ENABLE = no           # Audio output -RGBLIGHT_ENABLE = yes        # Enable WS2812 RGB underlight.  -SWAP_HANDS_ENABLE = no        # Enable one-hand typing - -# ergoinu configs -DISABLE_PROMICRO_LEDs = yes - -# Uncomment these for debugging -# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) -# $(info -- OPT_DEFS=$(OPT_DEFS)) -# $(info ) diff --git a/keyboards/dm9records/ergoinu/matrix.c b/keyboards/dm9records/ergoinu/matrix.c deleted file mode 100644 index b1c58f88fe..0000000000 --- a/keyboards/dm9records/ergoinu/matrix.c +++ /dev/null @@ -1,292 +0,0 @@ -/* -Copyright 2012 Jun Wako <wakojun@gmail.com> - -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/>. -*/ - -/* - * scan matrix - */ -#include <stdint.h> -#include <stdbool.h> -#include <avr/io.h> -#include <avr/wdt.h> -#include <avr/interrupt.h> -#include <util/delay.h> -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "quantum.h" - -#include "serial.h" - -#ifndef DEBOUNCE -#  define DEBOUNCE	5 -#endif - -#define ERROR_DISCONNECT_COUNT 5 - -static uint8_t debouncing = DEBOUNCE; -static const int ROWS_PER_HAND = MATRIX_ROWS/2; -static uint8_t error_count = 0; -uint8_t is_master = 0 ; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -static matrix_row_t read_cols(void); -static void init_cols(void); -static void unselect_rows(void); -static void select_row(uint8_t row); -static uint8_t matrix_master_scan(void); - - -__attribute__ ((weak)) -void matrix_init_kb(void) { -  matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -  matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -  return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) { -  return MATRIX_COLS; -} - -void matrix_init(void) { -  debug_enable = true; -  debug_matrix = true; -  debug_mouse = true; -  // initialize row and col -  unselect_rows(); -  init_cols(); - -  setPinOutput(B0); -  setPinOutput(D5); - -  #ifdef DISABLE_PROMICRO_LEDs -    writePinHigh(B0); -    writePinHigh(D5); -  #endif - -  // initialize matrix state: all keys off -  for (uint8_t i=0; i < MATRIX_ROWS; i++) { -      matrix[i] = 0; -      matrix_debouncing[i] = 0; -  } - -  is_master = has_usb(); - -  matrix_init_quantum(); -} - -uint8_t _matrix_scan(void) { -  // Right hand is stored after the left in the matirx so, we need to offset it -  int offset = isLeftHand ? 0 : (ROWS_PER_HAND); - -  for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { -      select_row(i); -      _delay_us(30);  // without this wait read unstable value. -      matrix_row_t cols = read_cols(); -      if (matrix_debouncing[i+offset] != cols) { -          matrix_debouncing[i+offset] = cols; -          debouncing = DEBOUNCE; -      } -      unselect_rows(); -  } - -  if (debouncing) { -      if (--debouncing) { -          _delay_ms(1); -      } else { -          for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { -              matrix[i+offset] = matrix_debouncing[i+offset]; -          } -      } -  } - -  return 1; -} - -int serial_transaction(void) { -  int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; -  int ret=serial_update_buffers(); -  if (ret ) { -#ifndef DISABLE_PROMICRO_LEDs -      if(ret==2) writePinLow(B0); -#endif -      return 1; -  } -#ifndef DISABLE_PROMICRO_LEDs -  writePinHigh(B0); -#endif -  for (int i = 0; i < ROWS_PER_HAND; ++i) { -      matrix[slaveOffset+i] = serial_slave_buffer[i]; -  } -  return 0; -} - -uint8_t matrix_scan(void) { -  if (is_master) { -    matrix_master_scan(); -  }else{ -    matrix_slave_scan(); - -    int offset = (isLeftHand) ? ROWS_PER_HAND : 0; - -    for (int i = 0; i < ROWS_PER_HAND; ++i) { -      matrix[offset+i] = serial_master_buffer[i]; -    } - -    matrix_scan_quantum(); -  } -  return 1; -} - - -uint8_t matrix_master_scan(void) { - -  int ret = _matrix_scan(); - -  int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -  for (int i = 0; i < ROWS_PER_HAND; ++i) { -    serial_master_buffer[i] = matrix[offset+i]; -  } - -  if( serial_transaction() ) { -#ifndef DISABLE_PROMICRO_LEDs -    // turn on the indicator led when halves are disconnected -    writePinLow(D5); -#endif - -    error_count++; - -    if (error_count > ERROR_DISCONNECT_COUNT) { -        // reset other half if disconnected -      int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; -      for (int i = 0; i < ROWS_PER_HAND; ++i) { -          matrix[slaveOffset+i] = 0; -      } -    } -  } else { -#ifndef DISABLE_PROMICRO_LEDs -    // turn off the indicator led on no error -    writePinHigh(D5); -#endif -    error_count = 0; -  } -  matrix_scan_quantum(); -  return ret; -} - -void matrix_slave_scan(void) { -  _matrix_scan(); - -  int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -  for (int i = 0; i < ROWS_PER_HAND; ++i) { -    serial_slave_buffer[i] = matrix[offset+i]; -  } -} - -bool matrix_is_modified(void) -{ -  if (debouncing) return false; -  return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -  return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -  return matrix[row]; -} - -void matrix_print(void) -{ -  print("\nr/c 0123456789ABCDEF\n"); -  for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -    print_hex8(row); print(": "); -    print_bin_reverse16(matrix_get_row(row)); -    print("\n"); -  } -} - -uint8_t matrix_key_count(void) -{ -  uint8_t count = 0; -  for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -    count += bitpop16(matrix[i]); -  } -  return count; -} - -static void  init_cols(void) -{ -  for(int x = 0; x < MATRIX_COLS; x++) { -    _SFR_IO8((col_pins[x] >> 4) + 1) &=  ~_BV(col_pins[x] & 0xF); -    _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF); -  } -} - -static matrix_row_t read_cols(void) -{ -  matrix_row_t result = 0; -  for(int x = 0; x < MATRIX_COLS; x++) { -    result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x); -  } -  return result; -} - -static void unselect_rows(void) -{ -  for(int x = 0; x < ROWS_PER_HAND; x++) { -    _SFR_IO8((row_pins[x] >> 4) + 1) &=  ~_BV(row_pins[x] & 0xF); -    _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF); -  } -} - -static void select_row(uint8_t row) -{ -  _SFR_IO8((row_pins[row] >> 4) + 1) |=  _BV(row_pins[row] & 0xF); -  _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF); -} diff --git a/keyboards/dm9records/ergoinu/post_rules.mk b/keyboards/dm9records/ergoinu/post_rules.mk deleted file mode 100644 index 02aa48104c..0000000000 --- a/keyboards/dm9records/ergoinu/post_rules.mk +++ /dev/null @@ -1,9 +0,0 @@ -ifneq ($(strip $(ERGOINU)),) -  ifeq ($(findstring promicroled, $(ERGOINU)), promicroled) -    DISABLE_PROMICRO_LEDs = no -  endif -endif - -ifeq ($(strip $(DISABLE_PROMICRO_LEDs)), yes) -  OPT_DEFS += -DDISABLE_PROMICRO_LEDs -endif diff --git a/keyboards/dm9records/ergoinu/readme.md b/keyboards/dm9records/ergoinu/readme.md index de0a1c6c97..45f91dbac2 100644 --- a/keyboards/dm9records/ergoinu/readme.md +++ b/keyboards/dm9records/ergoinu/readme.md @@ -1,13 +1,12 @@ -ErgoInu -=== +# ErgoInu    An (Not Portable But Small) Ergonomic Split Keyboard. -Keyboard Maintainer: [hsgw](https://github.com/hsgw/)   [twitter](https://twitter.com/hsgw)   -Hardware Supported: Pro Micro   -Hardware Availability & Repository: [https://github.com/hsgw/ergoinu](https://github.com/hsgw/ergoinu)   +* Keyboard Maintainer: [hsgw](https://github.com/hsgw/)   [twitter](https://twitter.com/hsgw) +* Hardware Supported: Pro Micro +* Hardware Availability & Repository: [https://github.com/hsgw/ergoinu](https://github.com/hsgw/ergoinu)  Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/dm9records/ergoinu/rules.mk b/keyboards/dm9records/ergoinu/rules.mk index 0a634ee794..aba3644c9e 100644 --- a/keyboards/dm9records/ergoinu/rules.mk +++ b/keyboards/dm9records/ergoinu/rules.mk @@ -7,20 +7,14 @@ BOOTLOADER = caterina  # Build Options  #   change yes to no to disable  # -BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = no       # Mouse keys -EXTRAKEY_ENABLE = no       # Audio control and System control +BOOTMAGIC_ENABLE = yes      # Enable Bootmagic Lite +MOUSEKEY_ENABLE = yes       # Mouse keys +EXTRAKEY_ENABLE = yes       # Audio control and System control  CONSOLE_ENABLE = no         # Console for debug -COMMAND_ENABLE = no        # Commands for debug and configuration +COMMAND_ENABLE = no         # Commands for debug and configuration  NKRO_ENABLE = no            # Enable N-Key Rollover -BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow  AUDIO_ENABLE = no           # Audio output -RGBLIGHT_ENABLE = no       # Enable WS2812 RGB underlight. -SUBPROJECT_rev1 = no -USE_I2C = no               # i2c is not supported -CUSTOM_MATRIX = yes -SRC += matrix.c serial.c split_util.c - -# ergoinu configs -DISABLE_PROMICRO_LEDs = yes +SPLIT_KEYBOARD = yes diff --git a/keyboards/dm9records/ergoinu/serial.c b/keyboards/dm9records/ergoinu/serial.c deleted file mode 100644 index 5919415877..0000000000 --- a/keyboards/dm9records/ergoinu/serial.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include <avr/io.h> -#include <avr/interrupt.h> -#include <util/delay.h> -#include <stdbool.h> -#include "serial.h" - -#ifdef USE_SERIAL - -#define _delay_sub_us(x)    __builtin_avr_delay_cycles(x) - -// Serial pulse period in microseconds. -#define SELECT_SERIAL_SPEED 1 -#if SELECT_SERIAL_SPEED == 0 -  // Very High speed -  #define SERIAL_DELAY 4             // micro sec -  #define READ_WRITE_START_ADJUST 30 // cycles -  #define READ_WRITE_WIDTH_ADJUST 10 // cycles -#elif SELECT_SERIAL_SPEED == 1 -  // High speed -  #define SERIAL_DELAY 6             // micro sec -  #define READ_WRITE_START_ADJUST 23 // cycles -  #define READ_WRITE_WIDTH_ADJUST 10 // cycles -#elif SELECT_SERIAL_SPEED == 2 -  // Middle speed -  #define SERIAL_DELAY 12            // micro sec -  #define READ_WRITE_START_ADJUST 25 // cycles -  #define READ_WRITE_WIDTH_ADJUST 10 // cycles -#elif SELECT_SERIAL_SPEED == 3 -  // Low speed -  #define SERIAL_DELAY 24            // micro sec -  #define READ_WRITE_START_ADJUST 25 // cycles -  #define READ_WRITE_WIDTH_ADJUST 10 // cycles -#elif SELECT_SERIAL_SPEED == 4 -  // Very Low speed -  #define SERIAL_DELAY 50            // micro sec -  #define READ_WRITE_START_ADJUST 25 // cycles -  #define READ_WRITE_WIDTH_ADJUST 10 // cycles -#else -#error Illegal Serial Speed -#endif - - -#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) -#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) - -#define SLAVE_INT_WIDTH 1 -#define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; - -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; - -inline static -void serial_delay(void) { -  _delay_us(SERIAL_DELAY); -} - -inline static -void serial_delay_half1(void) { -  _delay_us(SERIAL_DELAY_HALF1); -} - -inline static -void serial_delay_half2(void) { -  _delay_us(SERIAL_DELAY_HALF2); -} - -inline static -void serial_output(void) { -  SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static -void serial_input_with_pullup(void) { -  SERIAL_PIN_DDR  &= ~SERIAL_PIN_MASK; -  SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static -uint8_t serial_read_pin(void) { -  return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static -void serial_low(void) { -  SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static -void serial_high(void) { -  SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void serial_master_init(void) { -  serial_output(); -  serial_high(); -} - -void serial_slave_init(void) { -  serial_input_with_pullup(); - -#if SERIAL_PIN_MASK == _BV(PD0) -  // Enable INT0 -  EIMSK |= _BV(INT0); -  // Trigger on falling edge of INT0 -  EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -#elif SERIAL_PIN_MASK == _BV(PD2) -  // Enable INT2 -  EIMSK |= _BV(INT2); -  // Trigger on falling edge of INT2 -  EICRA &= ~(_BV(ISC20) | _BV(ISC21)); -#else - #error unknown SERIAL_PIN_MASK value -#endif -} - -// Used by the sender to synchronize timing with the reciver. -static -void sync_recv(void) { -  for (int i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { -  } -  // This shouldn't hang if the slave disconnects because the -  // serial line will float to high if the slave does disconnect. -  while (!serial_read_pin()); -} - -// Used by the reciver to send a synchronization signal to the sender. -static -void sync_send(void) { -  serial_low(); -  serial_delay(); -  serial_high(); -} - -// Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { -  uint8_t byte = 0; -  _delay_sub_us(READ_WRITE_START_ADJUST); -  for ( uint8_t i = 0; i < 8; ++i) { -    serial_delay_half1();   // read the middle of pulses -    byte = (byte << 1) | serial_read_pin(); -    _delay_sub_us(READ_WRITE_WIDTH_ADJUST); -    serial_delay_half2(); -  } -  return byte; -} - -// Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { -  uint8_t b = 1<<7; -  while( b ) { -    if(data & b) { -      serial_high(); -    } else { -      serial_low(); -    } -    b >>= 1; -    serial_delay(); -  } -  serial_low(); // sync_send() / senc_recv() need raise edge -} - -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { -  serial_output(); - -  // slave send phase -  uint8_t checksum = 0; -  for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { -    sync_send(); -    serial_write_byte(serial_slave_buffer[i]); -    checksum += serial_slave_buffer[i]; -  } -  sync_send(); -  serial_write_byte(checksum); - -  // slave switch to input -  sync_send(); //0 -  serial_delay_half1(); //1 -  serial_low();         //2 -  serial_input_with_pullup(); //2 -  serial_delay_half1(); //3 - -  // slave recive phase -  uint8_t checksum_computed = 0; -  for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { -    sync_recv(); -    serial_master_buffer[i] = serial_read_byte(); -    checksum_computed += serial_master_buffer[i]; -  } -  sync_recv(); -  uint8_t checksum_received = serial_read_byte(); - -  if ( checksum_computed != checksum_received ) { -    status |= SLAVE_DATA_CORRUPT; -  } else { -    status &= ~SLAVE_DATA_CORRUPT; -  } - -  sync_recv(); //weit master output to high -} - -inline -bool serial_slave_DATA_CORRUPT(void) { -  return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. -// -// Returns: -// 0 => no error -// 1 => slave did not respond -// 2 => checksum error -int serial_update_buffers(void) { -  // this code is very time dependent, so we need to disable interrupts -  cli(); - -  // signal to the slave that we want to start a transaction -  serial_output(); -  serial_low(); -  _delay_us(SLAVE_INT_WIDTH); - -  // wait for the slaves response -  serial_input_with_pullup(); -  _delay_us(SLAVE_INT_RESPONSE_TIME); - -  // check if the slave is present -  if (serial_read_pin()) { -    // slave failed to pull the line low, assume not present -    serial_output(); -    serial_high(); -    sei(); -    return 1; -  } - -  // master recive phase -  // if the slave is present syncronize with it - -  uint8_t checksum_computed = 0; -  // receive data from the slave -  for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { -    sync_recv(); -    serial_slave_buffer[i] = serial_read_byte(); -    checksum_computed += serial_slave_buffer[i]; -  } -  sync_recv(); -  uint8_t checksum_received = serial_read_byte(); - -  if (checksum_computed != checksum_received) { -    serial_output(); -    serial_high(); -    sei(); -    return 2; -  } - -  // master switch to output -  sync_recv(); //0 -  serial_delay();  //1 -  serial_low();    //3 -  serial_output(); // 3 -  serial_delay_half1(); //4 - -  // master send phase -  uint8_t checksum = 0; - -  for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { -    sync_send(); -    serial_write_byte(serial_master_buffer[i]); -    checksum += serial_master_buffer[i]; -  } -  sync_send(); -  serial_write_byte(checksum); - -  // always, release the line when not in use -  sync_send(); - -  sei(); -  return 0; -} - -#endif diff --git a/keyboards/dm9records/ergoinu/serial.h b/keyboards/dm9records/ergoinu/serial.h deleted file mode 100644 index 67cf06ac6b..0000000000 --- a/keyboards/dm9records/ergoinu/serial.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include <stdbool.h> - -// //////////////////////////////////////////// -// Need Soft Serial defines in serial_config.h -// //////////////////////////////////////////// -// ex. -//  #define SERIAL_PIN_DDR DDRD -//  #define SERIAL_PIN_PORT PORTD -//  #define SERIAL_PIN_INPUT PIND -//  #define SERIAL_PIN_MASK _BV(PD?)   ?=0,2 -//  #define SERIAL_PIN_INTERRUPT INT?_vect  ?=0,2 -//  #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -//  #define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 - -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); diff --git a/keyboards/dm9records/ergoinu/serial_config.h b/keyboards/dm9records/ergoinu/serial_config.h deleted file mode 100644 index a16db684ca..0000000000 --- a/keyboards/dm9records/ergoinu/serial_config.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -/* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 diff --git a/keyboards/dm9records/ergoinu/split_util.c b/keyboards/dm9records/ergoinu/split_util.c deleted file mode 100644 index 0cbc2c69c4..0000000000 --- a/keyboards/dm9records/ergoinu/split_util.c +++ /dev/null @@ -1,56 +0,0 @@ -#include <avr/io.h> -#include <avr/wdt.h> -#include <avr/power.h> -#include <avr/interrupt.h> -#include <util/delay.h> -#include <avr/eeprom.h> -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" - -#include "serial.h" - -volatile bool isLeftHand = true; - -static void setup_handedness(void) { -  #ifdef EE_HANDS -    isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); -  #else -    // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c -    #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) -      isLeftHand = !has_usb(); -    #else -      isLeftHand = has_usb(); -    #endif -  #endif -} - -static void keyboard_master_setup(void) { -  serial_master_init(); -} - -static void keyboard_slave_setup(void) { -  serial_slave_init(); -} - -bool has_usb(void) { -   USBCON |= (1 << OTGPADE); //enables VBUS pad -   _delay_us(5); -   return (USBSTA & (1<<VBUS));  //checks state of VBUS -} - -void split_keyboard_setup(void) { -   setup_handedness(); - -   if (has_usb()) { -      keyboard_master_setup(); -   } else { -      keyboard_slave_setup(); -   } -   sei(); -} - -// this code runs before the usb and keyboard is initialized -void matrix_setup(void) { -    split_keyboard_setup(); -} diff --git a/keyboards/dm9records/ergoinu/split_util.h b/keyboards/dm9records/ergoinu/split_util.h deleted file mode 100644 index 11cfd5455a..0000000000 --- a/keyboards/dm9records/ergoinu/split_util.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include <stdbool.h> -#include "eeconfig.h" - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool has_usb(void); diff --git a/keyboards/duck/jetfire/matrix.c b/keyboards/duck/jetfire/matrix.c index 2dd94a72ac..729fa6dd14 100644 --- a/keyboards/duck/jetfire/matrix.c +++ b/keyboards/duck/jetfire/matrix.c @@ -116,12 +116,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h b/keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h index a7d95c51a9..d70f188178 100644 --- a/keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h +++ b/keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h @@ -21,7 +21,7 @@  #pragma once -#define CH_CFG_ST_FREQUENCY 10000 +#define CH_CFG_ST_FREQUENCY 1000  #define CH_CFG_ST_TIMEDELTA 0 diff --git a/keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h b/keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h index 6d67aa96aa..a24c1cee12 100644 --- a/keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h +++ b/keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h @@ -85,7 +85,7 @@   */  #define STM32_GPT_USE_TIM1                  FALSE  #define STM32_GPT_USE_TIM2                  FALSE -#define STM32_GPT_USE_TIM3                  FALSE +#define STM32_GPT_USE_TIM3                  TRUE  #define STM32_GPT_USE_TIM14                 FALSE  #define STM32_GPT_TIM1_IRQ_PRIORITY         2  #define STM32_GPT_TIM2_IRQ_PRIORITY         2 diff --git a/keyboards/durgod/dgk6x/config.h b/keyboards/durgod/dgk6x/config.h index 92673e5c24..a15ed86650 100644 --- a/keyboards/durgod/dgk6x/config.h +++ b/keyboards/durgod/dgk6x/config.h @@ -22,6 +22,9 @@  #define VENDOR_ID       0xD60D  #define MANUFACTURER    Hoksi Technology +#define USB_POLLING_INTERVAL_MS 1 +#define WAIT_US_TIMER           GPTD3 +  /* COL2ROW, ROW2COL*/  #define DIODE_DIRECTION ROW2COL diff --git a/keyboards/durgod/dgk6x/halconf.h b/keyboards/durgod/dgk6x/halconf.h index 1772f8e410..9c1c6e5280 100644 --- a/keyboards/durgod/dgk6x/halconf.h +++ b/keyboards/durgod/dgk6x/halconf.h @@ -19,4 +19,7 @@  #ifdef RGB_MATRIX_ENABLE  #define HAL_USE_I2C TRUE  #endif + +#define HAL_USE_GPT TRUE +  #include_next <halconf.h> diff --git a/keyboards/durgod/k3x0/config.h b/keyboards/durgod/k3x0/config.h index ef73a71016..af543bb970 100644 --- a/keyboards/durgod/k3x0/config.h +++ b/keyboards/durgod/k3x0/config.h @@ -23,6 +23,9 @@  #define VENDOR_ID       0xD60D  #define MANUFACTURER    Hoksi Technology +#define USB_POLLING_INTERVAL_MS 1 +#define WAIT_US_TIMER           GPTD3 +  /* key matrix size (rows in specific keyboard variant) */  #define MATRIX_COLS 16 diff --git a/keyboards/durgod/k3x0/halconf.h b/keyboards/durgod/k3x0/halconf.h index fa20fe30a9..d2a9d8c7c0 100644 --- a/keyboards/durgod/k3x0/halconf.h +++ b/keyboards/durgod/k3x0/halconf.h @@ -19,4 +19,6 @@  #define HAL_USE_PAL                 TRUE  #define PAL_USE_CALLBACKS           TRUE +#define HAL_USE_GPT                 TRUE +  #include_next <halconf.h> diff --git a/keyboards/ergodox_stm32/matrix.c b/keyboards/ergodox_stm32/matrix.c index 383bf9790a..094d4a9e0f 100644 --- a/keyboards/ergodox_stm32/matrix.c +++ b/keyboards/ergodox_stm32/matrix.c @@ -119,10 +119,6 @@ uint8_t matrix_scan(void) {    return 0;  } -bool matrix_is_modified(void) { -  return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col) {    return (matrix[row] & (1 << col)); diff --git a/keyboards/ergotaco/matrix.c b/keyboards/ergotaco/matrix.c index e5af1c27fd..16300a7e4f 100644 --- a/keyboards/ergotaco/matrix.c +++ b/keyboards/ergotaco/matrix.c @@ -199,11 +199,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) // deprecated and evidently not called. -{ -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/gboards/gergoplex/matrix.c b/keyboards/gboards/gergoplex/matrix.c index 716390241a..a075b85725 100644 --- a/keyboards/gboards/gergoplex/matrix.c +++ b/keyboards/gboards/gergoplex/matrix.c @@ -152,11 +152,6 @@ uint8_t matrix_scan(void) {      return 1;  } -bool matrix_is_modified(void)  // deprecated and evidently not called. -{ -    return true; -} -  inline bool         matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & ((matrix_row_t)1 << col)); }  inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } diff --git a/keyboards/georgi/matrix.c b/keyboards/georgi/matrix.c index 438412102b..7d635ad8d7 100644 --- a/keyboards/georgi/matrix.c +++ b/keyboards/georgi/matrix.c @@ -220,11 +220,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) // deprecated and evidently not called. -{ -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/gergo/matrix.c b/keyboards/gergo/matrix.c index 655e729356..443e97132b 100644 --- a/keyboards/gergo/matrix.c +++ b/keyboards/gergo/matrix.c @@ -273,11 +273,6 @@ uint8_t matrix_scan(void) {      return 1;  } -bool matrix_is_modified(void) // deprecated and evidently not called. -{ -    return true; -} -  inline bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & ((matrix_row_t)1 << col)); }  inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } diff --git a/keyboards/gmmk/pro/iso/keymaps/vitoni/config.h b/keyboards/gmmk/pro/iso/keymaps/vitoni/config.h new file mode 100644 index 0000000000..fd8f1d6859 --- /dev/null +++ b/keyboards/gmmk/pro/iso/keymaps/vitoni/config.h @@ -0,0 +1,20 @@ +// Copyright 2021 Victor Toni (@vitoni) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#if defined(RGB_MATRIX_ENABLE) +    #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR +     // number of milliseconds to wait until turning off RGB automatically +    #define RGB_DISABLE_TIMEOUT 300000 // 300 seconds / 5 min +    // start fading out before getting disabled +    // fading out is timed (depending on the rgb_matrix_config.speed) to have finished before reaching RGB_DISABLE_TIMEOUT +    #define RGB_DISABLE_WITH_FADE_OUT +    #define RGB_DISABLE_WHEN_USB_SUSPENDED +    // number of milliseconds to wait until activating RGB idle effects +    #define RGB_IDLE_TIMEOUT 4500 // 4.5 seconds +    // activate breathe effect when idle +    #define RGB_IDLE_BREATHE +    // fade in when we have been suspended +    #define RGB_FADE_IN +#endif diff --git a/keyboards/gmmk/pro/iso/keymaps/vitoni/keymap.c b/keyboards/gmmk/pro/iso/keymaps/vitoni/keymap.c new file mode 100644 index 0000000000..d5b64c153a --- /dev/null +++ b/keyboards/gmmk/pro/iso/keymaps/vitoni/keymap.c @@ -0,0 +1,148 @@ +// Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>, +// Copyright 2021 Victor Toni (@vitoni) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +#include "vitoni.h" + +enum layer_names { +    _BASE, +    _MOV, +    _RGB +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +//      ESC      F1       F2       F3       F4       F5       F6       F7       F8       F9       F10      F11      F12	     Prt           Rotary(Mute) +//      ~        1        2        3        4        5        6        7        8        9        0         -       (=)	     BackSpc           Del +//      Tab      Q        W        E        R        T        Y        U        I        O        P        [        ]                          PgUp +//      Caps     A        S        D        F        G        H        J        K        L        ;        "        #        Enter             PgDn +//      Sh_L     /        Z        X        C        V        B        N        M        ,        .        ?                 Sh_R     Up       End +//      Ct_L     Win_L    Alt_L                               SPACE                               Alt_R    FN       Ct_R     Left     Down     Right + + +    // +    // This keyboard defaults to 6KRO instead of NKRO for compatibility reasons (some KVMs and BIOSes are incompatible with NKRO). +    // Since this is, among other things, a "gaming" keyboard, a key combination to enable NKRO on the fly is provided for convenience. +    // Press CAPS+N to toggle between 6KRO and NKRO. This setting is persisted to the EEPROM and thus persists between restarts. +    [_BASE] = LAYOUT( +        KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_PSCR,          KC_MUTE, +        KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,          KC_DEL, +        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC,                   KC_PGUP, +        MO(_MOV), KC_A,   KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,           KC_PGDN, +        KC_LSFT, KC_NUBS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END, +        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, TG(_RGB),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT +    ), + +    [_MOV] = LAYOUT( +        RESET,   KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MSTP, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______,          _______, +        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          KC_INS, +        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, +        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______, +        _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______,          _______, KC_PGUP, _______, +        _______, _______, _______,                            _______,                            _______, _______, _______, KC_HOME, KC_PGDN, KC_END +    ), + +    [_RGB] = LAYOUT( +        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______, +        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET,            RGB_MOD, +        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                   RGB_RMOD, +        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG,          RGB_SPI, +        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______, RGB_SAI, RGB_SPD, +        _______, _______, _______,                            _______,                            _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI +    ), + +}; +// clang-format on + +#if defined(ENCODER_ENABLE) +bool encoder_update_user(uint8_t index, bool clockwise) { +    switch (get_highest_layer(layer_state)) { +        case _MOV: +            if (clockwise) { +                tap_code16(C(KC_TAB)); +            } else { +                tap_code16(S(C(KC_TAB))); +            } +            break; +#if defined(RGB_MATRIX_ENABLE) +        case _RGB: +            if (clockwise) { +                rgb_matrix_increase_val_noeeprom(); +            } else { +                rgb_matrix_decrease_val_noeeprom(); +            } +            break; +#endif // RGB_MATRIX_ENABLE +        default: +            if (clockwise) { +                tap_code(KC_VOLU); +            } else { +                tap_code(KC_VOLD); +            } +            break; +    } +    return true; +} +#endif // ENCODER_ENABLE + +#if defined(RGB_MATRIX_ENABLE) +/* +* Set up default RGB color. +*/ +void rgb_matrix_set_default_color(void) { +    rgb_matrix_sethsv_noeeprom_user(HSV_CHARTREUSE); +} + +/* +* Set up RGB defaults. +*/ +void rgb_matrix_configure_default_settings(void) { +    rgb_matrix_set_default_color(); +} + +void keyboard_post_init_user(void) { +    rgb_matrix_enable_noeeprom(); +    rgb_matrix_configure_default_settings(); +} + +/* +* Use RGB underglow to indicate specific layers. +*/ +layer_state_t layer_state_set_user(layer_state_t state) { +    switch (get_highest_layer(state)) { +        case _MOV: +            rgb_matrix_sethsv_noeeprom_user(HSV_SPRINGGREEN); +            break; +        case _RGB: +            rgb_matrix_sethsv_noeeprom_user(HSV_GREEN); +            break; +        default: // for any other layer +            rgb_matrix_set_default_color(); +            break; +    } +    return state; +} + +void matrix_scan_user(void) { +    matrix_scan_user_rgb(); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { +    if (!process_record_user_rgb(keycode, record)) { +        return false; +    } + +    switch (keycode) { +        case RESET:  // when activating RESET mode for flashing +            if (record->event.pressed) { +                rgb_matrix_set_color_all(63, 0, 0); +                rgb_matrix_driver.flush(); +            } +            return true; +    } +    return true; // Process all other keycodes normally +} +#endif // RGB_MATRIX_ENABLE diff --git a/keyboards/gmmk/pro/iso/keymaps/vitoni/readme.adoc b/keyboards/gmmk/pro/iso/keymaps/vitoni/readme.adoc new file mode 100644 index 0000000000..38a74a568b --- /dev/null +++ b/keyboards/gmmk/pro/iso/keymaps/vitoni/readme.adoc @@ -0,0 +1,104 @@ += ViToni's keymap for GMMK Pro ISO + +== Layout +Based on the stock layout but making use of CAPS as FN similar to laptop keyboards. +This frees up the left row for other uses (although not remapped yet). +Since both Delete and Insert are used for coding they are part of the CAPS layer as well. + +The differences are as follows: + +=== Layer 0 (`_BASE`) +Mostly stock + CAPS goes to layer `_MOV`. +FN toggles the layer `_RGB`. + +=== Layer 1 (`_MOV`), accessed by pressing `CAPS` on layer `_BASE` +[%header] +|=== +| Key / Action          | Mapped to +| ESC                   | _RESET_ +| F1                    | KC_MYCM +| F2                    | KC_WHOM +| F3                    | KC_CALC +| F4                    | KC_MSEL +| F5                    | KC_MPRV +| F6                    | KC_MPLY +| F7                    | KC_MSTP +| F8                    | KC_MNXT +| F9                    | KC_MUTE +| F10                   | KC_VOLD +| F11                   | KC_VOLU +| N                     | NK_TOGG +| Delete                | Insert +| Left                  | Home +| Right                 | End +| Up                    | PgUp +| Down                  | PgDn +|=== + +=== Layer 2 (`_RGB`), accessed by pressing `FN` on layer `_BASE` +Revamped the stock FN layer to focus on RGB only. + +[%header] +|=== +| Key / Action          | Mapped to +| Knob clockwise        | Value/Brightness up +| Knob anti-clockwise   | Value/Brightness down +| Backspace             | _RESET_ +| Enter                 | RGB_TOG +| Del                   | RGB_MOD +| PgUp                  | RGB_RMOD +| PgDn                  | RGB_SPI +| End                   | RGB_SPD +| Left                  | RGB_HUD +| Right                 | RGB_HUI +| Up                    | RGB_SAI +| Down                  | RGB_SAD +|=== + +No other changes have been made. + +== RGB light + +The code customizing RGB light usage is decribed here: + +* link:../../../../../../users/vitoni/readme.adoc[/users/vitoni/readme.adoc] + +When using  `RGB_DISABLE_TIMEOUT` addtional options are available: + +* `RGB_FADE_IN` makes the RGB lights fade in instead of setting the value/brightness to 100% (implicitly due to HSV including the brightness) when resuming after RGB lights have been turned off. +Fade in occurs when the keyboard is initialized and when the RGB brightness has been changed (e.g. suspending, fade out, etc.). +* `RGB_DISABLE_WITH_FADE_OUT` activates fade out before the keyboard is disabled by `RGB_DISABLE_TIMEOUT`. + +Parameters used to define the behavior are: +[%header] +|=== +|Key | Default | Description + +| RGB_MATRIX_MAXIMUM_BRIGHTNESS +| 200 (<= UNIT8_MAX) +| Maximum assumed value for brightness. +Used to calculate lead time for fade out before suspend timeout. + +|=== + +`RGB_IDLE_TIMEOUT` enables fading out after being idle for the defined time and allows +* `RGB_IDLE_BREATHE` also activates a brethe effect while idling. + +[%header] +|=== +|Key | Default | Description + +|RGB_IDLE_TIMEOUT +|4500 +|Time in milliseconds without activity before considered to be idle. + +|RGB_IDLE_MINIMUM_BRIGHTNESS +|`RGB_MATRIX_MAXIMUM_BRIGHTNESS` / 5 +|Brightness value RGB is dimmed to when starting to idle. + +When breathing used as the lower bound of the brightness value. + +|RGB_IDLE_MAXIMUM_BRIGHTNESS +|`RGB_MATRIX_MAXIMUM_BRIGHTNESS` * 2/5 +|Upper bound of brightness value of the RGB light while breathing. + +|=== diff --git a/keyboards/handwired/dactyl/matrix.c b/keyboards/handwired/dactyl/matrix.c index a21cd08e14..a70e8c5aca 100644 --- a/keyboards/handwired/dactyl/matrix.c +++ b/keyboards/handwired/dactyl/matrix.c @@ -281,14 +281,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) // deprecated and evidently not called. -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/handwired/frenchdev/matrix.c b/keyboards/handwired/frenchdev/matrix.c index 5ab254a6f9..a043f78538 100644 --- a/keyboards/handwired/frenchdev/matrix.c +++ b/keyboards/handwired/frenchdev/matrix.c @@ -174,12 +174,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/handwired/not_so_minidox/config.h b/keyboards/handwired/not_so_minidox/config.h index de9286eda5..177552e2a6 100644 --- a/keyboards/handwired/not_so_minidox/config.h +++ b/keyboards/handwired/not_so_minidox/config.h @@ -40,6 +40,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define USE_SERIAL +/* + * 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 EE_HANDS  #define MASTER_LEFT diff --git a/keyboards/handwired/not_so_minidox/i2c.c b/keyboards/handwired/not_so_minidox/i2c.c deleted file mode 100644 index 084c890c40..0000000000 --- a/keyboards/handwired/not_so_minidox/i2c.c +++ /dev/null @@ -1,162 +0,0 @@ -#include <util/twi.h> -#include <avr/io.h> -#include <stdlib.h> -#include <avr/interrupt.h> -#include <util/twi.h> -#include <stdbool.h> -#include "i2c.h" - -#ifdef USE_I2C - -// Limits the amount of we wait for any one i2c transaction. -// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is -// 9 bits, a single transaction will take around 90μs to complete. -// -// (F_CPU/SCL_CLOCK)  =>  # of μC cycles to transfer a bit -// poll loop takes at least 8 clock cycles to execute -#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 - -#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) - -volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -static volatile uint8_t slave_buffer_pos; -static volatile bool slave_has_register_set = false; - -// Wait for an i2c operation to finish -inline static -void i2c_delay(void) { -  uint16_t lim = 0; -  while(!(TWCR & (1<<TWINT)) && lim < I2C_LOOP_TIMEOUT) -    lim++; - -  // easier way, but will wait slightly longer -  // _delay_us(100); -} - -// Setup twi to run at 100kHz -void i2c_master_init(void) { -  // no prescaler -  TWSR = 0; -  // Set TWI clock frequency to SCL_CLOCK. Need TWBR>10. -  // Check datasheets for more info. -  TWBR = ((F_CPU/SCL_CLOCK)-16)/2; -} - -// Start a transaction with the given i2c slave address. The direction of the -// transfer is set with I2C_READ and I2C_WRITE. -// returns: 0 => success -//          1 => error -uint8_t i2c_master_start(uint8_t address) { -  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA); - -  i2c_delay(); - -  // check that we started successfully -  if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START)) -    return 1; - -  TWDR = address; -  TWCR = (1<<TWINT) | (1<<TWEN); - -  i2c_delay(); - -  if ( (TW_STATUS != TW_MT_SLA_ACK) && (TW_STATUS != TW_MR_SLA_ACK) ) -    return 1; // slave did not acknowledge -  else -    return 0; // success -} - - -// Finish the i2c transaction. -void i2c_master_stop(void) { -  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); - -  uint16_t lim = 0; -  while(!(TWCR & (1<<TWSTO)) && lim < I2C_LOOP_TIMEOUT) -    lim++; -} - -// Write one byte to the i2c slave. -// returns 0 => slave ACK -//         1 => slave NACK -uint8_t i2c_master_write(uint8_t data) { -  TWDR = data; -  TWCR = (1<<TWINT) | (1<<TWEN); - -  i2c_delay(); - -  // check if the slave acknowledged us -  return (TW_STATUS == TW_MT_DATA_ACK) ? 0 : 1; -} - -// Read one byte from the i2c slave. If ack=1 the slave is acknowledged, -// if ack=0 the acknowledge bit is not set. -// returns: byte read from i2c device -uint8_t i2c_master_read(int ack) { -  TWCR = (1<<TWINT) | (1<<TWEN) | (ack<<TWEA); - -  i2c_delay(); -  return TWDR; -} - -void i2c_reset_state(void) { -  TWCR = 0; -} - -void i2c_slave_init(uint8_t address) { -  TWAR = address << 0; // slave i2c address -  // TWEN  - twi enable -  // TWEA  - enable address acknowledgement -  // TWINT - twi interrupt flag -  // TWIE  - enable the twi interrupt -  TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN); -} - -ISR(TWI_vect); - -ISR(TWI_vect) { -  uint8_t ack = 1; -  switch(TW_STATUS) { -    case TW_SR_SLA_ACK: -      // this device has been addressed as a slave receiver -      slave_has_register_set = false; -      break; - -    case TW_SR_DATA_ACK: -      // this device has received data as a slave receiver -      // The first byte that we receive in this transaction sets the location -      // of the read/write location of the slaves memory that it exposes over -      // i2c.  After that, bytes will be written at slave_buffer_pos, incrementing -      // slave_buffer_pos after each write. -      if(!slave_has_register_set) { -        slave_buffer_pos = TWDR; -        // don't acknowledge the master if this memory loctaion is out of bounds -        if ( slave_buffer_pos >= SLAVE_BUFFER_SIZE ) { -          ack = 0; -          slave_buffer_pos = 0; -        } -        slave_has_register_set = true; -      } else { -        i2c_slave_buffer[slave_buffer_pos] = TWDR; -        BUFFER_POS_INC(); -      } -      break; - -    case TW_ST_SLA_ACK: -    case TW_ST_DATA_ACK: -      // master has addressed this device as a slave transmitter and is -      // requesting data. -      TWDR = i2c_slave_buffer[slave_buffer_pos]; -      BUFFER_POS_INC(); -      break; - -    case TW_BUS_ERROR: // something went wrong, reset twi state -      TWCR = 0; -    default: -      break; -  } -  // Reset everything, so we are ready for the next TWI interrupt -  TWCR |= (1<<TWIE) | (1<<TWINT) | (ack<<TWEA) | (1<<TWEN); -} -#endif diff --git a/keyboards/handwired/not_so_minidox/i2c.h b/keyboards/handwired/not_so_minidox/i2c.h deleted file mode 100644 index 8910e70f10..0000000000 --- a/keyboards/handwired/not_so_minidox/i2c.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include <stdint.h> - -#ifndef F_CPU -#define F_CPU 16000000UL -#endif - -#define I2C_READ 1 -#define I2C_WRITE 0 - -#define I2C_ACK 1 -#define I2C_NACK 0 - -#define SLAVE_BUFFER_SIZE 0x10 - -// i2c SCL clock frequency -#define SCL_CLOCK  400000L - -extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -void i2c_master_init(void); -uint8_t i2c_master_start(uint8_t address); -void i2c_master_stop(void); -uint8_t i2c_master_write(uint8_t data); -uint8_t i2c_master_read(int); -void i2c_reset_state(void); -void i2c_slave_init(uint8_t address); - - -static inline unsigned char i2c_start_read(unsigned char addr) { -  return i2c_master_start((addr << 1) | I2C_READ); -} - -static inline unsigned char i2c_start_write(unsigned char addr) { -  return i2c_master_start((addr << 1) | I2C_WRITE); -} - -// from SSD1306 scrips -extern unsigned char i2c_rep_start(unsigned char addr); -extern void i2c_start_wait(unsigned char addr); -extern unsigned char i2c_readAck(void); -extern unsigned char i2c_readNak(void); -extern unsigned char i2c_read(unsigned char ack); - -#define i2c_read(ack)  (ack) ? i2c_readAck() : i2c_readNak(); diff --git a/keyboards/handwired/not_so_minidox/keymaps/default/keymap.c b/keyboards/handwired/not_so_minidox/keymaps/default/keymap.c index 296a7a281d..435eed2f1f 100644 --- a/keyboards/handwired/not_so_minidox/keymaps/default/keymap.c +++ b/keyboards/handwired/not_so_minidox/keymaps/default/keymap.c @@ -8,17 +8,10 @@  #define _QWERTY 0  #define _LOWER 1  #define _RAISE 2 -#define _ADJUST 16 +#define _ADJUST 3 -enum custom_keycodes { -  QWERTY = SAFE_RANGE, -  LOWER, -  RAISE, -  ADJUST, -}; - -#define KC_LOWR LOWER -#define KC_RASE RAISE +#define KC_LOWR MO(_LOWER) +#define KC_RASE MO(_RAISE)  #define KC_RST  RESET  #define KC_CAD  LCTL(LALT(KC_DEL)) @@ -72,45 +65,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {    )  }; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { -  switch (keycode) { -    case QWERTY: -      if (record->event.pressed) { -        set_single_persistent_default_layer(_QWERTY); -      } -      return false; -      break; -    case LOWER: -      if (record->event.pressed) { -        layer_on(_LOWER); -        update_tri_layer(_LOWER, _RAISE, _ADJUST); -      } else { -        layer_off(_LOWER); -        update_tri_layer(_LOWER, _RAISE, _ADJUST); -      } -      return false; -      break; -    case RAISE: -      if (record->event.pressed) { -        layer_on(_RAISE); -        update_tri_layer(_LOWER, _RAISE, _ADJUST); -      } else { -        layer_off(_RAISE); -        update_tri_layer(_LOWER, _RAISE, _ADJUST); -      } -      return false; -      break; -    case ADJUST: -      if (record->event.pressed) { -        layer_on(_ADJUST); -        update_tri_layer(_LOWER, _RAISE, _ADJUST); -      } else { -        layer_off(_ADJUST); -        update_tri_layer(_LOWER, _RAISE, _ADJUST); -      } -      return false; -      break; -  } -  return true; +layer_state_t layer_state_set_user(layer_state_t state) { +  return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);  } diff --git a/keyboards/handwired/not_so_minidox/matrix.c b/keyboards/handwired/not_so_minidox/matrix.c deleted file mode 100644 index b7cec9370c..0000000000 --- a/keyboards/handwired/not_so_minidox/matrix.c +++ /dev/null @@ -1,308 +0,0 @@ -/* -Copyright 2012 Jun Wako <wakojun@gmail.com> - -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/>. -*/ - -/* - * scan matrix - */ -#include <stdint.h> -#include <stdbool.h> -#include <avr/io.h> -#include <avr/wdt.h> -#include <avr/interrupt.h> -#include <util/delay.h> -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "config.h" -#include "quantum.h" - -#ifdef USE_I2C -#  include "i2c.h" -#else // USE_SERIAL -#  include "serial.h" -#endif - -#ifndef DEBOUNCE -#  define DEBOUNCE	5 -#endif - -#define ERROR_DISCONNECT_COUNT 5 - -static uint8_t debouncing = DEBOUNCE; -static const int ROWS_PER_HAND = MATRIX_ROWS/2; -static uint8_t error_count = 0; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -static matrix_row_t read_cols(void); -static void init_cols(void); -static void unselect_rows(void); -static void select_row(uint8_t row); - - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) -{ -    return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ -    return MATRIX_COLS; -} - -void matrix_init(void) -{ -    debug_enable = true; -    debug_matrix = true; -    debug_mouse = true; -    // initialize row and col -    unselect_rows(); -    init_cols(); - -    setPinOutput(B0); -    setPinOutput(D5); - -    // initialize matrix state: all keys off -    for (uint8_t i=0; i < MATRIX_ROWS; i++) { -        matrix[i] = 0; -        matrix_debouncing[i] = 0; -    } - -    matrix_init_quantum(); -} - -uint8_t _matrix_scan(void) -{ -    // Right hand is stored after the left in the matirx so, we need to offset it -    int offset = isLeftHand ? 0 : (ROWS_PER_HAND); - -    for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { -        select_row(i); -        _delay_us(30);  // without this wait read unstable value. -        matrix_row_t cols = read_cols(); -        if (matrix_debouncing[i+offset] != cols) { -            matrix_debouncing[i+offset] = cols; -            debouncing = DEBOUNCE; -        } -        unselect_rows(); -    } - -    if (debouncing) { -        if (--debouncing) { -            _delay_ms(1); -        } else { -            for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { -                matrix[i+offset] = matrix_debouncing[i+offset]; -            } -        } -    } - -    return 1; -} - -#ifdef USE_I2C - -// Get rows from other half over i2c -int i2c_transaction(void) { -    int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - -    int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); -    if (err) goto i2c_error; - -    // start of matrix stored at 0x00 -    err = i2c_master_write(0x00); -    if (err) goto i2c_error; - -    // Start read -    err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); -    if (err) goto i2c_error; - -    if (!err) { -        int i; -        for (i = 0; i < ROWS_PER_HAND-1; ++i) { -            matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); -        } -        matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); -        i2c_master_stop(); -    } else { -i2c_error: // the cable is disconnceted, or something else went wrong -        i2c_reset_state(); -        return err; -    } - -    return 0; -} - -#else // USE_SERIAL - -int serial_transaction(void) { -    int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - -    if (serial_update_buffers()) { -        return 1; -    } - -    for (int i = 0; i < ROWS_PER_HAND; ++i) { -        matrix[slaveOffset+i] = serial_slave_buffer[i]; -    } -    return 0; -} -#endif - -uint8_t matrix_scan(void) -{ -    int ret = _matrix_scan(); - - - -#ifdef USE_I2C -    if( i2c_transaction() ) { -#else // USE_SERIAL -    if( serial_transaction() ) { -#endif -        // turn on the indicator led when halves are disconnected -        writePinLow(D5); - -        error_count++; - -        if (error_count > ERROR_DISCONNECT_COUNT) { -            // reset other half if disconnected -            int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; -            for (int i = 0; i < ROWS_PER_HAND; ++i) { -                matrix[slaveOffset+i] = 0; -            } -        } -    } else { -        // turn off the indicator led on no error -        writePinHigh(D5); -        error_count = 0; -    } -    matrix_scan_quantum(); -    return ret; -} - -void matrix_slave_scan(void) { -    _matrix_scan(); - -    int offset = (isLeftHand) ? 0 : (MATRIX_ROWS / 2); - -#ifdef USE_I2C -    for (int i = 0; i < ROWS_PER_HAND; ++i) { -        /* i2c_slave_buffer[i] = matrix[offset+i]; */ -        i2c_slave_buffer[i] = matrix[offset+i]; -    } -#else // USE_SERIAL -    for (int i = 0; i < ROWS_PER_HAND; ++i) { -        serial_slave_buffer[i] = matrix[offset+i]; -    } -#endif -} - -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print("\nr/c 0123456789ABCDEF\n"); -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_bin_reverse16(matrix_get_row(row)); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += bitpop16(matrix[i]); -    } -    return count; -} - -static void  init_cols(void) -{ -    for(int x = 0; x < MATRIX_COLS; x++) { -        _SFR_IO8((col_pins[x] >> 4) + 1) &=  ~_BV(col_pins[x] & 0xF); -        _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF); -    } -} - -static matrix_row_t read_cols(void) -{ -    matrix_row_t result = 0; -    for(int x = 0; x < MATRIX_COLS; x++) { -        result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x); -    } -    return result; -} - -static void unselect_rows(void) -{ -    for(int x = 0; x < ROWS_PER_HAND; x++) { -        _SFR_IO8((row_pins[x] >> 4) + 1) &=  ~_BV(row_pins[x] & 0xF); -        _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF); -    } -} - -static void select_row(uint8_t row) -{ -    _SFR_IO8((row_pins[row] >> 4) + 1) |=  _BV(row_pins[row] & 0xF); -    _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF); -} diff --git a/keyboards/handwired/not_so_minidox/rules.mk b/keyboards/handwired/not_so_minidox/rules.mk index 3eab0fba7e..8f9772df22 100644 --- a/keyboards/handwired/not_so_minidox/rules.mk +++ b/keyboards/handwired/not_so_minidox/rules.mk @@ -7,19 +7,14 @@ BOOTLOADER = caterina  # Build Options  #   change yes to no to disable  # -BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite +BOOTMAGIC_ENABLE = yes      # Enable Bootmagic Lite  MOUSEKEY_ENABLE = yes       # Mouse keys -EXTRAKEY_ENABLE = no       # Audio control and System control +EXTRAKEY_ENABLE = yes       # Audio control and System control  CONSOLE_ENABLE = no         # Console for debug -COMMAND_ENABLE = yes        # Commands for debug and configuration +COMMAND_ENABLE = no         # Commands for debug and configuration  NKRO_ENABLE = no            # Enable N-Key Rollover -BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow  AUDIO_ENABLE = no           # Audio output -RGBLIGHT_ENABLE = no       # Enable WS2812 RGB underlight.  -USE_I2C = no -CUSTOM_MATRIX = yes -SRC += matrix.c \ -	   i2c.c \ -	   split_util.c \ -	   serial.c +SPLIT_KEYBOARD = yes diff --git a/keyboards/handwired/not_so_minidox/serial.c b/keyboards/handwired/not_so_minidox/serial.c deleted file mode 100644 index 74bcbb6bf6..0000000000 --- a/keyboards/handwired/not_so_minidox/serial.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include <avr/io.h> -#include <avr/interrupt.h> -#include <util/delay.h> -#include <stdbool.h> -#include "serial.h" - -#ifndef USE_I2C - -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; - -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; - -inline static -void serial_delay(void) { -  _delay_us(SERIAL_DELAY); -} - -inline static -void serial_output(void) { -  SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static -void serial_input(void) { -  SERIAL_PIN_DDR  &= ~SERIAL_PIN_MASK; -  SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static -uint8_t serial_read_pin(void) { -  return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static -void serial_low(void) { -  SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static -void serial_high(void) { -  SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void serial_master_init(void) { -  serial_output(); -  serial_high(); -} - -void serial_slave_init(void) { -  serial_input(); - -  // Enable INT0 -  EIMSK |= _BV(INT0); -  // Trigger on falling edge of INT0 -  EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -} - -// Used by the master to synchronize timing with the slave. -static -void sync_recv(void) { -  serial_input(); -  // This shouldn't hang if the slave disconnects because the -  // serial line will float to high if the slave does disconnect. -  while (!serial_read_pin()); -  serial_delay(); -} - -// Used by the slave to send a synchronization signal to the master. -static -void sync_send(void) { -  serial_output(); - -  serial_low(); -  serial_delay(); - -  serial_high(); -} - -// Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { -  uint8_t byte = 0; -  serial_input(); -  for ( uint8_t i = 0; i < 8; ++i) { -    byte = (byte << 1) | serial_read_pin(); -    serial_delay(); -    _delay_us(1); -  } - -  return byte; -} - -// Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { -  uint8_t b = 8; -  serial_output(); -  while( b-- ) { -    if(data & (1 << b)) { -      serial_high(); -    } else { -      serial_low(); -    } -    serial_delay(); -  } -} - -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { -  sync_send(); - -  uint8_t checksum = 0; -  for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { -    serial_write_byte(serial_slave_buffer[i]); -    sync_send(); -    checksum += serial_slave_buffer[i]; -  } -  serial_write_byte(checksum); -  sync_send(); - -  // wait for the sync to finish sending -  serial_delay(); - -  // read the middle of pulses -  _delay_us(SERIAL_DELAY/2); - -  uint8_t checksum_computed = 0; -  for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { -    serial_master_buffer[i] = serial_read_byte(); -    sync_send(); -    checksum_computed += serial_master_buffer[i]; -  } -  uint8_t checksum_received = serial_read_byte(); -  sync_send(); - -  serial_input(); // end transaction - -  if ( checksum_computed != checksum_received ) { -    status |= SLAVE_DATA_CORRUPT; -  } else { -    status &= ~SLAVE_DATA_CORRUPT; -  } -} - -inline -bool serial_slave_DATA_CORRUPT(void) { -  return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. -// -// Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { -  // this code is very time dependent, so we need to disable interrupts -  cli(); - -  // signal to the slave that we want to start a transaction -  serial_output(); -  serial_low(); -  _delay_us(1); - -  // wait for the slaves response -  serial_input(); -  serial_high(); -  _delay_us(SERIAL_DELAY); - -  // check if the slave is present -  if (serial_read_pin()) { -    // slave failed to pull the line low, assume not present -    sei(); -    return 1; -  } - -  // if the slave is present syncronize with it -  sync_recv(); - -  uint8_t checksum_computed = 0; -  // receive data from the slave -  for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { -    serial_slave_buffer[i] = serial_read_byte(); -    sync_recv(); -    checksum_computed += serial_slave_buffer[i]; -  } -  uint8_t checksum_received = serial_read_byte(); -  sync_recv(); - -  if (checksum_computed != checksum_received) { -    sei(); -    return 1; -  } - -  uint8_t checksum = 0; -  // send data to the slave -  for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { -    serial_write_byte(serial_master_buffer[i]); -    sync_recv(); -    checksum += serial_master_buffer[i]; -  } -  serial_write_byte(checksum); -  sync_recv(); - -  // always, release the line when not in use -  serial_output(); -  serial_high(); - -  sei(); -  return 0; -} - -#endif diff --git a/keyboards/handwired/not_so_minidox/serial.h b/keyboards/handwired/not_so_minidox/serial.h deleted file mode 100644 index 28fcc56ce7..0000000000 --- a/keyboards/handwired/not_so_minidox/serial.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "config.h" -#include <stdbool.h> - -/* TODO:  some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); diff --git a/keyboards/handwired/not_so_minidox/split_util.c b/keyboards/handwired/not_so_minidox/split_util.c deleted file mode 100644 index 39639c3b4b..0000000000 --- a/keyboards/handwired/not_so_minidox/split_util.c +++ /dev/null @@ -1,84 +0,0 @@ -#include <avr/io.h> -#include <avr/wdt.h> -#include <avr/power.h> -#include <avr/interrupt.h> -#include <util/delay.h> -#include <avr/eeprom.h> -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "config.h" - -#ifdef USE_I2C -#  include "i2c.h" -#else -#  include "serial.h" -#endif - -volatile bool isLeftHand = true; - -static void setup_handedness(void) { -  #ifdef EE_HANDS -    isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); -  #else -    // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c -    #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) -      isLeftHand = !has_usb(); -    #else -      isLeftHand = has_usb(); -    #endif -  #endif -} - -static void keyboard_master_setup(void) { -#ifdef USE_I2C -    i2c_master_init(); -#ifdef SSD1306OLED -    matrix_master_OLED_init (); -#endif -#else -    serial_master_init(); -#endif -} - -static void keyboard_slave_setup(void) { -#ifdef USE_I2C -    i2c_slave_init(SLAVE_I2C_ADDRESS); -#else -    serial_slave_init(); -#endif -} - -bool has_usb(void) { -   USBCON |= (1 << OTGPADE); //enables VBUS pad -   _delay_us(5); -   return (USBSTA & (1<<VBUS));  //checks state of VBUS -} - -void split_keyboard_setup(void) { -   setup_handedness(); - -   if (has_usb()) { -      keyboard_master_setup(); -   } else { -      keyboard_slave_setup(); -   } -   sei(); -} - -void keyboard_slave_loop(void) { -   matrix_init(); - -   while (1) { -      matrix_slave_scan(); -   } -} - -// this code runs before the usb and keyboard is initialized -void matrix_setup(void) { -    split_keyboard_setup(); - -    if (!has_usb()) { -        keyboard_slave_loop(); -    } -} diff --git a/keyboards/handwired/not_so_minidox/split_util.h b/keyboards/handwired/not_so_minidox/split_util.h deleted file mode 100644 index 807412cd38..0000000000 --- a/keyboards/handwired/not_so_minidox/split_util.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include <stdbool.h> -#include "eeconfig.h" - -#define SLAVE_I2C_ADDRESS           0x32 - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool has_usb(void); -void keyboard_slave_loop(void); - -void matrix_master_OLED_init (void); diff --git a/keyboards/handwired/onekey/teensy_32/rules.mk b/keyboards/handwired/onekey/teensy_32/rules.mk index c1b90d0d2b..937c9d5103 100644 --- a/keyboards/handwired/onekey/teensy_32/rules.mk +++ b/keyboards/handwired/onekey/teensy_32/rules.mk @@ -1,5 +1,8 @@  # MCU name  MCU = MK20DX256 +# Bootloader selection +BOOTLOADER = halfkay +  # Enter lower-power sleep mode when on the ChibiOS idle thread  OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE diff --git a/keyboards/handwired/onekey/teensy_lc/rules.mk b/keyboards/handwired/onekey/teensy_lc/rules.mk index b3daabe317..0e3c7edf7a 100644 --- a/keyboards/handwired/onekey/teensy_lc/rules.mk +++ b/keyboards/handwired/onekey/teensy_lc/rules.mk @@ -2,5 +2,8 @@  MCU = MKL26Z64  USE_CHIBIOS_CONTRIB = yes +# Bootloader selection +BOOTLOADER = halfkay +  # Enter lower-power sleep mode when on the ChibiOS idle thread  OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE diff --git a/keyboards/handwired/promethium/matrix.c b/keyboards/handwired/promethium/matrix.c index e3a41af288..90dbce14a9 100644 --- a/keyboards/handwired/promethium/matrix.c +++ b/keyboards/handwired/promethium/matrix.c @@ -148,14 +148,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col) diff --git a/keyboards/handwired/pterodactyl/matrix.c b/keyboards/handwired/pterodactyl/matrix.c index 21e6a128df..d0f74802a0 100644 --- a/keyboards/handwired/pterodactyl/matrix.c +++ b/keyboards/handwired/pterodactyl/matrix.c @@ -282,14 +282,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) // deprecated and evidently not called. -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/config.h b/keyboards/handwired/tractyl_manuform/5x6_right/config.h index d7618912f7..b9d8e86c09 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/config.h +++ b/keyboards/handwired/tractyl_manuform/5x6_right/config.h @@ -52,5 +52,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define OLED_DISPLAY_128X64 -#define POINTING_DEVICE_TASK_THROTTLE  #define POINTING_DEVICE_RIGHT diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c b/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c index 958f694172..65f8a5260d 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c +++ b/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c @@ -301,7 +301,7 @@ void oled_driver_render_logo_left(void) {  #    endif      oled_set_cursor(6, 3);  #    if defined(KEYBOARD_handwired_tractyl_manuform_5x6_right) -    render_pointing_dpi_status(0); +    render_pointing_dpi_status(kb_config_data.device_cpi, 0);  #    endif      oled_set_cursor(0, 4);  } diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk b/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk index 37bbbb4dae..a689be3dd5 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk +++ b/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk @@ -18,6 +18,4 @@ MOUSE_SHARED_EP = yes  SPLIT_KEYBOARD = yes -QUANTUM_LIB_SRC += tm_sync.c -  DEFAULT_FOLDER = handwired/tractyl_manuform/5x6_right/teensy2pp diff --git a/keyboards/handwired/tractyl_manuform/config.h b/keyboards/handwired/tractyl_manuform/config.h index cc8a7546f4..15c8102b8f 100644 --- a/keyboards/handwired/tractyl_manuform/config.h +++ b/keyboards/handwired/tractyl_manuform/config.h @@ -39,4 +39,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define NO_ACTION_MACRO  #define NO_ACTION_FUNCTION -#define SPLIT_TRANSACTION_IDS_KB RPC_ID_KB_CONFIG_SYNC, RPC_ID_POINTER_STATE_SYNC +#define SPLIT_POINTING_ENABLE +#define POINTING_DEVICE_TASK_THROTTLE_MS 1 + +#define SPLIT_TRANSACTION_IDS_KB RPC_ID_KB_CONFIG_SYNC diff --git a/keyboards/handwired/tractyl_manuform/tm_sync.c b/keyboards/handwired/tractyl_manuform/tm_sync.c deleted file mode 100644 index 549a17a22f..0000000000 --- a/keyboards/handwired/tractyl_manuform/tm_sync.c +++ /dev/null @@ -1,180 +0,0 @@ -/* Copyright 2020 Christopher Courtney, aka Drashna Jael're  (@drashna) <drashna@live.com> - * Copyright 2021 Dasky (@daskygit) - - * 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 QMK_KEYBOARD_H -#include "pointing_device.h" -#include "transactions.h" -#include <string.h> -#ifdef MOUSEKEY_ENABLE -#    include "mousekey.h" -#endif - -// typedef struct { -//     uint16_t device_cpi; -// } kb_config_data_t; - -kb_config_data_t                      kb_config; -static report_mouse_t                 shared_mouse_report; -extern const pointing_device_driver_t pointing_device_driver; - -void kb_pointer_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) { -    shared_mouse_report = pointing_device_driver.get_report(shared_mouse_report); -    memcpy(target2initiator_buffer, &shared_mouse_report, sizeof(report_mouse_t)); -    shared_mouse_report.x = 0; -    shared_mouse_report.y = 0; -    shared_mouse_report.h = 0; -    shared_mouse_report.v = 0; -} - -void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) { -    if (initiator2target_buffer_size == sizeof(kb_config)) { -        memcpy(&kb_config, initiator2target_buffer, sizeof(kb_config)); -    } - -    static uint16_t cpi = 0; -    // Check if the state values are different -    if (cpi != kb_config.device_cpi) { -        cpi = kb_config.device_cpi; -        if (!is_keyboard_left()) { -            pointing_device_set_cpi(cpi); -        } -    } -} - -void keyboard_pre_init_sync(void) { -    memset(&kb_config, 0, sizeof(kb_config)); -    memset(&shared_mouse_report, 0, sizeof(shared_mouse_report)); -} - -void keyboard_post_init_sync(void) { -    // Register keyboard state sync split transaction -    transaction_register_rpc(RPC_ID_KB_CONFIG_SYNC, kb_config_sync_handler); -    transaction_register_rpc(RPC_ID_POINTER_STATE_SYNC, kb_pointer_sync_handler); -} - -void housekeeping_task_sync(void) { -    if (is_keyboard_master()) { -        // Keep track of the last state, so that we can tell if we need to propagate to slave -        static kb_config_data_t last_kb_config; -        static uint32_t         last_sync  = 0; -        bool                    needs_sync = false; - -        // Check if the state values are different -        if (memcmp(&kb_config, &last_kb_config, sizeof(kb_config))) { -            needs_sync = true; -            memcpy(&last_kb_config, &kb_config, sizeof(kb_config)); -        } -        // Send to slave every 500ms regardless of state change -        if (timer_elapsed32(last_sync) > 500) { -            needs_sync = true; -        } - -        // Perform the sync if requested -        if (needs_sync) { -            if (transaction_rpc_send(RPC_ID_KB_CONFIG_SYNC, sizeof(kb_config), &kb_config)) { -                last_sync = timer_read32(); -            } -        } -    } -} - -void trackball_set_cpi(uint16_t cpi) { -    kb_config.device_cpi = cpi; -    if (!is_keyboard_left()) { -        pointing_device_set_cpi(cpi); -    } -} - -void pointing_device_task(void) { -    if (!is_keyboard_master()) { -        return; -    } - -#if defined(POINTING_DEVICE_TASK_THROTTLE) -    static uint32_t last_exec = 0; -    if (timer_elapsed32(last_exec) < 1) { -        return; -    } -    last_exec = timer_read32(); -#endif - -    report_mouse_t local_report = pointing_device_get_report(); - -    // Gather report info -#ifdef POINTING_DEVICE_MOTION_PIN -    if (!readPin(POINTING_DEVICE_MOTION_PIN)) -#endif -#if defined(POINTING_DEVICE_COMBINED) -        local_report = pointing_device_driver.get_report(local_report); -    transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &shared_mouse_report); -    local_report.x = local_report.x | shared_mouse_report.x; -    local_report.y = local_report.y | shared_mouse_report.y; -    local_report.h = local_report.h | shared_mouse_report.h; -    local_report.v = local_report.v | shared_mouse_report.v; -#elif defined(POINTING_DEVICE_LEFT) -    if (is_keyboard_left()) { -        local_report = pointing_device_driver.get_report(local_report); -    } else { -        transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &local_report); -    } -#elif defined(POINTING_DEVICE_RIGHT) -    if (!is_keyboard_left()) { -        local_report = pointing_device_driver.get_report(local_report); -    } else { -        transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &local_report); -    } -#else -#    error "You need to define the side(s) the pointing device is on. POINTING_DEVICE_COMBINED / POINTING_DEVICE_LEFT / POINTING_DEVICE_RIGHT" -#endif - -    // Support rotation of the sensor data -#if defined(POINTING_DEVICE_ROTATION_90) || defined(POINTING_DEVICE_ROTATION_180) || defined(POINTING_DEVICE_ROTATION_270) -    int8_t x = local_report.x, y = local_report.y; -#    if defined(POINTING_DEVICE_ROTATION_90) -    local_report.x = y; -    local_report.y = -x; -#    elif defined(POINTING_DEVICE_ROTATION_180) -    local_report.x = -x; -    local_report.y = -y; -#    elif defined(POINTING_DEVICE_ROTATION_270) -    local_report.x = -y; -    local_report.y = x; -#    else -#        error "How the heck did you get here?!" -#    endif -#endif -    // Support Inverting the X and Y Axises -#if defined(POINTING_DEVICE_INVERT_X) -    local_report.x = -local_report.x; -#endif -#if defined(POINTING_DEVICE_INVERT_Y) -    local_report.y = -local_report.y; -#endif - -    // allow kb to intercept and modify report -    local_report = pointing_device_task_kb(local_report); -    // combine with mouse report to ensure that the combined is sent correctly -#ifdef MOUSEKEY_ENABLE -    report_mouse_t mousekey_report = mousekey_get_report(); -    local_report.buttons           = local_report.buttons | mousekey_report.buttons; -#endif -#if defined(POINTING_DEVICE_COMBINED) -    local_report.buttons = local_report.buttons | shared_mouse_report.buttons; -#endif -    pointing_device_set_report(local_report); -    pointing_device_send(); -} diff --git a/keyboards/handwired/tractyl_manuform/tractyl_manuform.c b/keyboards/handwired/tractyl_manuform/tractyl_manuform.c index 6095bfb7e2..5bdc57ca09 100644 --- a/keyboards/handwired/tractyl_manuform/tractyl_manuform.c +++ b/keyboards/handwired/tractyl_manuform/tractyl_manuform.c @@ -17,7 +17,6 @@  #include "tractyl_manuform.h"  #include "transactions.h"  #include <string.h> -#include "drivers/sensors/pmw3360.h"  #ifndef TRACKBALL_DPI_OPTIONS  #    define TRACKBALL_DPI_OPTIONS \ @@ -31,11 +30,10 @@  #endif  keyboard_config_t keyboard_config; +kb_config_data_t  kb_config_data;  uint16_t          dpi_array[] = TRACKBALL_DPI_OPTIONS;  #define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t)) - -  bool process_record_kb(uint16_t keycode, keyrecord_t* record) {      if (!process_record_user(keycode, record)) {          return false; @@ -49,7 +47,8 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {              keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;          }          eeconfig_update_kb(keyboard_config.raw); -        trackball_set_cpi(dpi_array[keyboard_config.dpi_config]); +        kb_config_data.device_cpi = dpi_array[keyboard_config.dpi_config]; +        pointing_device_set_cpi(kb_config_data.device_cpi);      }  #endif @@ -69,7 +68,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {      return true;  } -__attribute__((weak)) void keyboard_pre_init_sync(void) {}  __attribute__((weak)) void keyboard_pre_init_sub(void) {}  void                       keyboard_pre_init_kb(void) {      // debug_enable  = true; @@ -83,20 +81,22 @@ void                       keyboard_pre_init_kb(void) {      writePin(DEBUG_LED_PIN, !debug_enable);  #endif +    memset(&kb_config_data, 0, sizeof(kb_config_data)); +      keyboard_pre_init_sub(); -    keyboard_pre_init_sync();      keyboard_pre_init_user();  } -__attribute__((weak)) void keyboard_post_init_sync(void) {} -void                       keyboard_post_init_kb(void) { -    keyboard_post_init_sync(); +void keyboard_post_init_kb(void) { +    transaction_register_rpc(RPC_ID_KB_CONFIG_SYNC, kb_config_sync_handler); +      keyboard_post_init_user();  }  #ifdef POINTING_DEVICE_ENABLE  void pointing_device_init_kb(void) { -    trackball_set_cpi(dpi_array[keyboard_config.dpi_config]); +    kb_config_data.device_cpi = dpi_array[keyboard_config.dpi_config]; +    pointing_device_set_cpi(kb_config_data.device_cpi);      pointing_device_init_user();  } @@ -111,7 +111,8 @@ report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {  void eeconfig_init_kb(void) {      keyboard_config.dpi_config = TRACKBALL_DPI_DEFAULT;  #ifdef POINTING_DEVICE_ENABLE -    trackball_set_cpi(dpi_array[keyboard_config.dpi_config]); +    kb_config_data.device_cpi = dpi_array[keyboard_config.dpi_config]; +    pointing_device_set_cpi(kb_config_data.device_cpi);  #endif      eeconfig_update_kb(keyboard_config.raw);      eeconfig_init_user(); @@ -135,12 +136,39 @@ void                       matrix_scan_kb(void) {      matrix_scan_user();  } -__attribute__((weak)) void housekeeping_task_sync(void) {} -void                       housekeeping_task_kb(void) { -    housekeeping_task_sync(); +void housekeeping_task_kb(void) { +    if (is_keyboard_master()) { +        // Keep track of the last state, so that we can tell if we need to propagate to slave +        static kb_config_data_t last_kb_config; +        static uint32_t         last_sync  = 0; +        bool                    needs_sync = false; + +        // Check if the state values are different +        if (memcmp(&kb_config_data, &last_kb_config, sizeof(kb_config_data))) { +            needs_sync = true; +            memcpy(&last_kb_config, &kb_config_data, sizeof(kb_config_data)); +        } +        // Send to slave every 500ms regardless of state change +        if (timer_elapsed32(last_sync) > 500) { +            needs_sync = true; +        } + +        // Perform the sync if requested +        if (needs_sync) { +            if (transaction_rpc_send(RPC_ID_KB_CONFIG_SYNC, sizeof(kb_config_data), &kb_config_data)) { +                last_sync = timer_read32(); +            } +        } +    }      // no need for user function, is called already  } +void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) { +    if (initiator2target_buffer_size == sizeof(kb_config_data)) { +        memcpy(&kb_config_data, initiator2target_buffer, sizeof(kb_config_data)); +    } +} +  #ifdef POINTING_DEVICE_ENABLE  void matrix_power_up(void) { pointing_device_task(); }  #endif diff --git a/keyboards/handwired/tractyl_manuform/tractyl_manuform.h b/keyboards/handwired/tractyl_manuform/tractyl_manuform.h index 6aa40fc18b..3f8aca4551 100644 --- a/keyboards/handwired/tractyl_manuform/tractyl_manuform.h +++ b/keyboards/handwired/tractyl_manuform/tractyl_manuform.h @@ -32,21 +32,26 @@ typedef union {      };  } keyboard_config_t; +typedef union { +    uint32_t raw; +    struct { +        uint16_t device_cpi; +    }; +} kb_config_data_t; +  extern keyboard_config_t keyboard_config; +extern kb_config_data_t kb_config_data;  enum ploopy_keycodes {      DPI_CONFIG = SAFE_RANGE,      KEYMAP_SAFE_RANGE,  }; -typedef struct { -    uint16_t device_cpi; -} kb_config_data_t; - -void trackball_set_cpi(uint16_t cpi);  void matrix_init_sub_kb(void);  void matrix_scan_sub_kb(void);  void keyboard_pre_init_sync(void);  void keyboard_post_init_sync(void);  void housekeeping_task_sync(void); + +void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer); diff --git a/keyboards/handwired/wakizashi40/config.h b/keyboards/handwired/wakizashi40/config.h new file mode 100644 index 0000000000..78f85f2197 --- /dev/null +++ b/keyboards/handwired/wakizashi40/config.h @@ -0,0 +1,20 @@ +/* Copyright 2021 xiao (@xia0) + * + * 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 "config_common.h" +#define DYNAMIC_KEYMAP_LAYER_COUNT 12 diff --git a/keyboards/handwired/wakizashi40/info.json b/keyboards/handwired/wakizashi40/info.json new file mode 100644 index 0000000000..b64ab55116 --- /dev/null +++ b/keyboards/handwired/wakizashi40/info.json @@ -0,0 +1,88 @@ +{ +  "manufacturer": "fumbucker", +  "keyboard_name": "Wakizashi 40", +  "maintainer": "fumbucker", +  "debounce": 5, +  "processor": "at90usb1286", +  "diode_direction": "COL2ROW", +  "features": { +    "audio": false, +    "backlight": false, +    "bluetooth": false, +    "bootmagic": true, +    "command": false, +    "console": true, +    "extrakey": true, +    "midi": false, +    "mousekey": true, +    "nkro": true, +    "rgblight": false, +    "unicode": false +  }, +  "matrix_pins": { +    "cols": ["C5", "C4", "D2", "D3", "D4", "D5", "C6", "D7", "B0", "B1", "B2", "B3", "B4"], +    "rows": ["C0", "C1", "C2", "C3"] +  }, +  "usb": { +    "device_ver": "0x0001", +    "pid": "0x7740", +    "vid": "0x6662" +  }, +  "layout_aliases": { +    "LAYOUT": "LAYOUT_all" +  }, +  "layouts": { +    "LAYOUT_all": { +      "layout": [ +        { "label": "TAB", "matrix": [0, 0], "w": 1.5, "x": 0, "y": 0 }, +        { "label": "Q", "matrix": [0, 2], "w": 1, "x": 1.5, "y": 0 }, +        { "label": "W", "matrix": [0, 3], "w": 1, "x": 2.5, "y": 0 }, +        { "label": "E", "matrix": [0, 4], "w": 1, "x": 3.5, "y": 0 }, +        { "label": "R", "matrix": [0, 5], "w": 1, "x": 4.5, "y": 0 }, +        { "label": "T", "matrix": [0, 6], "w": 1, "x": 5.5, "y": 0 }, +        { "label": "Y", "matrix": [0, 7], "w": 1, "x": 6.5, "y": 0 }, +        { "label": "U", "matrix": [0, 8], "w": 1, "x": 7.5, "y": 0 }, +        { "label": "I", "matrix": [0, 9], "w": 1, "x": 8.5, "y": 0 }, +        { "label": "O", "matrix": [0, 10], "w": 1, "x": 9.5, "y": 0 }, +        { "label": "P", "matrix": [0, 11], "w": 1, "x": 10.5, "y": 0 }, +        { "label": "BACKSPACE", "matrix": [0, 12], "w": 1.5, "x": 11.5, "y": 0 }, + +        { "label": "CAPSLOCK", "matrix": [1, 0], "w": 1.25, "x": 0, "y": 1 }, +        { "label": "A", "matrix": [1, 1], "w": 1, "x": 1.25, "y": 1 }, +        { "label": "S", "matrix": [1, 2], "w": 1, "x": 2.25, "y": 1 }, +        { "label": "D", "matrix": [1, 3], "w": 1, "x": 3.25, "y": 1 }, +        { "label": "F", "matrix": [1, 4], "w": 1, "x": 4.25, "y": 1 }, +        { "label": "G", "matrix": [1, 5], "w": 1, "x": 5.75, "y": 1 }, +        { "label": "H", "matrix": [1, 7], "w": 1, "x": 6.75, "y": 1 }, +        { "label": "J", "matrix": [1, 8], "w": 1, "x": 7.75, "y": 1 }, +        { "label": "K", "matrix": [1, 9], "w": 1, "x": 8.75, "y": 1 }, +        { "label": "L", "matrix": [1, 10], "w": 1, "x": 9.75, "y": 1 }, +        { "label": "SEMICOLON", "matrix": [1, 11], "w": 1, "x": 10.75, "y": 1 }, +        { "label": "ENTER", "matrix": [1, 12], "w": 1.25, "x": 11.75, "y": 1 }, + +        { "label": "LSHIFT", "matrix": [2, 0], "w": 1, "x": 0, "y": 2 }, +        { "label": "Z", "matrix": [2, 1], "w": 1, "x": 1, "y": 2 }, +        { "label": "X", "matrix": [2, 2], "w": 1, "x": 2, "y": 2 }, +        { "label": "C", "matrix": [2, 3], "w": 1, "x": 3, "y": 2 }, +        { "label": "V", "matrix": [2, 4], "w": 1, "x": 4, "y": 2 }, +        { "label": "B", "matrix": [2, 5], "w": 1, "x": 5, "y": 2 }, +        { "label": "ESCAPE", "matrix": [2, 6], "w": 1, "x": 6, "y": 2 }, +        { "label": "N", "matrix": [2, 7], "w": 1, "x": 7, "y": 2 }, +        { "label": "M", "matrix": [2, 8], "w": 1, "x": 8, "y": 2 }, +        { "label": "COMMA", "matrix": [2, 9], "w": 1, "x": 9, "y": 2 }, +        { "label": "PERIOD", "matrix": [2, 10], "w": 1, "x": 10, "y": 2 }, +        { "label": "SLASH", "matrix": [2, 11], "w": 1, "x": 11, "y": 2 }, +        { "label": "RSHIFT", "matrix": [2, 12], "w": 1, "x": 12, "y": 2 }, + +        { "label": "LCTRL", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 }, +        { "label": "LWIN", "matrix": [3, 1], "w": 1.25, "x": 1.25, "y": 3 }, +        { "label": "LALT", "matrix": [3, 3], "w": 1.25, "x": 2.5, "y": 3 }, +        { "label": "SPACE1", "matrix": [3, 5], "w": 2.75, "x": 3.75, "y": 3 }, +        { "label": "SPACE2", "matrix": [3, 7], "w": 2.75, "x": 6.5, "y": 3 }, +        { "label": "RALT", "matrix": [3, 9], "w": 1.25, "x": 9.25, "y": 3 }, +        { "label": "MENU", "matrix": [3, 11], "w": 1.25, "x": 10.5, "y": 3 }, +        { "label": "RCTRL", "matrix": [3, 12], "w": 1.25, "x": 11.75, "y": 3 } +      ] +    } +  } +} diff --git a/keyboards/handwired/wakizashi40/keymaps/default/keymap.c b/keyboards/handwired/wakizashi40/keymaps/default/keymap.c new file mode 100644 index 0000000000..910e5bde12 --- /dev/null +++ b/keyboards/handwired/wakizashi40/keymaps/default/keymap.c @@ -0,0 +1,44 @@ +/* Copyright 2021 xiao (@xia0) + * + * 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 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), + +	[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), + +	[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) + +}; diff --git a/keyboards/handwired/wakizashi40/keymaps/via/keymap.c b/keyboards/handwired/wakizashi40/keymaps/via/keymap.c new file mode 100644 index 0000000000..d456b8b40a --- /dev/null +++ b/keyboards/handwired/wakizashi40/keymaps/via/keymap.c @@ -0,0 +1,92 @@ +/* Copyright 2021 xiao (@xia0) + * + * 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 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), + +	[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) + +}; diff --git a/keyboards/handwired/wakizashi40/keymaps/via/rules.mk b/keyboards/handwired/wakizashi40/keymaps/via/rules.mk new file mode 100644 index 0000000000..7a49719505 --- /dev/null +++ b/keyboards/handwired/wakizashi40/keymaps/via/rules.mk @@ -0,0 +1,4 @@ +# rules.mk overrides to enable VIA + +VIA_ENABLE = yes +LTO_ENABLE = yes diff --git a/keyboards/handwired/wakizashi40/readme.md b/keyboards/handwired/wakizashi40/readme.md new file mode 100644 index 0000000000..d94a75651c --- /dev/null +++ b/keyboards/handwired/wakizashi40/readme.md @@ -0,0 +1,19 @@ +# Wakizashi 40 + + + +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) + +Make example for this keyboard (after setting up your build environment): + +    make handwired/wakizashi40:default + +See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. + +## Bootloader + +* **Keycode in layout**: Press the key mapped to `RESET` if it is available (Capslock + R). diff --git a/keyboards/handwired/wakizashi40/rules.mk b/keyboards/handwired/wakizashi40/rules.mk new file mode 100644 index 0000000000..6e7633bfe0 --- /dev/null +++ b/keyboards/handwired/wakizashi40/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank diff --git a/keyboards/helix/pico/matrix.c b/keyboards/helix/pico/matrix.c index b18213d846..039cca6dcf 100644 --- a/keyboards/helix/pico/matrix.c +++ b/keyboards/helix/pico/matrix.c @@ -273,12 +273,6 @@ void matrix_slave_scan(void) {  #endif  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/helix/rev1/matrix.c b/keyboards/helix/rev1/matrix.c index aa2cc76905..f59391b596 100644 --- a/keyboards/helix/rev1/matrix.c +++ b/keyboards/helix/rev1/matrix.c @@ -239,12 +239,6 @@ void matrix_slave_scan(void) {  #endif  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/helix/rev2/matrix.c b/keyboards/helix/rev2/matrix.c index 8eed7e58b7..699c15358b 100644 --- a/keyboards/helix/rev2/matrix.c +++ b/keyboards/helix/rev2/matrix.c @@ -287,12 +287,6 @@ void matrix_slave_scan(void) {  #endif  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/hhkb/ansi/matrix.c b/keyboards/hhkb/ansi/matrix.c index 529ba8b8fc..5dde74cce9 100644 --- a/keyboards/hhkb/ansi/matrix.c +++ b/keyboards/hhkb/ansi/matrix.c @@ -163,15 +163,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        if (matrix[i] != matrix_prev[i]) -            return true; -    } -    return false; -} -  inline  bool matrix_has_ghost(void)  { diff --git a/keyboards/hhkb/jp/matrix.c b/keyboards/hhkb/jp/matrix.c index c0dca6a990..81db77fca7 100644 --- a/keyboards/hhkb/jp/matrix.c +++ b/keyboards/hhkb/jp/matrix.c @@ -164,15 +164,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        if (matrix[i] != matrix_prev[i]) -            return true; -    } -    return false; -} -  inline  bool matrix_has_ghost(void)  { diff --git a/keyboards/hid_liber/matrix.c b/keyboards/hid_liber/matrix.c index ff59a17153..da73c616d7 100755 --- a/keyboards/hid_liber/matrix.c +++ b/keyboards/hid_liber/matrix.c @@ -218,12 +218,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    // NOTE: no longer used -    return true; -} -  inline  bool matrix_has_ghost(void)  { diff --git a/keyboards/honeycomb/config.h b/keyboards/honeycomb/config.h index 725f9490cb..c959543618 100755 --- a/keyboards/honeycomb/config.h +++ b/keyboards/honeycomb/config.h @@ -45,12 +45,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/honeycomb/honeycomb.c b/keyboards/honeycomb/honeycomb.c index 1254196d39..603400c7a3 100755 --- a/keyboards/honeycomb/honeycomb.c +++ b/keyboards/honeycomb/honeycomb.c @@ -7,7 +7,7 @@ void pointing_device_task(void){      uint32_t timeout = 0;      //the m character requests the RF slave to send the mouse report -    SERIAL_UART_DATA = 'm'; +    uart_write('m');      //trust the external inputs completely, erase old data      uint8_t uart_data[5] = {0}; @@ -17,7 +17,7 @@ void pointing_device_task(void){          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while(!uart_available()){              timeout++;              if (timeout > 10000){  		xprintf("\r\nTIMED OUT"); @@ -25,7 +25,7 @@ void pointing_device_task(void){              }          }  	xprintf("\r\nGOT DATA for %d",i); -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, bytes 1-4 are movement and scroll diff --git a/keyboards/honeycomb/matrix.c b/keyboards/honeycomb/matrix.c index 7fef6f0fd8..fe1e4ce8ff 100755 --- a/keyboards/honeycomb/matrix.c +++ b/keyboards/honeycomb/matrix.c @@ -30,7 +30,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "honeycomb.h"  #include "pointing_device.h"  #include "report.h" -#include "protocol/serial.h" +#include "uart.h"  #if (MATRIX_COLS <= 8)  # define print_matrix_header()  print("\nr/c 01234567\n") @@ -95,7 +95,7 @@ uint8_t matrix_cols(void) {  void matrix_init(void) {      matrix_init_quantum(); -    serial_init(); +    uart_init(1000000);  }  uint8_t matrix_scan(void) @@ -103,7 +103,7 @@ uint8_t matrix_scan(void)      uint32_t timeout = 0;      // The 's' character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      // Trust the external keystates entirely, erase the last data      uint8_t uart_data[4] = {0}; @@ -113,14 +113,14 @@ uint8_t matrix_scan(void)          // Wait for the serial data, timeout if it's been too long          // This only happened in testing with a loose wire, but does no          // harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while(!uart_available()){              timeout++;              if (timeout > 10000){                  xprintf("\r\nTime out in keyboard.");                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      // Check for the end packet, it's our checksum. diff --git a/keyboards/honeycomb/rules.mk b/keyboards/honeycomb/rules.mk index 2b5eb0360c..a6029e3dbf 100755 --- a/keyboards/honeycomb/rules.mk +++ b/keyboards/honeycomb/rules.mk @@ -18,4 +18,5 @@ NKRO_ENABLE = yes           # Enable N-Key Rollover  # BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality  # # project specific files -SRC += matrix.c serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/kinesis/alvicstep/matrix.c b/keyboards/kinesis/alvicstep/matrix.c index 71619f8167..9c05374510 100644 --- a/keyboards/kinesis/alvicstep/matrix.c +++ b/keyboards/kinesis/alvicstep/matrix.c @@ -136,12 +136,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/kprepublic/bm65hsrgb_iso/config.h b/keyboards/kprepublic/bm65hsrgb_iso/rev1/config.h index 30b27dc26e..30b27dc26e 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/config.h +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/config.h diff --git a/keyboards/kprepublic/bm65hsrgb_iso/info.json b/keyboards/kprepublic/bm65hsrgb_iso/rev1/info.json index 9212c43339..9212c43339 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/info.json +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/info.json diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/config.h b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/config.h index 1dc1414fa5..1dc1414fa5 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/config.h +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/config.h diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.c index 46de987a68..46de987a68 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.c +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.c diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.h b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.h index 1459e2c5bb..1459e2c5bb 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.h +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.h diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/readme.md b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/readme.md index 095550b01a..095550b01a 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/readme.md +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/readme.md diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/rules.mk b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/rules.mk index c8354ea256..c8354ea256 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/rules.mk +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/rules.mk diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/default/keymap.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c index bed12e0f72..bed12e0f72 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/keymap.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/keymap.c index ae36e6b1f5..ae36e6b1f5 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/keymap.c +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/keymap.c diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/readme.md b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/readme.md index 87c7542756..87c7542756 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/readme.md +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/readme.md diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/rules.mk b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/rules.mk index 036bd6d1c3..036bd6d1c3 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/rules.mk +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/rules.mk diff --git a/keyboards/kprepublic/bm65hsrgb_iso/readme.md b/keyboards/kprepublic/bm65hsrgb_iso/rev1/readme.md index 752362e29a..752362e29a 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/readme.md +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/readme.md diff --git a/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.c index 134c271824..f351fa68a8 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.c +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.c @@ -13,7 +13,7 @@   * 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 "bm65hsrgb_iso.h" +#include "rev1.h"  #ifdef RGB_MATRIX_ENABLE  led_config_t g_led_config = { { diff --git a/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.h b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.h index 7f39c6f61b..7f39c6f61b 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.h +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.h diff --git a/keyboards/kprepublic/bm65hsrgb_iso/rules.mk b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rules.mk index c3a6bf1d48..c3a6bf1d48 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/rules.mk +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rules.mk diff --git a/keyboards/kprepublic/bm68hsrgb/config.h b/keyboards/kprepublic/bm68hsrgb/rev1/config.h index a779c97b7b..a779c97b7b 100644 --- a/keyboards/kprepublic/bm68hsrgb/config.h +++ b/keyboards/kprepublic/bm68hsrgb/rev1/config.h diff --git a/keyboards/kprepublic/bm68hsrgb/info.json b/keyboards/kprepublic/bm68hsrgb/rev1/info.json index 0a72da6e98..0a72da6e98 100644 --- a/keyboards/kprepublic/bm68hsrgb/info.json +++ b/keyboards/kprepublic/bm68hsrgb/rev1/info.json diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/default/keymap.c b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c index b4bc5cb59d..b4bc5cb59d 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/default/readme.md b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/readme.md index 0408ee9e98..0408ee9e98 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/default/readme.md +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/readme.md diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/config.h b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/config.h index 0748f83cdc..0748f83cdc 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/config.h +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/config.h diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.c b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.c index 934463b11f..934463b11f 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.c +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.c diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.h b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.h index e8d0170d4d..e8d0170d4d 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.h +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.h diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/readme.md b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/readme.md index 47899c27e1..47899c27e1 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/readme.md +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/readme.md diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/via/keymap.c b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/keymap.c index 46381c561c..46381c561c 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/via/keymap.c +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/keymap.c diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/via/readme.md b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/readme.md index c013ae25e2..c013ae25e2 100644 --- a/keyboards/kprepublic/bm68hsrgb/keymaps/via/readme.md +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/readme.md diff --git a/keyboards/wings42/rev1_extkeys/keymaps/via/rules.mk b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/rules.mk index 1e5b99807c..1e5b99807c 100644 --- a/keyboards/wings42/rev1_extkeys/keymaps/via/rules.mk +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/rules.mk diff --git a/keyboards/kprepublic/bm68hsrgb/readme.md b/keyboards/kprepublic/bm68hsrgb/rev1/readme.md index 54d71cab2c..54d71cab2c 100644 --- a/keyboards/kprepublic/bm68hsrgb/readme.md +++ b/keyboards/kprepublic/bm68hsrgb/rev1/readme.md diff --git a/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.c b/keyboards/kprepublic/bm68hsrgb/rev1/rev1.c index 734d2ee677..4634a662b6 100644 --- a/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.c +++ b/keyboards/kprepublic/bm68hsrgb/rev1/rev1.c @@ -14,7 +14,7 @@   * along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "bm68hsrgb.h" +#include "rev1.h"  #ifdef RGB_MATRIX_ENABLE  led_config_t g_led_config = { { diff --git a/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.h b/keyboards/kprepublic/bm68hsrgb/rev1/rev1.h index 3e18b914cc..3e18b914cc 100644 --- a/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.h +++ b/keyboards/kprepublic/bm68hsrgb/rev1/rev1.h diff --git a/keyboards/kprepublic/bm68hsrgb/rules.mk b/keyboards/kprepublic/bm68hsrgb/rev1/rules.mk index 92c37f393b..92c37f393b 100644 --- a/keyboards/kprepublic/bm68hsrgb/rules.mk +++ b/keyboards/kprepublic/bm68hsrgb/rev1/rules.mk diff --git a/keyboards/massdrop/alt/rules.mk b/keyboards/massdrop/alt/rules.mk index 83d4fc590b..f0ff36fa35 100644 --- a/keyboards/massdrop/alt/rules.mk +++ b/keyboards/massdrop/alt/rules.mk @@ -5,6 +5,9 @@ SRC += config_led.c  ARM_ATSAM = SAMD51J18A  MCU = cortex-m4 +# Bootloader selection +BOOTLOADER = md-boot +  # Build Options  #   change yes to no to disable  # diff --git a/keyboards/massdrop/ctrl/rules.mk b/keyboards/massdrop/ctrl/rules.mk index 667642f83d..a302c82d86 100644 --- a/keyboards/massdrop/ctrl/rules.mk +++ b/keyboards/massdrop/ctrl/rules.mk @@ -5,6 +5,9 @@ SRC += config_led.c  ARM_ATSAM = SAMD51J18A  MCU = cortex-m4 +# Bootloader selection +BOOTLOADER = md-boot +  # Build Options  #   change yes to no to disable  # diff --git a/keyboards/matrix/m20add/m20add.c b/keyboards/matrix/m20add/m20add.c index 21f4f9b1ba..4d328d6c54 100644 --- a/keyboards/matrix/m20add/m20add.c +++ b/keyboards/matrix/m20add/m20add.c @@ -53,25 +53,6 @@ bool led_update_kb(led_t led_state) {      return res;  } -// override the default implementation to avoid re-initialization -void i2c_init(void) -{ -    static bool initialized = false; -    if (initialized) { -        return; -    } else { -        initialized = true; -    } - -    // Try releasing special pins for a short time -    palSetLineMode(I2C1_SCL_PIN, PAL_MODE_INPUT); -    palSetLineMode(I2C1_SDA_PIN, PAL_MODE_INPUT); - -    chThdSleepMilliseconds(10); -    palSetLineMode(I2C1_SCL_PIN, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN); -    palSetLineMode(I2C1_SDA_PIN, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN); -} -  #define REBOOT_MAGIC 0x41544B42  void shutdown_user(void)  { diff --git a/keyboards/mechlovin/olly/jf/rules.mk b/keyboards/mechlovin/olly/jf/rules.mk index c0c9b2d7ea..2fafe64f12 100644 --- a/keyboards/mechlovin/olly/jf/rules.mk +++ b/keyboards/mechlovin/olly/jf/rules.mk @@ -5,7 +5,7 @@ MCU = atmega32a  F_CPU = 16000000  # Bootloader selection -BOOTLOADER = USBasp +BOOTLOADER = usbasploader  # Build Options  #   change yes to no to disable @@ -21,4 +21,4 @@ RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow  AUDIO_ENABLE = no           # Audio output  CUSTOM_MATRIX = lite -SRC += matrix.c
\ No newline at end of file +SRC += matrix.c diff --git a/keyboards/meira/matrix.c b/keyboards/meira/matrix.c index ae1ae5ce9d..8e8e9485b4 100644 --- a/keyboards/meira/matrix.c +++ b/keyboards/meira/matrix.c @@ -161,12 +161,6 @@ uint8_t matrix_scan(void)  	return ret;  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/mitosis/config.h b/keyboards/mitosis/config.h index 94e84e680e..2c72eed5f2 100644 --- a/keyboards/mitosis/config.h +++ b/keyboards/mitosis/config.h @@ -56,12 +56,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/mitosis/matrix.c b/keyboards/mitosis/matrix.c index 71c372a3ce..a92c3e8431 100644 --- a/keyboards/mitosis/matrix.c +++ b/keyboards/mitosis/matrix.c @@ -15,80 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} -void matrix_init(void) { +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[11] = {0}; @@ -98,58 +39,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } - -    matrix_scan_quantum(); -    return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/mitosis/rules.mk b/keyboards/mitosis/rules.mk index 6c7aa30d88..0a8a31e7dd 100644 --- a/keyboards/mitosis/rules.mk +++ b/keyboards/mitosis/rules.mk @@ -8,14 +8,17 @@ BOOTLOADER = caterina  #   change yes to no to disable  #  BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = yes	# Mouse keys -EXTRAKEY_ENABLE = yes	# Audio control and System control -CONSOLE_ENABLE = yes	# Console for debug -COMMAND_ENABLE = yes   # Commands for debug and configuration -CUSTOM_MATRIX = yes    # Remote matrix from the wireless bridge +MOUSEKEY_ENABLE = yes       # 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 = yes           # Enable N-Key Rollover -# BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality -UNICODE_ENABLE = yes 		# Unicode +BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow +AUDIO_ENABLE = no           # Audio output +UNICODE_ENABLE = yes +CUSTOM_MATRIX = lite -# # project specific files -SRC += matrix.c serial_uart.c +# project specific files +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/nek_type_a/matrix.c b/keyboards/nek_type_a/matrix.c index a59598a503..b396be9911 100644 --- a/keyboards/nek_type_a/matrix.c +++ b/keyboards/nek_type_a/matrix.c @@ -205,14 +205,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/planck/keymaps/thermal_printer/config.h b/keyboards/planck/keymaps/thermal_printer/config.h index 4ae9ced258..dd9d6a9d25 100644 --- a/keyboards/planck/keymaps/thermal_printer/config.h +++ b/keyboards/planck/keymaps/thermal_printer/config.h @@ -1,9 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define SERIAL_UART_BAUD 19200 +#pragma once  /*   * MIDI options @@ -21,8 +16,3 @@     - etc.  */  //#define MIDI_ADVANCED - -/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ -//#define MIDI_TONE_KEYCODE_OCTAVES 2 - - #endif
\ No newline at end of file diff --git a/keyboards/redox_w/config.h b/keyboards/redox_w/config.h index b480b072f9..c4aeb32d58 100644 --- a/keyboards/redox_w/config.h +++ b/keyboards/redox_w/config.h @@ -55,12 +55,3 @@  //#define NO_ACTION_ONESHOT  //#define NO_ACTION_MACRO  //#define NO_ACTION_FUNCTION - -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/redox_w/matrix.c b/keyboards/redox_w/matrix.c index 703987a939..fd25231d9e 100644 --- a/keyboards/redox_w/matrix.c +++ b/keyboards/redox_w/matrix.c @@ -13,89 +13,21 @@   * 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - -__attribute__ ((weak)) -void matrix_init_quantum(void) { -    matrix_init_kb(); -} - -__attribute__ ((weak)) -void matrix_scan_quantum(void) { -    matrix_scan_kb(); -} - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} - -void matrix_init(void) { +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[11] = {0}; @@ -105,58 +37,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 7; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 7; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } - -    matrix_scan_quantum(); -    return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/redox_w/rules.mk b/keyboards/redox_w/rules.mk index a8bd3a027a..8cb1736147 100644 --- a/keyboards/redox_w/rules.mk +++ b/keyboards/redox_w/rules.mk @@ -8,13 +8,16 @@ BOOTLOADER = caterina  #   change yes to no to disable  #  BOOTMAGIC_ENABLE = no       # Enable Bootmagic Lite -MOUSEKEY_ENABLE = yes	# Mouse keys -EXTRAKEY_ENABLE = yes	# Audio control and System control -CONSOLE_ENABLE = yes	# Console for debug -COMMAND_ENABLE = yes   # Commands for debug and configuration -CUSTOM_MATRIX = yes    # Remote matrix from the wireless bridge +MOUSEKEY_ENABLE = yes       # 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 = yes           # Enable N-Key Rollover -# BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow +AUDIO_ENABLE = no           # Audio output +CUSTOM_MATRIX = lite -# # project specific files -SRC += matrix.c serial_uart.c +# project specific files +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/redscarf_iiplus/verb/matrix.c b/keyboards/redscarf_iiplus/verb/matrix.c index 42cfb7c037..88ecb586b3 100755 --- a/keyboards/redscarf_iiplus/verb/matrix.c +++ b/keyboards/redscarf_iiplus/verb/matrix.c @@ -94,13 +94,6 @@ uint8_t matrix_cols(void) {      return MATRIX_COLS;  } -//Deprecated. -bool matrix_is_modified(void) -{ -    if (debounce_active()) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/redscarf_iiplus/verc/matrix.c b/keyboards/redscarf_iiplus/verc/matrix.c index 42cfb7c037..88ecb586b3 100755 --- a/keyboards/redscarf_iiplus/verc/matrix.c +++ b/keyboards/redscarf_iiplus/verc/matrix.c @@ -94,13 +94,6 @@ uint8_t matrix_cols(void) {      return MATRIX_COLS;  } -//Deprecated. -bool matrix_is_modified(void) -{ -    if (debounce_active()) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/redscarf_iiplus/verd/matrix.c b/keyboards/redscarf_iiplus/verd/matrix.c index 78d1191b68..d9dbb3c0a3 100644 --- a/keyboards/redscarf_iiplus/verd/matrix.c +++ b/keyboards/redscarf_iiplus/verd/matrix.c @@ -94,13 +94,6 @@ uint8_t matrix_cols(void) {      return MATRIX_COLS;  } -//Deprecated. -bool matrix_is_modified(void) -{ -    if (debounce_active()) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/rocketboard_16/rules.mk b/keyboards/rocketboard_16/rules.mk index d27da2c226..c07ebff427 100644 --- a/keyboards/rocketboard_16/rules.mk +++ b/keyboards/rocketboard_16/rules.mk @@ -8,7 +8,7 @@ MCU = STM32F103  MCU_LDSCRIPT = STM32F103xB_stm32duino_bootloader  OPT_DEFS += -DBOOTLOADER_STM32DUINO  BOARD = STM32_F103_STM32DUINO -STM32_BOOTLOADER_ADDRESS = 0x80000000 +BOOTLOADER_TYPE = stm32duino  DFU_ARGS = -d 1EAF:0003 -a 2 -R  DFU_SUFFIX_ARGS = -v 1EAF -p 0003 diff --git a/keyboards/sirius/uni660/rev1/config.h b/keyboards/sirius/uni660/rev1/config.h index 91d7c5d7a3..f9815844cb 100644 --- a/keyboards/sirius/uni660/rev1/config.h +++ b/keyboards/sirius/uni660/rev1/config.h @@ -57,13 +57,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define NO_ACTION_MACRO  #define NO_ACTION_FUNCTION -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); -  #define DYNAMIC_KEYMAP_LAYER_COUNT 4 diff --git a/keyboards/sirius/uni660/rev1/matrix.c b/keyboards/sirius/uni660/rev1/matrix.c index 2db6767a46..919db5c80d 100644 --- a/keyboards/sirius/uni660/rev1/matrix.c +++ b/keyboards/sirius/uni660/rev1/matrix.c @@ -15,83 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "debounce.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -void matrix_init(void) { -    debounce_init(MATRIX_ROWS); -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ -    bool matrix_has_changed = false; - +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[17] = {0}; @@ -101,60 +39,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 8; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 8; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } -    debounce(matrix, matrix, MATRIX_ROWS, matrix_has_changed); - -    matrix_scan_quantum(); - -    return matrix_has_changed; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/sirius/uni660/rev1/rules.mk b/keyboards/sirius/uni660/rev1/rules.mk index 836bf6b442..71cc3efd92 100644 --- a/keyboards/sirius/uni660/rev1/rules.mk +++ b/keyboards/sirius/uni660/rev1/rules.mk @@ -17,7 +17,8 @@ BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality  RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow  AUDIO_ENABLE = no           # Audio output  UNICODE_ENABLE = yes        # Unicode -CUSTOM_MATRIX = yes +CUSTOM_MATRIX = lite  # project specific files -SRC += matrix.c serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c diff --git a/keyboards/sirius/uni660/rev2/ansi/config.h b/keyboards/sirius/uni660/rev2/ansi/config.h index 13e33ebf11..8777dc4011 100644 --- a/keyboards/sirius/uni660/rev2/ansi/config.h +++ b/keyboards/sirius/uni660/rev2/ansi/config.h @@ -57,13 +57,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define NO_ACTION_MACRO  #define NO_ACTION_FUNCTION -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); -  #define DYNAMIC_KEYMAP_LAYER_COUNT 4 diff --git a/keyboards/sirius/uni660/rev2/iso/config.h b/keyboards/sirius/uni660/rev2/iso/config.h index 3283f0cd67..763230dca8 100644 --- a/keyboards/sirius/uni660/rev2/iso/config.h +++ b/keyboards/sirius/uni660/rev2/iso/config.h @@ -57,13 +57,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define NO_ACTION_MACRO  #define NO_ACTION_FUNCTION -//UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); -  #define DYNAMIC_KEYMAP_LAYER_COUNT 4 diff --git a/keyboards/sirius/uni660/rev2/matrix.c b/keyboards/sirius/uni660/rev2/matrix.c index 2db6767a46..919db5c80d 100644 --- a/keyboards/sirius/uni660/rev2/matrix.c +++ b/keyboards/sirius/uni660/rev2/matrix.c @@ -15,83 +15,21 @@ 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> -#if defined(__AVR__) -#include <avr/io.h> -#endif -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "timer.h" -#include "debounce.h" -#include "protocol/serial.h" - -#if (MATRIX_COLS <= 8) -#    define print_matrix_header()  print("\nr/c 01234567\n") -#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop(matrix[i]) -#    define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop16(matrix[i]) -#    define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row)) -#    define matrix_bitpop(i)       bitpop32(matrix[i]) -#    define ROW_SHIFTER  ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; - - -__attribute__ ((weak)) -void matrix_init_kb(void) { -    matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { -    matrix_scan_user(); -} -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) { -    return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) { -    return MATRIX_COLS; -} +#include "quantum.h" +#include "matrix.h" +#include "uart.h" -void matrix_init(void) { -    debounce_init(MATRIX_ROWS); -    matrix_init_quantum(); -    serial_init(); +void matrix_init_custom(void) { +    uart_init(1000000);  } -uint8_t matrix_scan(void) -{ -    bool matrix_has_changed = false; - +bool matrix_scan_custom(matrix_row_t current_matrix[]) {      uint32_t timeout = 0; +    bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[17] = {0}; @@ -101,60 +39,27 @@ uint8_t matrix_scan(void)          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while(!SERIAL_UART_RXD_PRESENT){ +        while (!uart_available()) {              timeout++; -            if (timeout > 10000){ +            if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0      //will only show up here if the correct bytes were recieved -    if (uart_data[10] == 0xE0) -    { +    if (uart_data[10] == 0xE0) {          //shifting and transferring the keystates to the QMK matrix variable          for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 8; +            matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 8; +            if (current_matrix[i] != current_row) { +                changed = true; +            } +            current_matrix[i] = current_row;          }      } -    debounce(matrix, matrix, MATRIX_ROWS, matrix_has_changed); - -    matrix_scan_quantum(); - -    return matrix_has_changed; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ -    return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ -    return matrix[row]; -} - -void matrix_print(void) -{ -    print_matrix_header(); - -    for (uint8_t row = 0; row < MATRIX_ROWS; row++) { -        print_hex8(row); print(": "); -        print_matrix_row(row); -        print("\n"); -    } -} - -uint8_t matrix_key_count(void) -{ -    uint8_t count = 0; -    for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -        count += matrix_bitpop(i); -    } -    return count; +    return changed;  } diff --git a/keyboards/sirius/uni660/rev2/rules.mk b/keyboards/sirius/uni660/rev2/rules.mk index 0abebb07c6..850c2a2e35 100644 --- a/keyboards/sirius/uni660/rev2/rules.mk +++ b/keyboards/sirius/uni660/rev2/rules.mk @@ -17,9 +17,10 @@ BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality  RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow  AUDIO_ENABLE = no           # Audio output  UNICODE_ENABLE = yes        # Unicode -CUSTOM_MATRIX = yes +CUSTOM_MATRIX = lite  # project specific files -SRC += matrix.c serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c  DEFAULT_FOLDER = sirius/uni660/rev2/ansi diff --git a/keyboards/sirius/unigo66/custom_matrix.cpp b/keyboards/sirius/unigo66/custom_matrix.cpp index fba107c7cb..dfcf82c779 100644 --- a/keyboards/sirius/unigo66/custom_matrix.cpp +++ b/keyboards/sirius/unigo66/custom_matrix.cpp @@ -172,10 +172,6 @@ extern "C"          return 1;      } -    bool matrix_is_modified(void) { -        return matrix_is_mod; -    } -      bool matrix_is_on(uint8_t row, uint8_t col) {          uint8_t code = CODE(row, col); diff --git a/keyboards/sixkeyboard/matrix.c b/keyboards/sixkeyboard/matrix.c index 64b46e9b0c..a6b28f3a12 100644 --- a/keyboards/sixkeyboard/matrix.c +++ b/keyboards/sixkeyboard/matrix.c @@ -114,11 +114,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/sx60/matrix.c b/keyboards/sx60/matrix.c index b7dc25425d..231e1c8836 100644 --- a/keyboards/sx60/matrix.c +++ b/keyboards/sx60/matrix.c @@ -172,14 +172,6 @@ uint8_t matrix_scan(void)      return 1;  } -bool matrix_is_modified(void) -{ -#if (DEBOUNCE > 0) -    if (debouncing) return false; -#endif -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/telophase/config.h b/keyboards/telophase/config.h index 51718da9d4..837bb8ab9b 100644 --- a/keyboards/telophase/config.h +++ b/keyboards/telophase/config.h @@ -72,12 +72,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  /* disable these deprecated features by default */  #define NO_ACTION_MACRO  #define NO_ACTION_FUNCTION - -// UART settings for communication with the RF microcontroller -#define SERIAL_UART_BAUD 1000000 -#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) -#define SERIAL_UART_INIT_CUSTOM       \ -    /* enable TX and RX */            \ -    UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ -    /* 8-bit data */                  \ -    UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); diff --git a/keyboards/telophase/matrix.c b/keyboards/telophase/matrix.c index a153dd4bf1..44b7e4c9e9 100644 --- a/keyboards/telophase/matrix.c +++ b/keyboards/telophase/matrix.c @@ -18,10 +18,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "quantum.h"  #include "matrix.h" -#include "protocol/serial.h" +#include "uart.h"  void matrix_init_custom(void) { -    serial_init(); +    uart_init(1000000);  }  bool matrix_scan_custom(matrix_row_t current_matrix[]) { @@ -29,7 +29,7 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {      bool changed = false;      //the s character requests the RF slave to send the matrix -    SERIAL_UART_DATA = 's'; +    uart_write('s');      //trust the external keystates entirely, erase the last data      uint8_t uart_data[13] = {0}; @@ -39,13 +39,13 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {          //wait for the serial data, timeout if it's been too long          //this only happened in testing with a loose wire, but does no          //harm to leave it in here -        while (!SERIAL_UART_RXD_PRESENT) { +        while (!uart_available()) {              timeout++;              if (timeout > 10000) {                  break;              }          } -        uart_data[i] = SERIAL_UART_DATA; +        uart_data[i] = uart_read();      }      //check for the end packet, the key state bytes use the LSBs, so 0xE0 diff --git a/keyboards/telophase/rules.mk b/keyboards/telophase/rules.mk index c3a8aaf79f..41a6ee25f5 100644 --- a/keyboards/telophase/rules.mk +++ b/keyboards/telophase/rules.mk @@ -19,7 +19,8 @@ AUDIO_ENABLE = no           # Audio output  CUSTOM_MATRIX = lite  # project specific files -SRC += matrix.c serial_uart.c +SRC += matrix.c +QUANTUM_LIB_SRC += uart.c  # Disable unsupported hardware  RGBLIGHT_SUPPORTED = no diff --git a/keyboards/tgr/jane/v2ce/rules.mk b/keyboards/tgr/jane/v2ce/rules.mk index 0a865321a6..8fcc8d911f 100644 --- a/keyboards/tgr/jane/v2ce/rules.mk +++ b/keyboards/tgr/jane/v2ce/rules.mk @@ -2,7 +2,7 @@  MCU = atmega32a  # Bootloader selection -BOOTLOADER = bootloadHID +BOOTLOADER = bootloadhid  # Build Options  #   change yes to no to disable diff --git a/keyboards/thedogkeyboard/matrix.c b/keyboards/thedogkeyboard/matrix.c index 474fbec030..2851859cf2 100644 --- a/keyboards/thedogkeyboard/matrix.c +++ b/keyboards/thedogkeyboard/matrix.c @@ -90,13 +90,6 @@ uint8_t matrix_cols(void) {      return MATRIX_COLS;  } -//Deprecated. -bool matrix_is_modified(void) -{ -    if (debounce_active()) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/keyboards/yanghu/unicorne/config.h b/keyboards/yanghu/unicorne/config.h index 652afeb3b4..27d21c7906 100644 --- a/keyboards/yanghu/unicorne/config.h +++ b/keyboards/yanghu/unicorne/config.h @@ -42,6 +42,12 @@  #define ENCODERS_PAD_B \      { B12, B0 } +/* I2C - required for custom i2c_init */ +#define I2C1_SCL_PIN B6 +#define I2C1_SDA_PIN B7 +#define I2C1_SCL_PAL_MODE 4 +#define I2C1_SDA_PAL_MODE 4 +  /* Audio */  #define AUDIO_PIN A8  #define AUDIO_PWM_PAL_MODE 1 diff --git a/keyboards/yosino58/rev1/matrix.c b/keyboards/yosino58/rev1/matrix.c index 3db40b3829..e2be7113bf 100644 --- a/keyboards/yosino58/rev1/matrix.c +++ b/keyboards/yosino58/rev1/matrix.c @@ -289,12 +289,6 @@ void matrix_slave_scan(void) {  #endif  } -bool matrix_is_modified(void) -{ -    if (debouncing) return false; -    return true; -} -  inline  bool matrix_is_on(uint8_t row, uint8_t col)  { diff --git a/lib/python/qmk/cli/generate/develop_pr_list.py b/lib/python/qmk/cli/generate/develop_pr_list.py index 07e46752a6..fab0262773 100755 --- a/lib/python/qmk/cli/generate/develop_pr_list.py +++ b/lib/python/qmk/cli/generate/develop_pr_list.py @@ -97,7 +97,7 @@ def generate_develop_pr_list(cli):          match = git_expr.search(line)          if match:              pr_info = _get_pr_info(cache, gh, match.group("pr")) -            commit_info = {'hash': match.group("hash"), 'title': match.group("title"), 'pr_num': int(match.group("pr")), 'pr_labels': [label.name for label in pr_info.labels.items]} +            commit_info = {'hash': match.group("hash"), 'title': pr_info['title'], 'pr_num': int(match.group("pr")), 'pr_labels': [label.name for label in pr_info.labels.items]}              _categorise_commit(commit_info)      def _dump_commit_list(name, collection): diff --git a/platforms/arm_atsam/bootloader.c b/platforms/arm_atsam/bootloaders/md_boot.c index 9015b00aab..e7508ffe51 100644 --- a/platforms/arm_atsam/bootloader.c +++ b/platforms/arm_atsam/bootloaders/md_boot.c @@ -15,13 +15,18 @@   */  #include "bootloader.h" +  #include "samd51j18a.h" -#include "md_bootloader.h" -// Set watchdog timer to reset. Directs the bootloader to stay in programming mode. -void bootloader_jump(void) {  #ifdef KEYBOARD_massdrop_ctrl -    // CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method. +// WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support +extern uint32_t _eram; + +#    define BOOTLOADER_MAGIC 0x3B9ACA00 +#    define MAGIC_ADDR (uint32_t *)((intptr_t)(&_eram) - 4) + +// CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method. +void bootloader_jump(void) {      uint8_t  ver_ram_method[] = "v2.18Jun 22 2018 17:28:08";  // The version to match (NULL terminated by compiler)      uint8_t *ver_check        = ver_ram_method;               // Pointer to version match string for traversal      uint8_t *ver_rom          = (uint8_t *)0x21A0;            // Pointer to address in ROM where this specific bootloader version would exist @@ -34,24 +39,34 @@ void bootloader_jump(void) {      if (!*ver_check) {                   // If check version pointer is NULL, all characters have matched          *MAGIC_ADDR = BOOTLOADER_MAGIC;  // Set magic number into RAM          NVIC_SystemReset();              // Perform system reset -        while (1) { -        }  // Won't get here + +        while (1) +            ;  // Won't get here      } -#endif +} +#else + +// Set watchdog timer to reset. Directs the bootloader to stay in programming mode. +void bootloader_jump(void) {      WDT->CTRLA.bit.ENABLE = 0; -    while (WDT->SYNCBUSY.bit.ENABLE) { -    } -    while (WDT->CTRLA.bit.ENABLE) { -    } + +    while (WDT->SYNCBUSY.bit.ENABLE) +        ; +    while (WDT->CTRLA.bit.ENABLE) +        ; +      WDT->CONFIG.bit.WINDOW   = 0;      WDT->CONFIG.bit.PER      = 0;      WDT->EWCTRL.bit.EWOFFSET = 0;      WDT->CTRLA.bit.ENABLE    = 1; -    while (WDT->SYNCBUSY.bit.ENABLE) { -    } -    while (!WDT->CTRLA.bit.ENABLE) { -    } -    while (1) { -    }  // Wait on timeout + +    while (WDT->SYNCBUSY.bit.ENABLE) +        ; +    while (!WDT->CTRLA.bit.ENABLE) +        ; + +    while (1) +        ;  // Wait on timeout  } +#endif diff --git a/platforms/arm_atsam/gpio.h b/platforms/arm_atsam/gpio.h index 915ed0ef4f..a42aaff54d 100644 --- a/platforms/arm_atsam/gpio.h +++ b/platforms/arm_atsam/gpio.h @@ -22,9 +22,9 @@  typedef uint8_t pin_t; -#define SAMD_PORT(pin) ((pin & 0x20) >> 5) -#define SAMD_PIN(pin) (pin & 0x1f) -#define SAMD_PIN_MASK(pin) (1 << (pin & 0x1f)) +#define SAMD_PORT(pin) (((pin)&0x20) >> 5) +#define SAMD_PIN(pin) ((pin)&0x1f) +#define SAMD_PIN_MASK(pin) (1 << ((pin)&0x1f))  #define setPinInput(pin)                                                                 \      do {                                                                                 \ @@ -48,12 +48,16 @@ typedef uint8_t pin_t;          PORT->Group[SAMD_PORT(pin)].PINCFG[SAMD_PIN(pin)].bit.PULLEN = 1;                  \      } while (0) -#define setPinOutput(pin)                                            \ +#define setPinOutputPushPull(pin)                                    \      do {                                                             \          PORT->Group[SAMD_PORT(pin)].DIRSET.reg = SAMD_PIN_MASK(pin); \          PORT->Group[SAMD_PORT(pin)].OUTCLR.reg = SAMD_PIN_MASK(pin); \      } while (0) +#define setPinOutputOpenDrain(pin) _Static_assert(0, "arm_atsam platform does not implement an open-drain output") + +#define setPinOutput(pin) setPinOutputPushPull(pin) +  #define writePinHigh(pin)                                            \      do {                                                             \          PORT->Group[SAMD_PORT(pin)].OUTSET.reg = SAMD_PIN_MASK(pin); \ diff --git a/platforms/avr/bootloader.c b/platforms/avr/bootloader.c deleted file mode 100644 index c0272903b8..0000000000 --- a/platforms/avr/bootloader.c +++ /dev/null @@ -1,293 +0,0 @@ -#include <stdint.h> -#include <stdbool.h> -#include <avr/io.h> -#include <avr/eeprom.h> -#include <avr/interrupt.h> -#include <avr/wdt.h> -#include <util/delay.h> -#include "bootloader.h" -#include <avr/boot.h> - -#ifdef PROTOCOL_LUFA -#    include <LUFA/Drivers/USB/USB.h> -#endif - -/** \brief Bootloader Size in *bytes* - * - * AVR Boot section size are defined by setting BOOTSZ fuse in fact. Consult with your MCU datasheet. - * Note that 'Word'(2 bytes) size and address are used in datasheet while TMK uses 'Byte'. - * - * Size of Bootloaders in bytes: - *   Atmel DFU loader(ATmega32U4)   4096 - *   Atmel DFU loader(AT90USB128)   8192 - *   LUFA bootloader(ATmega32U4)    4096 - *   Arduino Caterina(ATmega32U4)   4096 - *   USBaspLoader(ATmega***)        2048 - *   Teensy   halfKay(ATmega32U4)   512 - *   Teensy++ halfKay(AT90USB128)   1024 - * - * AVR Boot section is located at the end of Flash memory like the followings. - * - * byte     Atmel/LUFA(ATMega32u4)          byte     Atmel(AT90SUB128) - * 0x0000   +---------------+               0x00000  +---------------+ - *          |               |                        |               | - *          |               |                        |               | - *          |  Application  |                        |  Application  | - *          |               |                        |               | - *          =               =                        =               = - *          |               | 32KB-4KB               |               | 128KB-8KB - * 0x7000   +---------------+               0x1E000  +---------------+ - *          |  Bootloader   | 4KB                    |  Bootloader   | 8KB - * 0x7FFF   +---------------+               0x1FFFF  +---------------+ - * - * - * byte     Teensy(ATMega32u4)              byte     Teensy++(AT90SUB128) - * 0x0000   +---------------+               0x00000  +---------------+ - *          |               |                        |               | - *          |               |                        |               | - *          |  Application  |                        |  Application  | - *          |               |                        |               | - *          =               =                        =               = - *          |               | 32KB-512B              |               | 128KB-1KB - * 0x7E00   +---------------+               0x1FC00  +---------------+ - *          |  Bootloader   | 512B                   |  Bootloader   | 1KB - * 0x7FFF   +---------------+               0x1FFFF  +---------------+ - */ -#define FLASH_SIZE (FLASHEND + 1L) - -#if !defined(BOOTLOADER_SIZE) -uint16_t bootloader_start; -#endif - -// compatibility between ATMega8 and ATMega88 -#if !defined(MCUCSR) -#    if defined(MCUSR) -#        define MCUCSR MCUSR -#    endif -#endif - -/** \brief Entering the Bootloader via Software - * - * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html - */ -#define BOOTLOADER_RESET_KEY 0xB007B007 -uint32_t reset_key __attribute__((section(".noinit,\"aw\",@nobits;"))); - -/** \brief initialize MCU status by watchdog reset - * - * FIXME: needs doc - */ -__attribute__((weak)) void bootloader_jump(void) { -#if !defined(BOOTLOADER_SIZE) -    uint8_t high_fuse = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); - -    if (high_fuse & ~(FUSE_BOOTSZ0 & FUSE_BOOTSZ1)) { -        bootloader_start = (FLASH_SIZE - 512) >> 1; -    } else if (high_fuse & ~(FUSE_BOOTSZ1)) { -        bootloader_start = (FLASH_SIZE - 1024) >> 1; -    } else if (high_fuse & ~(FUSE_BOOTSZ0)) { -        bootloader_start = (FLASH_SIZE - 2048) >> 1; -    } else { -        bootloader_start = (FLASH_SIZE - 4096) >> 1; -    } -#endif - -    // Something like this might work, but it compiled larger than the block above -    // bootloader_start = FLASH_SIZE - (256 << (~high_fuse & 0b110 >> 1)); - -#if defined(BOOTLOADER_HALFKAY) -    //  http://www.pjrc.com/teensy/jump_to_bootloader.html -    cli(); -    // disable watchdog, if enabled (it's not) -    // disable all peripherals -    // a shutdown call might make sense here -    UDCON  = 1; -    USBCON = (1 << FRZCLK);  // disable USB -    UCSR1B = 0; -    _delay_ms(5); -#    if defined(__AVR_AT90USB162__)  // Teensy 1.0 -    EIMSK  = 0; -    PCICR  = 0; -    SPCR   = 0; -    ACSR   = 0; -    EECR   = 0; -    TIMSK0 = 0; -    TIMSK1 = 0; -    UCSR1B = 0; -    DDRB   = 0; -    DDRC   = 0; -    DDRD   = 0; -    PORTB  = 0; -    PORTC  = 0; -    PORTD  = 0; -    asm volatile("jmp 0x3E00"); -#    elif defined(__AVR_ATmega32U4__)   // Teensy 2.0 -    EIMSK  = 0; -    PCICR  = 0; -    SPCR   = 0; -    ACSR   = 0; -    EECR   = 0; -    ADCSRA = 0; -    TIMSK0 = 0; -    TIMSK1 = 0; -    TIMSK3 = 0; -    TIMSK4 = 0; -    UCSR1B = 0; -    TWCR   = 0; -    DDRB   = 0; -    DDRC   = 0; -    DDRD   = 0; -    DDRE   = 0; -    DDRF   = 0; -    TWCR   = 0; -    PORTB  = 0; -    PORTC  = 0; -    PORTD  = 0; -    PORTE  = 0; -    PORTF  = 0; -    asm volatile("jmp 0x7E00"); -#    elif defined(__AVR_AT90USB646__)   // Teensy++ 1.0 -    EIMSK  = 0; -    PCICR  = 0; -    SPCR   = 0; -    ACSR   = 0; -    EECR   = 0; -    ADCSRA = 0; -    TIMSK0 = 0; -    TIMSK1 = 0; -    TIMSK2 = 0; -    TIMSK3 = 0; -    UCSR1B = 0; -    TWCR   = 0; -    DDRA   = 0; -    DDRB   = 0; -    DDRC   = 0; -    DDRD   = 0; -    DDRE   = 0; -    DDRF   = 0; -    PORTA  = 0; -    PORTB  = 0; -    PORTC  = 0; -    PORTD  = 0; -    PORTE  = 0; -    PORTF  = 0; -    asm volatile("jmp 0xFC00"); -#    elif defined(__AVR_AT90USB1286__)  // Teensy++ 2.0 -    EIMSK  = 0; -    PCICR  = 0; -    SPCR   = 0; -    ACSR   = 0; -    EECR   = 0; -    ADCSRA = 0; -    TIMSK0 = 0; -    TIMSK1 = 0; -    TIMSK2 = 0; -    TIMSK3 = 0; -    UCSR1B = 0; -    TWCR   = 0; -    DDRA   = 0; -    DDRB   = 0; -    DDRC   = 0; -    DDRD   = 0; -    DDRE   = 0; -    DDRF   = 0; -    PORTA  = 0; -    PORTB  = 0; -    PORTC  = 0; -    PORTD  = 0; -    PORTE  = 0; -    PORTF  = 0; -    asm volatile("jmp 0x1FC00"); -#    endif - -#elif defined(BOOTLOADER_CATERINA) -    // this block may be optional -    // TODO: figure it out - -    uint16_t *const bootKeyPtr = (uint16_t *)0x0800; - -    // Value used by Caterina bootloader use to determine whether to run the -    // sketch or the bootloader programmer. -    uint16_t bootKey = 0x7777; - -    *bootKeyPtr = bootKey; - -    // setup watchdog timeout -    wdt_enable(WDTO_60MS); - -    while (1) { -    }  // wait for watchdog timer to trigger - -#elif defined(BOOTLOADER_USBASP) -    // Taken with permission of Stephan Baerwolf from https://github.com/tinyusbboard/API/blob/master/apipage.c -    wdt_enable(WDTO_15MS); -    wdt_reset(); -    asm volatile("cli                    \n\t" -                 "ldi    r29 ,       %[ramendhi] \n\t" -                 "ldi    r28 ,       %[ramendlo] \n\t" -#    if (FLASHEND > 131071) -                 "ldi    r18 ,       %[bootaddrhi]   \n\t" -                 "st     Y+,         r18     \n\t" -#    endif -                 "ldi    r18 ,       %[bootaddrme]   \n\t" -                 "st     Y+,     r18     \n\t" -                 "ldi    r18 ,       %[bootaddrlo]   \n\t" -                 "st     Y+,     r18     \n\t" -                 "out    %[mcucsrio],    __zero_reg__    \n\t" -                 "bootloader_startup_loop%=:         \n\t" -                 "rjmp bootloader_startup_loop%=     \n\t" -                 : -                 : [mcucsrio] "I"(_SFR_IO_ADDR(MCUCSR)), -#    if (FLASHEND > 131071) -                   [ramendhi] "M"(((RAMEND - 2) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 2) >> 0) & 0xff), [bootaddrhi] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 16) & 0xff), -#    else -                   [ramendhi] "M"(((RAMEND - 1) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 1) >> 0) & 0xff), -#    endif -                   [bootaddrme] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff), [bootaddrlo] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff)); - -#else  // Assume remaining boards are DFU, even if the flag isn't set - -#    if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATtiny85__))  // no USB - maybe BOOTLOADER_BOOTLOADHID instead though? -    UDCON  = 1; -    USBCON = (1 << FRZCLK);  // disable USB -    UCSR1B = 0; -    _delay_ms(5);  // 5 seems to work fine -#    endif - -#    ifdef BOOTLOADER_BOOTLOADHID -    // force bootloadHID to stay in bootloader mode, so that it waits -    // for a new firmware to be flashed -    eeprom_write_byte((uint8_t *)1, 0x00); -#    endif - -    // watchdog reset -    reset_key = BOOTLOADER_RESET_KEY; -    wdt_enable(WDTO_250MS); -    for (;;) -        ; -#endif -} - -/* this runs before main() */ -void bootloader_jump_after_watchdog_reset(void) __attribute__((used, naked, section(".init3"))); -void bootloader_jump_after_watchdog_reset(void) { -#ifndef BOOTLOADER_HALFKAY -    if ((MCUCSR & (1 << WDRF)) && reset_key == BOOTLOADER_RESET_KEY) { -        reset_key = 0; - -        // My custom USBasploader requires this to come up. -        MCUCSR = 0; - -        // Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog. -        MCUCSR &= ~(1 << WDRF); -        wdt_disable(); - -// This is compled into 'icall', address should be in word unit, not byte. -#    ifdef BOOTLOADER_SIZE -        ((void (*)(void))((FLASH_SIZE - BOOTLOADER_SIZE) >> 1))(); -#    else -        asm("ijmp" ::"z"(bootloader_start)); -#    endif -    } -#endif -} diff --git a/platforms/avr/bootloaders/bootloadhid.c b/platforms/avr/bootloaders/bootloadhid.c new file mode 100644 index 0000000000..ae58760d7d --- /dev/null +++ b/platforms/avr/bootloaders/bootloadhid.c @@ -0,0 +1,33 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <avr/eeprom.h> +#include <avr/wdt.h> + +__attribute__((weak)) void bootloader_jump(void) { +    // force bootloadHID to stay in bootloader mode, so that it waits +    // for a new firmware to be flashed +    // NOTE: this byte is part of QMK's "magic number" - changing it causes the EEPROM to be re-initialized +    // thus every time the device is flashed the EEPROM will be wiped +    eeprom_write_byte((uint8_t *)1, 0x00); + +    // watchdog reset +    wdt_enable(WDTO_250MS); +    for (;;) +        ; +} diff --git a/platforms/avr/bootloaders/caterina.c b/platforms/avr/bootloaders/caterina.c new file mode 100644 index 0000000000..82a16a3765 --- /dev/null +++ b/platforms/avr/bootloaders/caterina.c @@ -0,0 +1,39 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <avr/wdt.h> + +__attribute__((weak)) void bootloader_jump(void) { +    // this block may be optional +    // TODO: figure it out + +    uint16_t *const bootKeyPtr = (uint16_t *)0x0800; + +    // Value used by Caterina bootloader use to determine whether to run the +    // sketch or the bootloader programmer. +    uint16_t bootKey = 0x7777; + +    *bootKeyPtr = bootKey; + +    // setup watchdog timeout +    wdt_enable(WDTO_60MS); + +    // wait for watchdog timer to trigger +    while (1) { +    } +} diff --git a/platforms/avr/bootloaders/dfu.c b/platforms/avr/bootloaders/dfu.c new file mode 100644 index 0000000000..cb42821a93 --- /dev/null +++ b/platforms/avr/bootloaders/dfu.c @@ -0,0 +1,52 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <avr/wdt.h> +#include <util/delay.h> + +#define FLASH_SIZE (FLASHEND + 1L) + +/** \brief Entering the Bootloader via Software + * + * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html + */ +#define BOOTLOADER_RESET_KEY 0xB007B007 +uint32_t reset_key __attribute__((section(".noinit,\"aw\",@nobits;"))); + +__attribute__((weak)) void bootloader_jump(void) { +    UDCON  = 1; +    USBCON = (1 << FRZCLK);  // disable USB +    UCSR1B = 0; +    _delay_ms(5);  // 5 seems to work fine + +    // watchdog reset +    reset_key = BOOTLOADER_RESET_KEY; +    wdt_enable(WDTO_250MS); +    for (;;) +        ; +} + +/* this runs before main() */ +void bootloader_jump_after_watchdog_reset(void) __attribute__((used, naked, section(".init3"))); +void bootloader_jump_after_watchdog_reset(void) { +    if ((MCUSR & (1 << WDRF)) && reset_key == BOOTLOADER_RESET_KEY) { +        reset_key = 0; + +        ((void (*)(void))((FLASH_SIZE - BOOTLOADER_SIZE) >> 1))(); +    } +} diff --git a/platforms/avr/bootloaders/halfkay.c b/platforms/avr/bootloaders/halfkay.c new file mode 100644 index 0000000000..6ce2e19114 --- /dev/null +++ b/platforms/avr/bootloaders/halfkay.c @@ -0,0 +1,128 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <avr/interrupt.h> +#include <util/delay.h> + +__attribute__((weak)) void bootloader_jump(void) { +    // http://www.pjrc.com/teensy/jump_to_bootloader.html + +    cli(); +    // disable watchdog, if enabled (it's not) +    // disable all peripherals +    // a shutdown call might make sense here +    UDCON  = 1; +    USBCON = (1 << FRZCLK);  // disable USB +    UCSR1B = 0; +    _delay_ms(5); + +#if defined(__AVR_AT90USB162__)  // Teensy 1.0 +    EIMSK  = 0; +    PCICR  = 0; +    SPCR   = 0; +    ACSR   = 0; +    EECR   = 0; +    TIMSK0 = 0; +    TIMSK1 = 0; +    UCSR1B = 0; +    DDRB   = 0; +    DDRC   = 0; +    DDRD   = 0; +    PORTB  = 0; +    PORTC  = 0; +    PORTD  = 0; +    asm volatile("jmp 0x3E00"); +#elif defined(__AVR_ATmega32U4__)   // Teensy 2.0 +    EIMSK  = 0; +    PCICR  = 0; +    SPCR   = 0; +    ACSR   = 0; +    EECR   = 0; +    ADCSRA = 0; +    TIMSK0 = 0; +    TIMSK1 = 0; +    TIMSK3 = 0; +    TIMSK4 = 0; +    UCSR1B = 0; +    TWCR   = 0; +    DDRB   = 0; +    DDRC   = 0; +    DDRD   = 0; +    DDRE   = 0; +    DDRF   = 0; +    TWCR   = 0; +    PORTB  = 0; +    PORTC  = 0; +    PORTD  = 0; +    PORTE  = 0; +    PORTF  = 0; +    asm volatile("jmp 0x7E00"); +#elif defined(__AVR_AT90USB646__)   // Teensy++ 1.0 +    EIMSK  = 0; +    PCICR  = 0; +    SPCR   = 0; +    ACSR   = 0; +    EECR   = 0; +    ADCSRA = 0; +    TIMSK0 = 0; +    TIMSK1 = 0; +    TIMSK2 = 0; +    TIMSK3 = 0; +    UCSR1B = 0; +    TWCR   = 0; +    DDRA   = 0; +    DDRB   = 0; +    DDRC   = 0; +    DDRD   = 0; +    DDRE   = 0; +    DDRF   = 0; +    PORTA  = 0; +    PORTB  = 0; +    PORTC  = 0; +    PORTD  = 0; +    PORTE  = 0; +    PORTF  = 0; +    asm volatile("jmp 0xFC00"); +#elif defined(__AVR_AT90USB1286__)  // Teensy++ 2.0 +    EIMSK  = 0; +    PCICR  = 0; +    SPCR   = 0; +    ACSR   = 0; +    EECR   = 0; +    ADCSRA = 0; +    TIMSK0 = 0; +    TIMSK1 = 0; +    TIMSK2 = 0; +    TIMSK3 = 0; +    UCSR1B = 0; +    TWCR   = 0; +    DDRA   = 0; +    DDRB   = 0; +    DDRC   = 0; +    DDRD   = 0; +    DDRE   = 0; +    DDRF   = 0; +    PORTA  = 0; +    PORTB  = 0; +    PORTC  = 0; +    PORTD  = 0; +    PORTE  = 0; +    PORTF  = 0; +    asm volatile("jmp 0x1FC00"); +#endif +} diff --git a/platforms/avr/bootloaders/none.c b/platforms/avr/bootloaders/none.c new file mode 100644 index 0000000000..624fbe242a --- /dev/null +++ b/platforms/avr/bootloaders/none.c @@ -0,0 +1,19 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +__attribute__((weak)) void bootloader_jump(void) {} diff --git a/platforms/avr/bootloaders/usbasploader.c b/platforms/avr/bootloaders/usbasploader.c new file mode 100644 index 0000000000..008bd16069 --- /dev/null +++ b/platforms/avr/bootloaders/usbasploader.c @@ -0,0 +1,56 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <avr/wdt.h> + +#define FLASH_SIZE (FLASHEND + 1L) + +#if !defined(MCUCSR) +#    if defined(MCUSR) +#        define MCUCSR MCUSR +#    endif +#endif + +__attribute__((weak)) void bootloader_jump(void) { +    // Taken with permission of Stephan Baerwolf from https://github.com/tinyusbboard/API/blob/master/apipage.c + +    wdt_enable(WDTO_15MS); +    wdt_reset(); +    asm volatile("cli                    \n\t" +                 "ldi    r29 ,       %[ramendhi] \n\t" +                 "ldi    r28 ,       %[ramendlo] \n\t" +#if (FLASHEND > 131071) +                 "ldi    r18 ,       %[bootaddrhi]   \n\t" +                 "st     Y+,         r18     \n\t" +#endif +                 "ldi    r18 ,       %[bootaddrme]   \n\t" +                 "st     Y+,     r18     \n\t" +                 "ldi    r18 ,       %[bootaddrlo]   \n\t" +                 "st     Y+,     r18     \n\t" +                 "out    %[mcucsrio],    __zero_reg__    \n\t" +                 "bootloader_startup_loop%=:         \n\t" +                 "rjmp bootloader_startup_loop%=     \n\t" +                 : +                 : [mcucsrio] "I"(_SFR_IO_ADDR(MCUCSR)), +#if (FLASHEND > 131071) +                   [ramendhi] "M"(((RAMEND - 2) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 2) >> 0) & 0xff), [bootaddrhi] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 16) & 0xff), +#else +                   [ramendhi] "M"(((RAMEND - 1) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 1) >> 0) & 0xff), +#endif +                   [bootaddrme] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff), [bootaddrlo] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff)); +} diff --git a/platforms/avr/drivers/i2c_master.c b/platforms/avr/drivers/i2c_master.c index 111b55d6b0..d4024378ca 100644 --- a/platforms/avr/drivers/i2c_master.c +++ b/platforms/avr/drivers/i2c_master.c @@ -32,6 +32,9 @@  #    define I2C_START_RETRY_COUNT 20  #endif  // I2C_START_RETRY_COUNT +#define I2C_ACTION_READ 0x01 +#define I2C_ACTION_WRITE 0x00 +  #define TWBR_val (((F_CPU / F_SCL) - 16) / 2)  #define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) @@ -154,7 +157,7 @@ int16_t i2c_read_nack(uint16_t timeout) {  }  i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout) { -    i2c_status_t status = i2c_start(address | I2C_WRITE, timeout); +    i2c_status_t status = i2c_start(address | I2C_ACTION_WRITE, timeout);      for (uint16_t i = 0; i < length && status >= 0; i++) {          status = i2c_write(data[i], timeout); @@ -166,7 +169,7 @@ i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length,  }  i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) { -    i2c_status_t status = i2c_start(address | I2C_READ, timeout); +    i2c_status_t status = i2c_start(address | I2C_ACTION_READ, timeout);      for (uint16_t i = 0; i < (length - 1) && status >= 0; i++) {          status = i2c_read_ack(timeout); diff --git a/platforms/avr/drivers/serial.c b/platforms/avr/drivers/serial.c index 9a7345a53d..ab0b52afd1 100644 --- a/platforms/avr/drivers/serial.c +++ b/platforms/avr/drivers/serial.c @@ -16,6 +16,7 @@  #include <util/delay.h>  #include <stddef.h>  #include <stdbool.h> +#include "gpio.h"  #include "serial.h"  #ifdef SOFT_SERIAL_PIN @@ -119,12 +120,6 @@  #        error invalid SOFT_SERIAL_PIN value  #    endif -#    define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) -#    define setPinOutput(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF)) -#    define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) -#    define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) -#    define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF))) -  #    define ALWAYS_INLINE __attribute__((always_inline))  #    define NO_INLINE __attribute__((noinline))  #    define _delay_sub_us(x) __builtin_avr_delay_cycles(x) diff --git a/platforms/avr/gpio.h b/platforms/avr/gpio.h index e9be68491d..95f15c28dc 100644 --- a/platforms/avr/gpio.h +++ b/platforms/avr/gpio.h @@ -25,7 +25,9 @@ typedef uint8_t pin_t;  #define setPinInput(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF))  #define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF))  #define setPinInputLow(pin) _Static_assert(0, "AVR processors cannot implement an input as pull low") -#define setPinOutput(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF)) +#define setPinOutputPushPull(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF)) +#define setPinOutputOpenDrain(pin) _Static_assert(0, "AVR platform does not implement an open-drain output") +#define setPinOutput(pin) setPinOutputPushPull(pin)  #define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF))  #define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) @@ -34,16 +36,3 @@ typedef uint8_t pin_t;  #define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF)))  #define togglePin(pin) (PORTx_ADDRESS(pin) ^= _BV((pin)&0xF)) - -/* Operation of GPIO by port. */ - -typedef uint8_t port_data_t; - -#define readPort(port) PINx_ADDRESS(port) - -#define setPortBitInput(port, bit) (DDRx_ADDRESS(port) &= ~_BV((bit)&0xF), PORTx_ADDRESS(port) &= ~_BV((bit)&0xF)) -#define setPortBitInputHigh(port, bit) (DDRx_ADDRESS(port) &= ~_BV((bit)&0xF), PORTx_ADDRESS(port) |= _BV((bit)&0xF)) -#define setPortBitOutput(port, bit) (DDRx_ADDRESS(port) |= _BV((bit)&0xF)) - -#define writePortBitLow(port, bit) (PORTx_ADDRESS(port) &= ~_BV((bit)&0xF)) -#define writePortBitHigh(port, bit) (PORTx_ADDRESS(port) |= _BV((bit)&0xF)) diff --git a/platforms/chibios/bootloader.c b/platforms/chibios/bootloader.c deleted file mode 100644 index 58212948b0..0000000000 --- a/platforms/chibios/bootloader.c +++ /dev/null @@ -1,145 +0,0 @@ -#include "bootloader.h" - -#include <ch.h> -#include <hal.h> -#include "wait.h" - -/* This code should be checked whether it runs correctly on platforms */ -#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0)) -#define BOOTLOADER_MAGIC 0xDEADBEEF -#define MAGIC_ADDR (unsigned long *)(SYMVAL(__ram0_end__) - 4) - -#ifndef STM32_BOOTLOADER_DUAL_BANK -#    define STM32_BOOTLOADER_DUAL_BANK FALSE -#endif - -#ifdef BOOTLOADER_TINYUF2 - -#    define DBL_TAP_MAGIC 0xf01669ef  // From tinyuf2's board_api.h - -// defined by linker script -extern uint32_t _board_dfu_dbl_tap[]; -#    define DBL_TAP_REG _board_dfu_dbl_tap[0] - -void bootloader_jump(void) { -    DBL_TAP_REG = DBL_TAP_MAGIC; -    NVIC_SystemReset(); -} - -void enter_bootloader_mode_if_requested(void) { /* not needed, no two-stage reset */ -} - -#elif STM32_BOOTLOADER_DUAL_BANK - -// Need pin definitions -#    include "config_common.h" - -#    ifndef STM32_BOOTLOADER_DUAL_BANK_GPIO -#        error "No STM32_BOOTLOADER_DUAL_BANK_GPIO defined, don't know which pin to toggle" -#    endif - -#    ifndef STM32_BOOTLOADER_DUAL_BANK_POLARITY -#        define STM32_BOOTLOADER_DUAL_BANK_POLARITY 0 -#    endif - -#    ifndef STM32_BOOTLOADER_DUAL_BANK_DELAY -#        define STM32_BOOTLOADER_DUAL_BANK_DELAY 100000 -#    endif - -extern uint32_t __ram0_end__; - -__attribute__((weak)) void bootloader_jump(void) { -    // For STM32 MCUs with dual-bank flash, and we're incapable of jumping to the bootloader. The first valid flash -    // bank is executed unconditionally after a reset, so it doesn't enter DFU unless BOOT0 is high. Instead, we do -    // it with hardware...in this case, we pull a GPIO high/low depending on the configuration, connects 3.3V to -    // BOOT0's RC charging circuit, lets it charge the capacitor, and issue a system reset. See the QMK discord -    // #hardware channel pins for an example circuit. -    palSetPadMode(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_MODE_OUTPUT_PUSHPULL); -#    if STM32_BOOTLOADER_DUAL_BANK_POLARITY -    palSetPad(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO)); -#    else -    palClearPad(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO)); -#    endif - -    // Wait for a while for the capacitor to charge -    wait_ms(100); - -    // Issue a system reset to get the ROM bootloader to execute, with BOOT0 high -    NVIC_SystemReset(); -} - -void enter_bootloader_mode_if_requested(void) {}  // not needed at all, but if anybody attempts to invoke it.... - -#elif defined(STM32_BOOTLOADER_ADDRESS)  // STM32_BOOTLOADER_DUAL_BANK - -extern uint32_t __ram0_end__; - -__attribute__((weak)) void bootloader_jump(void) { -    *MAGIC_ADDR = BOOTLOADER_MAGIC;  // set magic flag => reset handler will jump into boot loader -    NVIC_SystemReset(); -} - -void enter_bootloader_mode_if_requested(void) { -    unsigned long *check = MAGIC_ADDR; -    if (*check == BOOTLOADER_MAGIC) { -        *check = 0; -        __set_CONTROL(0); -        __set_MSP(*(__IO uint32_t *)STM32_BOOTLOADER_ADDRESS); -        __enable_irq(); - -        typedef void (*BootJump_t)(void); -        BootJump_t boot_jump = *(BootJump_t *)(STM32_BOOTLOADER_ADDRESS + 4); -        boot_jump(); -        while (1) -            ; -    } -} - -#elif defined(GD32VF103) - -#    define DBGMCU_KEY_UNLOCK 0x4B5A6978 -#    define DBGMCU_CMD_RESET 0x1 - -__IO uint32_t *DBGMCU_KEY = (uint32_t *)DBGMCU_BASE + 0x0CU; -__IO uint32_t *DBGMCU_CMD = (uint32_t *)DBGMCU_BASE + 0x08U; - -__attribute__((weak)) void bootloader_jump(void) { -    /* The MTIMER unit of the GD32VF103 doesn't have the MSFRST -     * register to generate a software reset request. -     * BUT instead two undocumented registers in the debug peripheral -     * that allow issueing a software reset. WHO would need the MSFRST -     * register anyway? Source: -     * https://github.com/esmil/gd32vf103inator/blob/master/include/gd32vf103/dbg.h */ -    *DBGMCU_KEY = DBGMCU_KEY_UNLOCK; -    *DBGMCU_CMD = DBGMCU_CMD_RESET; -} - -void enter_bootloader_mode_if_requested(void) { /* Jumping to bootloader is not possible from user code. */ -} - -#elif defined(KL2x) || defined(K20x) || defined(MK66F18) || defined(MIMXRT1062)  // STM32_BOOTLOADER_DUAL_BANK // STM32_BOOTLOADER_ADDRESS -/* Kinetis */ - -#    if defined(BOOTLOADER_KIIBOHD) -/* Kiibohd Bootloader (MCHCK and Infinity KB) */ -#        define SCB_AIRCR_VECTKEY_WRITEMAGIC 0x05FA0000 -const uint8_t              sys_reset_to_loader_magic[] = "\xff\x00\x7fRESET TO LOADER\x7f\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; -__attribute__((weak)) void bootloader_jump(void) { -    void *volatile vbat = (void *)VBAT; -    __builtin_memcpy(vbat, (const void *)sys_reset_to_loader_magic, sizeof(sys_reset_to_loader_magic)); -    // request reset -    SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk; -} - -#    else /* defined(BOOTLOADER_KIIBOHD) */ -/* Default for Kinetis - expecting an ARM Teensy */ -#        include "wait.h" -__attribute__((weak)) void bootloader_jump(void) { -    wait_ms(100); -    __BKPT(0); -} -#    endif /* defined(BOOTLOADER_KIIBOHD) */ - -#else /* neither STM32 nor KINETIS */ -__attribute__((weak)) void bootloader_jump(void) {} -#endif diff --git a/platforms/chibios/bootloaders/gd32v_dfu.c b/platforms/chibios/bootloaders/gd32v_dfu.c new file mode 100644 index 0000000000..7a979638e3 --- /dev/null +++ b/platforms/chibios/bootloaders/gd32v_dfu.c @@ -0,0 +1,39 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <ch.h> + +#define DBGMCU_KEY_UNLOCK 0x4B5A6978 +#define DBGMCU_CMD_RESET 0x1 + +__IO uint32_t *DBGMCU_KEY = (uint32_t *)DBGMCU_BASE + 0x0CU; +__IO uint32_t *DBGMCU_CMD = (uint32_t *)DBGMCU_BASE + 0x08U; + +__attribute__((weak)) void bootloader_jump(void) { +    /* The MTIMER unit of the GD32VF103 doesn't have the MSFRST +     * register to generate a software reset request. +     * BUT instead two undocumented registers in the debug peripheral +     * that allow issueing a software reset. WHO would need the MSFRST +     * register anyway? Source: +     * https://github.com/esmil/gd32vf103inator/blob/master/include/gd32vf103/dbg.h */ +    *DBGMCU_KEY = DBGMCU_KEY_UNLOCK; +    *DBGMCU_CMD = DBGMCU_CMD_RESET; +} + +/* Jumping to bootloader is not possible from user code. */ +void enter_bootloader_mode_if_requested(void) {} diff --git a/platforms/chibios/bootloaders/halfkay.c b/platforms/chibios/bootloaders/halfkay.c new file mode 100644 index 0000000000..168c2abc23 --- /dev/null +++ b/platforms/chibios/bootloaders/halfkay.c @@ -0,0 +1,25 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <ch.h> +#include "wait.h" + +__attribute__((weak)) void bootloader_jump(void) { +    wait_ms(100); +    __BKPT(0); +} diff --git a/platforms/chibios/bootloaders/kiibohd.c b/platforms/chibios/bootloaders/kiibohd.c new file mode 100644 index 0000000000..911e807092 --- /dev/null +++ b/platforms/chibios/bootloaders/kiibohd.c @@ -0,0 +1,32 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <ch.h> + +/* Kiibohd Bootloader (MCHCK and Infinity KB) */ +#define SCB_AIRCR_VECTKEY_WRITEMAGIC 0x05FA0000 + +const uint8_t sys_reset_to_loader_magic[] = "\xff\x00\x7fRESET TO LOADER\x7f\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + +__attribute__((weak)) void bootloader_jump(void) { +    void *volatile vbat = (void *)VBAT; +    __builtin_memcpy(vbat, (const void *)sys_reset_to_loader_magic, sizeof(sys_reset_to_loader_magic)); + +    // request reset +    SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk; +} diff --git a/platforms/chibios/bootloaders/none.c b/platforms/chibios/bootloaders/none.c new file mode 100644 index 0000000000..624fbe242a --- /dev/null +++ b/platforms/chibios/bootloaders/none.c @@ -0,0 +1,19 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +__attribute__((weak)) void bootloader_jump(void) {} diff --git a/platforms/chibios/bootloaders/stm32_dfu.c b/platforms/chibios/bootloaders/stm32_dfu.c new file mode 100644 index 0000000000..0a113570f7 --- /dev/null +++ b/platforms/chibios/bootloaders/stm32_dfu.c @@ -0,0 +1,94 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <ch.h> +#include <hal.h> +#include "wait.h" + +extern uint32_t __ram0_end__; + +#ifndef STM32_BOOTLOADER_DUAL_BANK +#    define STM32_BOOTLOADER_DUAL_BANK FALSE +#endif + +#if STM32_BOOTLOADER_DUAL_BANK +#    include "config_common.h" + +#    ifndef STM32_BOOTLOADER_DUAL_BANK_GPIO +#        error "No STM32_BOOTLOADER_DUAL_BANK_GPIO defined, don't know which pin to toggle" +#    endif + +#    ifndef STM32_BOOTLOADER_DUAL_BANK_POLARITY +#        define STM32_BOOTLOADER_DUAL_BANK_POLARITY 0 +#    endif + +#    ifndef STM32_BOOTLOADER_DUAL_BANK_DELAY +#        define STM32_BOOTLOADER_DUAL_BANK_DELAY 100000 +#    endif + +__attribute__((weak)) void bootloader_jump(void) { +    // For STM32 MCUs with dual-bank flash, and we're incapable of jumping to the bootloader. The first valid flash +    // bank is executed unconditionally after a reset, so it doesn't enter DFU unless BOOT0 is high. Instead, we do +    // it with hardware...in this case, we pull a GPIO high/low depending on the configuration, connects 3.3V to +    // BOOT0's RC charging circuit, lets it charge the capacitor, and issue a system reset. See the QMK discord +    // #hardware channel pins for an example circuit. +    palSetPadMode(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_MODE_OUTPUT_PUSHPULL); +#    if STM32_BOOTLOADER_DUAL_BANK_POLARITY +    palSetPad(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO)); +#    else +    palClearPad(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO)); +#    endif + +    // Wait for a while for the capacitor to charge +    wait_ms(100); + +    // Issue a system reset to get the ROM bootloader to execute, with BOOT0 high +    NVIC_SystemReset(); +} + +// not needed at all, but if anybody attempts to invoke it.... +void enter_bootloader_mode_if_requested(void) {} + +#else + +/* This code should be checked whether it runs correctly on platforms */ +#    define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0)) +#    define BOOTLOADER_MAGIC 0xDEADBEEF +#    define MAGIC_ADDR (unsigned long *)(SYMVAL(__ram0_end__) - 4) + +__attribute__((weak)) void bootloader_jump(void) { +    *MAGIC_ADDR = BOOTLOADER_MAGIC;  // set magic flag => reset handler will jump into boot loader +    NVIC_SystemReset(); +} + +void enter_bootloader_mode_if_requested(void) { +    unsigned long *check = MAGIC_ADDR; +    if (*check == BOOTLOADER_MAGIC) { +        *check = 0; +        __set_CONTROL(0); +        __set_MSP(*(__IO uint32_t *)STM32_BOOTLOADER_ADDRESS); +        __enable_irq(); + +        typedef void (*BootJump_t)(void); +        BootJump_t boot_jump = *(BootJump_t *)(STM32_BOOTLOADER_ADDRESS + 4); +        boot_jump(); +        while (1) +            ; +    } +} +#endif diff --git a/platforms/chibios/bootloaders/stm32duino.c b/platforms/chibios/bootloaders/stm32duino.c new file mode 100644 index 0000000000..dd1d551fa9 --- /dev/null +++ b/platforms/chibios/bootloaders/stm32duino.c @@ -0,0 +1,21 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <ch.h> + +__attribute__((weak)) void bootloader_jump(void) { NVIC_SystemReset(); } diff --git a/platforms/chibios/bootloaders/tinyuf2.c b/platforms/chibios/bootloaders/tinyuf2.c new file mode 100644 index 0000000000..9ffca5dec8 --- /dev/null +++ b/platforms/chibios/bootloaders/tinyuf2.c @@ -0,0 +1,34 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 "bootloader.h" + +#include <ch.h> + +// From tinyuf2's board_api.h +#define DBL_TAP_MAGIC 0xF01669EF + +// defined by linker script +extern uint32_t _board_dfu_dbl_tap[]; +#define DBL_TAP_REG _board_dfu_dbl_tap[0] + +__attribute__((weak)) void bootloader_jump(void) { +    DBL_TAP_REG = DBL_TAP_MAGIC; +    NVIC_SystemReset(); +} + +/* not needed, no two-stage reset */ +void enter_bootloader_mode_if_requested(void) {} diff --git a/platforms/chibios/drivers/i2c_master.c b/platforms/chibios/drivers/i2c_master.c index 43591d56f8..4a5d4760d0 100644 --- a/platforms/chibios/drivers/i2c_master.c +++ b/platforms/chibios/drivers/i2c_master.c @@ -27,8 +27,67 @@  #include "quantum.h"  #include "i2c_master.h"  #include <string.h> +#include <ch.h>  #include <hal.h> +#ifndef I2C1_SCL_PIN +#    define I2C1_SCL_PIN B6 +#endif +#ifndef I2C1_SDA_PIN +#    define I2C1_SDA_PIN B7 +#endif + +#ifdef USE_I2CV1 +#    ifndef I2C1_OPMODE +#        define I2C1_OPMODE OPMODE_I2C +#    endif +#    ifndef I2C1_CLOCK_SPEED +#        define I2C1_CLOCK_SPEED 100000 /* 400000 */ +#    endif +#    ifndef I2C1_DUTY_CYCLE +#        define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */ +#    endif +#else +// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock +// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html +#    ifndef I2C1_TIMINGR_PRESC +#        define I2C1_TIMINGR_PRESC 0U +#    endif +#    ifndef I2C1_TIMINGR_SCLDEL +#        define I2C1_TIMINGR_SCLDEL 7U +#    endif +#    ifndef I2C1_TIMINGR_SDADEL +#        define I2C1_TIMINGR_SDADEL 0U +#    endif +#    ifndef I2C1_TIMINGR_SCLH +#        define I2C1_TIMINGR_SCLH 38U +#    endif +#    ifndef I2C1_TIMINGR_SCLL +#        define I2C1_TIMINGR_SCLL 129U +#    endif +#endif + +#ifndef I2C_DRIVER +#    define I2C_DRIVER I2CD1 +#endif + +#ifdef USE_GPIOV1 +#    ifndef I2C1_SCL_PAL_MODE +#        define I2C1_SCL_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN +#    endif +#    ifndef I2C1_SDA_PAL_MODE +#        define I2C1_SDA_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN +#    endif +#else +// The default PAL alternate modes are used to signal that the pins are used for I2C +#    ifndef I2C1_SCL_PAL_MODE +#        define I2C1_SCL_PAL_MODE 4 +#    endif +#    ifndef I2C1_SDA_PAL_MODE +#        define I2C1_SDA_PAL_MODE 4 +#    endif +#endif +  static uint8_t i2c_address;  static const I2CConfig i2cconfig = { diff --git a/platforms/chibios/drivers/i2c_master.h b/platforms/chibios/drivers/i2c_master.h index 5f082e9d1e..deee7ecc08 100644 --- a/platforms/chibios/drivers/i2c_master.h +++ b/platforms/chibios/drivers/i2c_master.h @@ -24,66 +24,7 @@   */  #pragma once -#include <ch.h> -#include <hal.h> - -#ifndef I2C1_SCL_PIN -#    define I2C1_SCL_PIN B6 -#endif -#ifndef I2C1_SDA_PIN -#    define I2C1_SDA_PIN B7 -#endif - -#ifdef USE_I2CV1 -#    ifndef I2C1_OPMODE -#        define I2C1_OPMODE OPMODE_I2C -#    endif -#    ifndef I2C1_CLOCK_SPEED -#        define I2C1_CLOCK_SPEED 100000 /* 400000 */ -#    endif -#    ifndef I2C1_DUTY_CYCLE -#        define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */ -#    endif -#else -// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock -// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html -#    ifndef I2C1_TIMINGR_PRESC -#        define I2C1_TIMINGR_PRESC 0U -#    endif -#    ifndef I2C1_TIMINGR_SCLDEL -#        define I2C1_TIMINGR_SCLDEL 7U -#    endif -#    ifndef I2C1_TIMINGR_SDADEL -#        define I2C1_TIMINGR_SDADEL 0U -#    endif -#    ifndef I2C1_TIMINGR_SCLH -#        define I2C1_TIMINGR_SCLH 38U -#    endif -#    ifndef I2C1_TIMINGR_SCLL -#        define I2C1_TIMINGR_SCLL 129U -#    endif -#endif - -#ifndef I2C_DRIVER -#    define I2C_DRIVER I2CD1 -#endif - -#ifdef USE_GPIOV1 -#    ifndef I2C1_SCL_PAL_MODE -#        define I2C1_SCL_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN -#    endif -#    ifndef I2C1_SDA_PAL_MODE -#        define I2C1_SDA_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN -#    endif -#else -// The default PAL alternate modes are used to signal that the pins are used for I2C -#    ifndef I2C1_SCL_PAL_MODE -#        define I2C1_SCL_PAL_MODE 4 -#    endif -#    ifndef I2C1_SDA_PAL_MODE -#        define I2C1_SDA_PAL_MODE 4 -#    endif -#endif +#include <stdint.h>  typedef int16_t i2c_status_t; diff --git a/platforms/chibios/gpio.h b/platforms/chibios/gpio.h index 4d057f1cab..eb44a18f9c 100644 --- a/platforms/chibios/gpio.h +++ b/platforms/chibios/gpio.h @@ -22,10 +22,12 @@ typedef ioline_t pin_t;  /* Operation of GPIO by pin. */ -#define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT) -#define setPinInputHigh(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLUP) -#define setPinInputLow(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN) -#define setPinOutput(pin) palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL) +#define setPinInput(pin) palSetLineMode((pin), PAL_MODE_INPUT) +#define setPinInputHigh(pin) palSetLineMode((pin), PAL_MODE_INPUT_PULLUP) +#define setPinInputLow(pin) palSetLineMode((pin), PAL_MODE_INPUT_PULLDOWN) +#define setPinOutputPushPull(pin) palSetLineMode((pin), PAL_MODE_OUTPUT_PUSHPULL) +#define setPinOutputOpenDrain(pin) palSetLineMode((pin), PAL_MODE_OUTPUT_OPENDRAIN) +#define setPinOutput(pin) setPinOutputPushPull(pin)  #define writePinHigh(pin) palSetLine(pin)  #define writePinLow(pin) palClearLine(pin) @@ -34,17 +36,3 @@ typedef ioline_t pin_t;  #define readPin(pin) palReadLine(pin)  #define togglePin(pin) palToggleLine(pin) - -/* Operation of GPIO by port. */ - -typedef uint16_t port_data_t; - -#define readPort(pin) palReadPort(PAL_PORT(pin)) - -#define setPortBitInput(pin, bit) palSetPadMode(PAL_PORT(pin), bit, PAL_MODE_INPUT) -#define setPortBitInputHigh(pin, bit) palSetPadMode(PAL_PORT(pin), bit, PAL_MODE_INPUT_PULLUP) -#define setPortBitInputLow(pin, bit) palSetPadMode(PAL_PORT(pin), bit, PAL_MODE_INPUT_PULLDOWN) -#define setPortBitOutput(pin, bit) palSetPadMode(PAL_PORT(pin), bit, PAL_MODE_OUTPUT_PUSHPULL) - -#define writePortBitLow(pin, bit) palClearLine(PAL_LINE(PAL_PORT(pin), bit)) -#define writePortBitHigh(pin, bit) palSetLine(PAL_LINE(PAL_PORT(pin), bit)) diff --git a/platforms/common.mk b/platforms/common.mk index f7a0fc7028..12ab45f823 100644 --- a/platforms/common.mk +++ b/platforms/common.mk @@ -4,7 +4,7 @@ TMK_COMMON_SRC +=	\  	$(PLATFORM_COMMON_DIR)/platform.c \  	$(PLATFORM_COMMON_DIR)/suspend.c \  	$(PLATFORM_COMMON_DIR)/timer.c \ -	$(PLATFORM_COMMON_DIR)/bootloader.c \ +	$(PLATFORM_COMMON_DIR)/bootloaders/$(BOOTLOADER_TYPE).c  # Search Path  VPATH += $(PLATFORM_PATH) diff --git a/platforms/test/bootloader.c b/platforms/test/bootloaders/none.c index 5155d9ff04..5155d9ff04 100644 --- a/platforms/test/bootloader.c +++ b/platforms/test/bootloaders/none.c diff --git a/quantum/action.c b/quantum/action.c index 5e81efb671..ea2310a4d9 100644 --- a/quantum/action.c +++ b/quantum/action.c @@ -794,7 +794,7 @@ void process_action(keyrecord_t *record, action_t action) {   *   * FIXME: Needs documentation.   */ -void register_code(uint8_t code) { +__attribute__((weak)) void register_code(uint8_t code) {      if (code == KC_NO) {          return;      } @@ -890,7 +890,7 @@ void register_code(uint8_t code) {   *   * FIXME: Needs documentation.   */ -void unregister_code(uint8_t code) { +__attribute__((weak)) void unregister_code(uint8_t code) {      if (code == KC_NO) {          return;      } @@ -955,7 +955,7 @@ void unregister_code(uint8_t code) {   * \param code The basic keycode to tap.   * \param delay The amount of time in milliseconds to leave the keycode registered, before unregistering it.   */ -void tap_code_delay(uint8_t code, uint16_t delay) { +__attribute__((weak)) void tap_code_delay(uint8_t code, uint16_t delay) {      register_code(code);      for (uint16_t i = delay; i > 0; i--) {          wait_ms(1); @@ -967,13 +967,13 @@ void tap_code_delay(uint8_t code, uint16_t delay) {   *   * \param code The basic keycode to tap. If `code` is `KC_CAPS_LOCK`, the delay will be `TAP_HOLD_CAPS_DELAY`, otherwise `TAP_CODE_DELAY`, if defined.   */ -void tap_code(uint8_t code) { tap_code_delay(code, code == KC_CAPS_LOCK ? TAP_HOLD_CAPS_DELAY : TAP_CODE_DELAY); } +__attribute__((weak)) void tap_code(uint8_t code) { tap_code_delay(code, code == KC_CAPS_LOCK ? TAP_HOLD_CAPS_DELAY : TAP_CODE_DELAY); }  /** \brief Adds the given physically pressed modifiers and sends a keyboard report immediately.   *   * \param mods A bitfield of modifiers to register.   */ -void register_mods(uint8_t mods) { +__attribute__((weak)) void register_mods(uint8_t mods) {      if (mods) {          add_mods(mods);          send_keyboard_report(); @@ -984,7 +984,7 @@ void register_mods(uint8_t mods) {   *   * \param mods A bitfield of modifiers to unregister.   */ -void unregister_mods(uint8_t mods) { +__attribute__((weak)) void unregister_mods(uint8_t mods) {      if (mods) {          del_mods(mods);          send_keyboard_report(); @@ -995,7 +995,7 @@ void unregister_mods(uint8_t mods) {   *   * \param mods A bitfield of modifiers to register.   */ -void register_weak_mods(uint8_t mods) { +__attribute__((weak)) void register_weak_mods(uint8_t mods) {      if (mods) {          add_weak_mods(mods);          send_keyboard_report(); @@ -1006,7 +1006,7 @@ void register_weak_mods(uint8_t mods) {   *   * \param mods A bitfield of modifiers to unregister.   */ -void unregister_weak_mods(uint8_t mods) { +__attribute__((weak)) void unregister_weak_mods(uint8_t mods) {      if (mods) {          del_weak_mods(mods);          send_keyboard_report(); diff --git a/quantum/action_util.c b/quantum/action_util.c index 78e02aec18..7e30593fb1 100644 --- a/quantum/action_util.c +++ b/quantum/action_util.c @@ -21,6 +21,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "action_layer.h"  #include "timer.h"  #include "keycode_config.h" +#include <string.h>  extern keymap_config_t keymap_config; @@ -247,7 +248,13 @@ void send_keyboard_report(void) {      keyboard_report->mods |= weak_override_mods;  #endif -    host_keyboard_send(keyboard_report); +    static report_keyboard_t last_report; + +    /* Only send the report if there are changes to propagate to the host. */ +    if (memcmp(keyboard_report, &last_report, sizeof(report_keyboard_t)) != 0) { +        memcpy(&last_report, keyboard_report, sizeof(report_keyboard_t)); +        host_keyboard_send(keyboard_report); +    }  }  /** \brief Get mods diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 49bb309e80..b3d6389dd5 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -160,6 +160,8 @@ void audio_toggle(void) {      eeconfig_update_audio(audio_config.raw);      if (audio_config.enable) {          audio_on_user(); +    } else { +        audio_off_user();      }  } @@ -172,6 +174,7 @@ void audio_on(void) {  void audio_off(void) {      PLAY_SONG(audio_off_song); +    audio_off_user();      wait_ms(100);      audio_stop_all();      audio_config.enable = 0; diff --git a/quantum/debounce.h b/quantum/debounce.h index 5043868289..3532d9cd7b 100644 --- a/quantum/debounce.h +++ b/quantum/debounce.h @@ -6,8 +6,6 @@  // changed is true if raw has changed since the last call  void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed); -bool debounce_active(void); -  void debounce_init(uint8_t num_rows);  void debounce_free(void); diff --git a/quantum/debounce/asym_eager_defer_pk.c b/quantum/debounce/asym_eager_defer_pk.c index 81f39383c4..b1eb4a2b7b 100644 --- a/quantum/debounce/asym_eager_defer_pk.c +++ b/quantum/debounce/asym_eager_defer_pk.c @@ -165,7 +165,6 @@ static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], ui      }  } -bool debounce_active(void) { return true; }  #else  #    include "none.c"  #endif diff --git a/quantum/debounce/none.c b/quantum/debounce/none.c index b03892bc5b..8a85cc04a8 100644 --- a/quantum/debounce/none.c +++ b/quantum/debounce/none.c @@ -26,6 +26,4 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool      }  } -bool debounce_active(void) { return false; } -  void debounce_free(void) {} diff --git a/quantum/debounce/sym_defer_g.c b/quantum/debounce/sym_defer_g.c index 9155eb914c..8cac1c37f9 100644 --- a/quantum/debounce/sym_defer_g.c +++ b/quantum/debounce/sym_defer_g.c @@ -44,8 +44,6 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool      }  } -bool debounce_active(void) { return debouncing; } -  void debounce_free(void) {}  #else  // no debouncing.  #    include "none.c" diff --git a/quantum/debounce/sym_defer_pk.c b/quantum/debounce/sym_defer_pk.c index 1b698ba347..9dee29e28e 100644 --- a/quantum/debounce/sym_defer_pk.c +++ b/quantum/debounce/sym_defer_pk.c @@ -134,7 +134,6 @@ static void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], u      }  } -bool debounce_active(void) { return true; }  #else  #    include "none.c"  #endif diff --git a/quantum/debounce/sym_defer_pr.c b/quantum/debounce/sym_defer_pr.c new file mode 100644 index 0000000000..8b33acc6a2 --- /dev/null +++ b/quantum/debounce/sym_defer_pr.c @@ -0,0 +1,72 @@ +/* +Copyright 2021 Chad Austin <chad@chadaustin.me> +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/>. +*/ + +/* +Symmetric per-row debounce algorithm. Changes only apply when +DEBOUNCE milliseconds have elapsed since the last change. +*/ + +#include "matrix.h" +#include "timer.h" +#include "quantum.h" +#include <stdlib.h> + +#ifndef DEBOUNCE +#    define DEBOUNCE 5 +#endif + +static uint16_t last_time; +// [row] milliseconds until key's state is considered debounced. +static uint8_t* countdowns; +// [row] +static matrix_row_t* last_raw; + +void debounce_init(uint8_t num_rows) { +    countdowns = (uint8_t*)calloc(num_rows, sizeof(uint8_t)); +    last_raw   = (matrix_row_t*)calloc(num_rows, sizeof(matrix_row_t)); + +    last_time = timer_read(); +} + +void debounce_free(void) { +    free(countdowns); +    countdowns = NULL; +    free(last_raw); +    last_raw = NULL; +} + +void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { +    uint16_t now       = timer_read(); +    uint16_t elapsed16 = TIMER_DIFF_16(now, last_time); +    last_time          = now; +    uint8_t elapsed    = (elapsed16 > 255) ? 255 : elapsed16; + +    uint8_t* countdown = countdowns; + +    for (uint8_t row = 0; row < num_rows; ++row, ++countdown) { +        matrix_row_t raw_row = raw[row]; + +        if (raw_row != last_raw[row]) { +            *countdown    = DEBOUNCE; +            last_raw[row] = raw_row; +        } else if (*countdown > elapsed) { +            *countdown -= elapsed; +        } else if (*countdown) { +            cooked[row] = raw_row; +            *countdown  = 0; +        } +    } +} + +bool debounce_active(void) { return true; } diff --git a/quantum/debounce/sym_eager_pk.c b/quantum/debounce/sym_eager_pk.c index 9da000ea9a..deec463649 100644 --- a/quantum/debounce/sym_eager_pk.c +++ b/quantum/debounce/sym_eager_pk.c @@ -140,7 +140,6 @@ static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], ui      }  } -bool debounce_active(void) { return true; }  #else  #    include "none.c"  #endif diff --git a/quantum/debounce/sym_eager_pr.c b/quantum/debounce/sym_eager_pr.c index eda92a263b..29b0cabefb 100644 --- a/quantum/debounce/sym_eager_pr.c +++ b/quantum/debounce/sym_eager_pr.c @@ -132,7 +132,6 @@ static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], ui      }  } -bool debounce_active(void) { return true; }  #else  #    include "none.c"  #endif diff --git a/quantum/debounce/tests/rules.mk b/quantum/debounce/tests/rules.mk index e908dd6f67..8318b1c668 100644 --- a/quantum/debounce/tests/rules.mk +++ b/quantum/debounce/tests/rules.mk @@ -28,6 +28,11 @@ debounce_sym_defer_pk_SRC := $(DEBOUNCE_COMMON_SRC) \  	$(QUANTUM_PATH)/debounce/sym_defer_pk.c \  	$(QUANTUM_PATH)/debounce/tests/sym_defer_pk_tests.cpp +debounce_sym_defer_pr_DEFS := $(DEBOUNCE_COMMON_DEFS) +debounce_sym_defer_pr_SRC := $(DEBOUNCE_COMMON_SRC) \ +	$(QUANTUM_PATH)/debounce/sym_defer_pr.c \ +	$(QUANTUM_PATH)/debounce/tests/sym_defer_pr_tests.cpp +  debounce_sym_eager_pk_DEFS := $(DEBOUNCE_COMMON_DEFS)  debounce_sym_eager_pk_SRC := $(DEBOUNCE_COMMON_SRC) \  	$(QUANTUM_PATH)/debounce/sym_eager_pk.c \ diff --git a/quantum/debounce/tests/sym_defer_pr_tests.cpp b/quantum/debounce/tests/sym_defer_pr_tests.cpp new file mode 100644 index 0000000000..417e1f4ca2 --- /dev/null +++ b/quantum/debounce/tests/sym_defer_pr_tests.cpp @@ -0,0 +1,238 @@ +/* Copyright 2021 Simon Arlott + * + * 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 "gtest/gtest.h" + +#include "debounce_test_common.h" + +TEST_F(DebounceTest, OneKeyShort1) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        {5, {}, {{0, 1, DOWN}}}, +        /* 0ms delay (fast scan rate) */ +        {5, {{0, 1, UP}}, {}}, + +        {10, {}, {{0, 1, UP}}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyShort2) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        {5, {}, {{0, 1, DOWN}}}, +        /* 1ms delay */ +        {6, {{0, 1, UP}}, {}}, + +        {11, {}, {{0, 1, UP}}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyShort3) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        {5, {}, {{0, 1, DOWN}}}, +        /* 2ms delay */ +        {7, {{0, 1, UP}}, {}}, + +        {12, {}, {{0, 1, UP}}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyTooQuick1) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, +        /* Release key exactly on the debounce time */ +        {5, {{0, 1, UP}}, {}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyTooQuick2) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        {5, {}, {{0, 1, DOWN}}}, +        {6, {{0, 1, UP}}, {}}, + +        /* Press key exactly on the debounce time */ +        {11, {{0, 1, DOWN}}, {}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyBouncing1) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, +        {1, {{0, 1, UP}}, {}}, +        {2, {{0, 1, DOWN}}, {}}, +        {3, {{0, 1, UP}}, {}}, +        {4, {{0, 1, DOWN}}, {}}, +        {5, {{0, 1, UP}}, {}}, +        {6, {{0, 1, DOWN}}, {}}, +        {11, {}, {{0, 1, DOWN}}}, /* 5ms after DOWN at time 7 */ +    }); +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyBouncing2) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, +        {5, {}, {{0, 1, DOWN}}}, +        {6, {{0, 1, UP}}, {}}, +        {7, {{0, 1, DOWN}}, {}}, +        {8, {{0, 1, UP}}, {}}, +        {9, {{0, 1, DOWN}}, {}}, +        {10, {{0, 1, UP}}, {}}, +        {15, {}, {{0, 1, UP}}}, /* 5ms after UP at time 10 */ +    }); +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyLong) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        {5, {}, {{0, 1, DOWN}}}, + +        {25, {{0, 1, UP}}, {}}, + +        {30, {}, {{0, 1, UP}}}, + +        {50, {{0, 1, DOWN}}, {}}, + +        {55, {}, {{0, 1, DOWN}}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, TwoKeysShort) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, +        {1, {{0, 2, DOWN}}, {}}, + +        {6, {}, {{0, 1, DOWN}, {0, 2, DOWN}}}, + +        {7, {{0, 1, UP}}, {}}, +        {8, {{0, 2, UP}}, {}}, + +        {13, {}, {{0, 1, UP}, {0, 2, UP}}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, TwoKeysSimultaneous1) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}, {0, 2, DOWN}}, {}}, + +        {5, {}, {{0, 1, DOWN}, {0, 2, DOWN}}}, +        {6, {{0, 1, UP}, {0, 2, UP}}, {}}, + +        {11, {}, {{0, 1, UP}, {0, 2, UP}}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, TwoKeysSimultaneous2) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, +        {1, {{0, 2, DOWN}}, {}}, + +        {6, {}, {{0, 1, DOWN}, {0, 2, DOWN}}}, +        {7, {{0, 2, UP}}, {}}, +        {9, {{0, 1, UP}}, {}}, + +        // Debouncing loses the specific ordering -- both events report simultaneously. +        {14, {}, {{0, 1, UP}, {0, 2, UP}}}, +    }); +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyDelayedScan1) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        /* Processing is very late */ +        {300, {}, {{0, 1, DOWN}}}, +        /* Immediately release key */ +        {300, {{0, 1, UP}}, {}}, + +        {305, {}, {{0, 1, UP}}}, +    }); +    time_jumps_ = true; +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyDelayedScan2) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        /* Processing is very late */ +        {300, {}, {{0, 1, DOWN}}}, +        /* Release key after 1ms */ +        {301, {{0, 1, UP}}, {}}, + +        {306, {}, {{0, 1, UP}}}, +    }); +    time_jumps_ = true; +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyDelayedScan3) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        /* Release key before debounce expires */ +        {300, {{0, 1, UP}}, {}}, +    }); +    time_jumps_ = true; +    runEvents(); +} + +TEST_F(DebounceTest, OneKeyDelayedScan4) { +    addEvents({ +        /* Time, Inputs, Outputs */ +        {0, {{0, 1, DOWN}}, {}}, + +        /* Processing is a bit late */ +        {50, {}, {{0, 1, DOWN}}}, +        /* Release key after 1ms */ +        {51, {{0, 1, UP}}, {}}, + +        {56, {}, {{0, 1, UP}}}, +    }); +    time_jumps_ = true; +    runEvents(); +} diff --git a/quantum/debounce/tests/testlist.mk b/quantum/debounce/tests/testlist.mk index c54c45aa63..f7bd520698 100644 --- a/quantum/debounce/tests/testlist.mk +++ b/quantum/debounce/tests/testlist.mk @@ -1,6 +1,7 @@  TEST_LIST += \  	debounce_sym_defer_g \  	debounce_sym_defer_pk \ +	debounce_sym_defer_pr \  	debounce_sym_eager_pk \  	debounce_sym_eager_pr \  	debounce_asym_eager_defer_pk diff --git a/quantum/matrix.c b/quantum/matrix.c index 483d518ecc..a58cc752fb 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c @@ -63,17 +63,13 @@ extern matrix_row_t matrix[MATRIX_ROWS];      // debounced values  #ifdef SPLIT_KEYBOARD  // row offsets for each hand -uint8_t thisHand, thatHand; +extern uint8_t thisHand, thatHand;  #endif  // user-defined overridable functions  __attribute__((weak)) void matrix_init_pins(void);  __attribute__((weak)) void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row);  __attribute__((weak)) void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col, matrix_row_t row_shifter); -#ifdef SPLIT_KEYBOARD -__attribute__((weak)) void matrix_slave_scan_kb(void) { matrix_slave_scan_user(); } -__attribute__((weak)) void matrix_slave_scan_user(void) {} -#endif  static inline void setPinOutput_writeLow(pin_t pin) {      ATOMIC_BLOCK_FORCEON { @@ -308,35 +304,6 @@ __attribute__((weak)) bool transport_master_if_connected(matrix_row_t master_mat      transport_master(master_matrix, slave_matrix);      return true;  // Treat the transport as always connected  } - -bool matrix_post_scan(void) { -    bool changed = false; -    if (is_keyboard_master()) { -        static bool  last_connected              = false; -        matrix_row_t slave_matrix[ROWS_PER_HAND] = {0}; -        if (transport_master_if_connected(matrix + thisHand, slave_matrix)) { -            changed = memcmp(matrix + thatHand, slave_matrix, sizeof(slave_matrix)) != 0; - -            last_connected = true; -        } else if (last_connected) { -            // reset other half when disconnected -            memset(slave_matrix, 0, sizeof(slave_matrix)); -            changed = true; - -            last_connected = false; -        } - -        if (changed) memcpy(matrix + thatHand, slave_matrix, sizeof(slave_matrix)); - -        matrix_scan_quantum(); -    } else { -        transport_slave(matrix + thatHand, matrix + thisHand); - -        matrix_slave_scan_kb(); -    } - -    return changed; -}  #endif  uint8_t matrix_scan(void) { diff --git a/quantum/matrix.h b/quantum/matrix.h index 5c696622fc..d968efeb0f 100644 --- a/quantum/matrix.h +++ b/quantum/matrix.h @@ -46,8 +46,6 @@ void matrix_setup(void);  void matrix_init(void);  /* scan all key states on matrix */  uint8_t matrix_scan(void); -/* whether modified from previous scan. used after matrix_scan. */ -bool matrix_is_modified(void) __attribute__((deprecated));  /* whether a switch is on */  bool matrix_is_on(uint8_t row, uint8_t col);  /* matrix state on row */ @@ -75,6 +73,7 @@ void matrix_init_user(void);  void matrix_scan_user(void);  #ifdef SPLIT_KEYBOARD +bool matrix_post_scan(void);  void matrix_slave_scan_kb(void);  void matrix_slave_scan_user(void);  #endif diff --git a/quantum/matrix_common.c b/quantum/matrix_common.c index 66c89970b1..98b83ddcf6 100644 --- a/quantum/matrix_common.c +++ b/quantum/matrix_common.c @@ -4,6 +4,15 @@  #include "wait.h"  #include "print.h"  #include "debug.h" +#ifdef SPLIT_KEYBOARD +#    include "split_common/split_util.h" +#    include "split_common/transactions.h" +#    include <string.h> + +#    define ROWS_PER_HAND (MATRIX_ROWS / 2) +#else +#    define ROWS_PER_HAND (MATRIX_ROWS) +#endif  #ifndef MATRIX_IO_DELAY  #    define MATRIX_IO_DELAY 30 @@ -13,6 +22,11 @@  matrix_row_t raw_matrix[MATRIX_ROWS];  matrix_row_t matrix[MATRIX_ROWS]; +#ifdef SPLIT_KEYBOARD +// row offsets for each hand +uint8_t thisHand, thatHand; +#endif +  #ifdef MATRIX_MASKED  extern const matrix_row_t matrix_mask[];  #endif @@ -45,12 +59,6 @@ inline matrix_row_t matrix_get_row(uint8_t row) {  #endif  } -// Deprecated. -bool matrix_is_modified(void) { -    if (debounce_active()) return false; -    return true; -} -  #if (MATRIX_COLS <= 8)  #    define print_matrix_header() print("\nr/c 01234567\n")  #    define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) @@ -84,18 +92,59 @@ uint8_t matrix_key_count(void) {      return count;  } +#ifdef SPLIT_KEYBOARD +bool matrix_post_scan(void) { +    bool changed = false; +    if (is_keyboard_master()) { +        static bool  last_connected              = false; +        matrix_row_t slave_matrix[ROWS_PER_HAND] = {0}; +        if (transport_master_if_connected(matrix + thisHand, slave_matrix)) { +            changed = memcmp(matrix + thatHand, slave_matrix, sizeof(slave_matrix)) != 0; + +            last_connected = true; +        } else if (last_connected) { +            // reset other half when disconnected +            memset(slave_matrix, 0, sizeof(slave_matrix)); +            changed = true; + +            last_connected = false; +        } + +        if (changed) memcpy(matrix + thatHand, slave_matrix, sizeof(slave_matrix)); + +        matrix_scan_quantum(); +    } else { +        transport_slave(matrix + thatHand, matrix + thisHand); + +        matrix_slave_scan_kb(); +    } + +    return changed; +} +#endif +  /* `matrix_io_delay ()` exists for backwards compatibility. From now on, use matrix_output_unselect_delay(). */  __attribute__((weak)) void matrix_io_delay(void) { wait_us(MATRIX_IO_DELAY); } -  __attribute__((weak)) void matrix_output_select_delay(void) { waitInputPinDelay(); }  __attribute__((weak)) void matrix_output_unselect_delay(uint8_t line, bool key_pressed) { matrix_io_delay(); }  // CUSTOM MATRIX 'LITE'  __attribute__((weak)) void matrix_init_custom(void) {} -  __attribute__((weak)) bool matrix_scan_custom(matrix_row_t current_matrix[]) { return true; } +#ifdef SPLIT_KEYBOARD +__attribute__((weak)) void matrix_slave_scan_kb(void) { matrix_slave_scan_user(); } +__attribute__((weak)) void matrix_slave_scan_user(void) {} +#endif +  __attribute__((weak)) void matrix_init(void) { +#ifdef SPLIT_KEYBOARD +    split_pre_init(); + +    thisHand = isLeftHand ? 0 : (ROWS_PER_HAND); +    thatHand = ROWS_PER_HAND - thisHand; +#endif +      matrix_init_custom();      // initialize matrix state: all keys off @@ -104,17 +153,26 @@ __attribute__((weak)) void matrix_init(void) {          matrix[i]     = 0;      } -    debounce_init(MATRIX_ROWS); +    debounce_init(ROWS_PER_HAND);      matrix_init_quantum(); + +#ifdef SPLIT_KEYBOARD +    split_post_init(); +#endif  }  __attribute__((weak)) uint8_t matrix_scan(void) {      bool changed = matrix_scan_custom(raw_matrix); -    debounce(raw_matrix, matrix, MATRIX_ROWS, changed); - +#ifdef SPLIT_KEYBOARD +    debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed); +    changed = (changed || matrix_post_scan()); +#else +    debounce(raw_matrix, matrix, ROWS_PER_HAND, changed);      matrix_scan_quantum(); +#endif +      return changed;  } diff --git a/quantum/pointing_device.c b/quantum/pointing_device.c index 2fefdb67b6..23d93fa15f 100644 --- a/quantum/pointing_device.c +++ b/quantum/pointing_device.c @@ -18,24 +18,105 @@  #include "pointing_device.h"  #include <string.h> +#include "timer.h"  #ifdef MOUSEKEY_ENABLE  #    include "mousekey.h"  #endif  #if (defined(POINTING_DEVICE_ROTATION_90) + defined(POINTING_DEVICE_ROTATION_180) + defined(POINTING_DEVICE_ROTATION_270)) > 1  #    error More than one rotation selected.  This is not supported.  #endif +#if defined(SPLIT_POINTING_ENABLE) +#    include "transactions.h" +#    include "keyboard.h" -static report_mouse_t mouseReport = {}; +report_mouse_t shared_mouse_report = {}; +uint16_t       shared_cpi          = 0; + +/** + * @brief Sets the shared mouse report used be pointing device task + * + * NOTE : Only available when using SPLIT_POINTING_ENABLE + * + * @param[in] new_mouse_report report_mouse_t + */ +void pointing_device_set_shared_report(report_mouse_t new_mouse_report) { shared_mouse_report = new_mouse_report; } + +/** + * @brief Gets current pointing device CPI if supported + * + * Gets current cpi of the shared report and returns it as uint16_t + * + * NOTE : Only available when using SPLIT_POINTING_ENABLE + * + * @return cpi value as uint16_t + */ +uint16_t pointing_device_get_shared_cpi(void) { return shared_cpi; } + +#    if defined(POINTING_DEVICE_LEFT) +#        define POINTING_DEVICE_THIS_SIDE is_keyboard_left() +#    elif defined(POINTING_DEVICE_RIGHT) +#        define POINTING_DEVICE_THIS_SIDE !is_keyboard_left() +#    elif defined(POINTING_DEVICE_COMBINED) +#        define POINTING_DEVICE_THIS_SIDE true +#    endif + +#endif  // defined(SPLIT_POINTING_ENABLE) + +static report_mouse_t local_mouse_report = {};  extern const pointing_device_driver_t pointing_device_driver; +/** + * @brief Compares 2 mouse reports for difference and returns result + * + * @param[in] new report_mouse_t + * @param[in] old report_mouse_t + * @return bool result + */  __attribute__((weak)) bool has_mouse_report_changed(report_mouse_t new, report_mouse_t old) { return memcmp(&new, &old, sizeof(new)); } -__attribute__((weak)) void           pointing_device_init_kb(void) {} -__attribute__((weak)) void           pointing_device_init_user(void) {} +/** + * @brief Keyboard level code pointing device initialisation + * + */ +__attribute__((weak)) void pointing_device_init_kb(void) {} + +/** + * @brief User level code pointing device initialisation + * + */ +__attribute__((weak)) void pointing_device_init_user(void) {} + +/** + * @brief Weak function allowing for keyboard level mouse report modification + * + * Takes report_mouse_t struct allowing modification at keyboard level then returns report_mouse_t. + * + * @param[in] mouse_report report_mouse_t + * @return report_mouse_t + */  __attribute__((weak)) report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) { return pointing_device_task_user(mouse_report); } + +/** + * @brief Weak function allowing for user level mouse report modification + * + * Takes report_mouse_t struct allowing modification at user level then returns report_mouse_t. + * + * @param[in] mouse_report report_mouse_t + * @return report_mouse_t + */  __attribute__((weak)) report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { return mouse_report; } +/** + * @brief Handles pointing device buttons + * + * Returns modified button bitmask using bool pressed and selected pointing_device_buttons_t button in uint8_t buttons bitmask. + * + * @param buttons[in] uint8_t bitmask + * @param pressed[in] bool + * @param button[in] pointing_device_buttons_t value + * @return Modified uint8_t bitmask buttons + */  __attribute__((weak)) uint8_t pointing_device_handle_buttons(uint8_t buttons, bool pressed, pointing_device_buttons_t button) {      if (pressed) {          buttons |= 1 << (button); @@ -45,7 +126,17 @@ __attribute__((weak)) uint8_t pointing_device_handle_buttons(uint8_t buttons, bo      return buttons;  } +/** + * @brief Initialises pointing device + * + * Initialises pointing device, perform driver init and optional keyboard/user level code. + */  __attribute__((weak)) void pointing_device_init(void) { +#if defined(SPLIT_POINTING_ENABLE) +    if (!(POINTING_DEVICE_THIS_SIDE)) { +        return; +    } +#endif      pointing_device_driver.init();  #ifdef POINTING_DEVICE_MOTION_PIN      setPinInputHigh(POINTING_DEVICE_MOTION_PIN); @@ -54,67 +145,299 @@ __attribute__((weak)) void pointing_device_init(void) {      pointing_device_init_user();  } +/** + * @brief Sends processed mouse report to host + * + * This sends the mouse report generated by pointing_device_task if changed since the last report. Once send zeros mouse report except buttons. + * + */  __attribute__((weak)) void pointing_device_send(void) {      static report_mouse_t old_report = {};      // If you need to do other things, like debugging, this is the place to do it. -    if (has_mouse_report_changed(mouseReport, old_report)) { -        host_mouse_send(&mouseReport); +    if (has_mouse_report_changed(local_mouse_report, old_report)) { +        host_mouse_send(&local_mouse_report);      }      // send it and 0 it out except for buttons, so those stay until they are explicity over-ridden using update_pointing_device -    mouseReport.x = 0; -    mouseReport.y = 0; -    mouseReport.v = 0; -    mouseReport.h = 0; +    local_mouse_report.x = 0; +    local_mouse_report.y = 0; +    local_mouse_report.v = 0; +    local_mouse_report.h = 0; -    memcpy(&old_report, &mouseReport, sizeof(mouseReport)); +    memcpy(&old_report, &local_mouse_report, sizeof(local_mouse_report));  } -__attribute__((weak)) void pointing_device_task(void) { -    // Gather report info -#ifdef POINTING_DEVICE_MOTION_PIN -    if (!readPin(POINTING_DEVICE_MOTION_PIN)) -#endif -        mouseReport = pointing_device_driver.get_report(mouseReport); - -        // Support rotation of the sensor data +/** + * @brief Adjust mouse report by any optional common pointing configuration defines + * + * This applies rotation or inversion to the mouse report as selected by the pointing device common configuration defines. + * + * @param mouse_report[in] takes a report_mouse_t to be adjusted + * @return report_mouse_t with adjusted values + */ +report_mouse_t pointing_device_adjust_by_defines(report_mouse_t mouse_report) { +    // Support rotation of the sensor data  #if defined(POINTING_DEVICE_ROTATION_90) || defined(POINTING_DEVICE_ROTATION_180) || defined(POINTING_DEVICE_ROTATION_270) -    int8_t x = mouseReport.x, y = mouseReport.y; +    int8_t x = mouse_report.x, y = mouse_report.y;  #    if defined(POINTING_DEVICE_ROTATION_90) -    mouseReport.x = y; -    mouseReport.y = -x; +    mouse_report.x = y; +    mouse_report.y = -x;  #    elif defined(POINTING_DEVICE_ROTATION_180) -    mouseReport.x = -x; -    mouseReport.y = -y; +    mouse_report.x = -x; +    mouse_report.y = -y;  #    elif defined(POINTING_DEVICE_ROTATION_270) -    mouseReport.x = -y; -    mouseReport.y = x; +    mouse_report.x = -y; +    mouse_report.y = x;  #    else  #        error "How the heck did you get here?!"  #    endif  #endif      // Support Inverting the X and Y Axises  #if defined(POINTING_DEVICE_INVERT_X) -    mouseReport.x = -mouseReport.x; +    mouse_report.x = -mouse_report.x;  #endif  #if defined(POINTING_DEVICE_INVERT_Y) -    mouseReport.y = -mouseReport.y; +    mouse_report.y = -mouse_report.y; +#endif +    return mouse_report; +} + +/** + * @brief Retrieves and processes pointing device data. + * + * This function is part of the keyboard loop and retrieves the mouse report from the pointing device driver. + * It applies any optional configuration e.g. rotation or axis inversion and then initiates a send. + * + */ +__attribute__((weak)) void pointing_device_task(void) { +#if defined(SPLIT_POINTING_ENABLE) +    // Don't poll the target side pointing device. +    if (!is_keyboard_master()) { +        return; +    }; +#endif + +#if defined(POINTING_DEVICE_TASK_THROTTLE_MS) +    static uint32_t last_exec = 0; +    if (timer_elapsed32(last_exec) < POINTING_DEVICE_TASK_THROTTLE_MS) { +        return; +    } +    last_exec = timer_read32(); +#else +#    if defined(SPLIT_POINTING_ENABLE) +#        pragma message("It's recommended you enable a throttle when sharing pointing devices.") +#    endif +#endif + +    // Gather report info +#ifdef POINTING_DEVICE_MOTION_PIN +#    if defined(SPLIT_POINTING_ENABLE) +#        error POINTING_DEVICE_MOTION_PIN not supported when sharing the pointing device report between sides. +#    endif +    if (!readPin(POINTING_DEVICE_MOTION_PIN))  #endif +#if defined(SPLIT_POINTING_ENABLE) +#    if defined(POINTING_DEVICE_COMBINED) +        static uint8_t old_buttons = 0; +    local_mouse_report.buttons = old_buttons; +    local_mouse_report         = pointing_device_driver.get_report(local_mouse_report); +    old_buttons                = local_mouse_report.buttons; +#    elif defined(POINTING_DEVICE_LEFT) || defined(POINTING_DEVICE_RIGHT) +        local_mouse_report = POINTING_DEVICE_THIS_SIDE ? pointing_device_driver.get_report(local_mouse_report) : shared_mouse_report; +#    else +#        error "You need to define the side(s) the pointing device is on. POINTING_DEVICE_COMBINED / POINTING_DEVICE_LEFT / POINTING_DEVICE_RIGHT" +#    endif +#else +    local_mouse_report = pointing_device_driver.get_report(local_mouse_report); +#endif  // defined(SPLIT_POINTING_ENABLE) +      // allow kb to intercept and modify report -    mouseReport = pointing_device_task_kb(mouseReport); +#if defined(SPLIT_POINTING_ENABLE) && defined(POINTING_DEVICE_COMBINED) +    if (is_keyboard_left()) { +        local_mouse_report  = pointing_device_adjust_by_defines(local_mouse_report); +        shared_mouse_report = pointing_device_adjust_by_defines_right(shared_mouse_report); +    } else { +        local_mouse_report  = pointing_device_adjust_by_defines_right(local_mouse_report); +        shared_mouse_report = pointing_device_adjust_by_defines(shared_mouse_report); +    } +    local_mouse_report = is_keyboard_left() ? pointing_device_task_combined_kb(local_mouse_report, shared_mouse_report) : pointing_device_task_combined_kb(shared_mouse_report, local_mouse_report); +#else +    local_mouse_report = pointing_device_adjust_by_defines(local_mouse_report); +    local_mouse_report = pointing_device_task_kb(local_mouse_report); +#endif      // combine with mouse report to ensure that the combined is sent correctly  #ifdef MOUSEKEY_ENABLE      report_mouse_t mousekey_report = mousekey_get_report(); -    mouseReport.buttons            = mouseReport.buttons | mousekey_report.buttons; +    local_mouse_report.buttons     = local_mouse_report.buttons | mousekey_report.buttons;  #endif      pointing_device_send();  } -report_mouse_t pointing_device_get_report(void) { return mouseReport; } +/** + * @brief Gets current mouse report used by pointing device task + * + * @return report_mouse_t + */ +report_mouse_t pointing_device_get_report(void) { return local_mouse_report; } + +/** + * @brief Sets mouse report used be pointing device task + * + * @param[in] new_mouse_report + */ +void pointing_device_set_report(report_mouse_t new_mouse_report) { local_mouse_report = new_mouse_report; } + +/** + * @brief Gets current pointing device CPI if supported + * + * Gets current cpi from pointing device driver if supported and returns it as uint16_t + * + * @return cpi value as uint16_t + */ +uint16_t pointing_device_get_cpi(void) { +#if defined(SPLIT_POINTING_ENABLE) +    return POINTING_DEVICE_THIS_SIDE ? pointing_device_driver.get_cpi() : shared_cpi; +#else +    return pointing_device_driver.get_cpi(); +#endif +} -void pointing_device_set_report(report_mouse_t newMouseReport) { mouseReport = newMouseReport; } +/** + * @brief Set pointing device CPI if supported + * + * Takes a uint16_t value to set pointing device cpi if supported by driver. + * + * @param[in] cpi uint16_t value. + */ +void pointing_device_set_cpi(uint16_t cpi) { +#if defined(SPLIT_POINTING_ENABLE) +    if (POINTING_DEVICE_THIS_SIDE) { +        pointing_device_driver.set_cpi(cpi); +    } else { +        shared_cpi = cpi; +    } +#else +    pointing_device_driver.set_cpi(cpi); +#endif +} -uint16_t pointing_device_get_cpi(void) { return pointing_device_driver.get_cpi(); } +#if defined(SPLIT_POINTING_ENABLE) && defined(POINTING_DEVICE_COMBINED) +/** + * @brief Set pointing device CPI if supported + * + * Takes a bool and uint16_t and allows setting cpi for a single side when using 2 pointing devices with a split keyboard. + * + * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED + * + * @param[in] left true = left, false = right. + * @param[in] cpi uint16_t value. + */ +void pointing_device_set_cpi_on_side(bool left, uint16_t cpi) { +    bool local = (is_keyboard_left() & left) ? true : false; +    if (local) { +        pointing_device_driver.set_cpi(cpi); +    } else { +        shared_cpi = cpi; +    } +} -void pointing_device_set_cpi(uint16_t cpi) { pointing_device_driver.set_cpi(cpi); } +/** + * @brief clamps int16_t to int8_t + * + * @param[in] int16_t value + * @return int8_t clamped value + */ +static inline int8_t pointing_device_movement_clamp(int16_t value) { +    if (value < INT8_MIN) { +        return INT8_MIN; +    } else if (value > INT8_MAX) { +        return INT8_MAX; +    } else { +        return value; +    } +} + +/** + * @brief combines 2 mouse reports and returns 2 + * + * Combines 2 report_mouse_t structs, clamping movement values to int8_t and ignores report_id then returns the resulting report_mouse_t struct. + * + * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED + * + * @param[in] left_report left report_mouse_t + * @param[in] right_report right report_mouse_t + * @return combined report_mouse_t of left_report and right_report + */ +report_mouse_t pointing_device_combine_reports(report_mouse_t left_report, report_mouse_t right_report) { +    left_report.x = pointing_device_movement_clamp((int16_t)left_report.x + right_report.x); +    left_report.y = pointing_device_movement_clamp((int16_t)left_report.y + right_report.y); +    left_report.h = pointing_device_movement_clamp((int16_t)left_report.h + right_report.h); +    left_report.v = pointing_device_movement_clamp((int16_t)left_report.v + right_report.v); +    left_report.buttons |= right_report.buttons; +    return left_report; +} + +/** + * @brief Adjust mouse report by any optional right pointing configuration defines + * + * This applies rotation or inversion to the mouse report as selected by the pointing device common configuration defines. + * + * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED + * + * @param[in] mouse_report report_mouse_t to be adjusted + * @return report_mouse_t with adjusted values + */ +report_mouse_t pointing_device_adjust_by_defines_right(report_mouse_t mouse_report) { +    // Support rotation of the sensor data +#    if defined(POINTING_DEVICE_ROTATION_90_RIGHT) || defined(POINTING_DEVICE_ROTATION_RIGHT) || defined(POINTING_DEVICE_ROTATION_RIGHT) +    int8_t x = mouse_report.x, y = mouse_report.y; +#        if defined(POINTING_DEVICE_ROTATION_90_RIGHT) +    mouse_report.x = y; +    mouse_report.y = -x; +#        elif defined(POINTING_DEVICE_ROTATION_180_RIGHT) +    mouse_report.x = -x; +    mouse_report.y = -y; +#        elif defined(POINTING_DEVICE_ROTATION_270_RIGHT) +    mouse_report.x = -y; +    mouse_report.y = x; +#        else +#            error "How the heck did you get here?!" +#        endif +#    endif +    // Support Inverting the X and Y Axises +#    if defined(POINTING_DEVICE_INVERT_X_RIGHT) +    mouse_report.x = -mouse_report.x; +#    endif +#    if defined(POINTING_DEVICE_INVERT_Y_RIGHT) +    mouse_report.y = -mouse_report.y; +#    endif +    return mouse_report; +} + +/** + * @brief Weak function allowing for keyboard level mouse report modification + * + * Takes 2 report_mouse_t structs allowing individual modification of sides at keyboard level then returns pointing_device_task_combined_user. + * + * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED + * + * @param[in] left_report report_mouse_t + * @param[in] right_report report_mouse_t + * @return pointing_device_task_combined_user(left_report, right_report) by default + */ +__attribute__((weak)) report_mouse_t pointing_device_task_combined_kb(report_mouse_t left_report, report_mouse_t right_report) { return pointing_device_task_combined_user(left_report, right_report); } + +/** + * @brief Weak function allowing for user level mouse report modification + * + * Takes 2 report_mouse_t structs allowing individual modification of sides at user level then returns pointing_device_combine_reports. + * + * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED + * + * @param[in] left_report report_mouse_t + * @param[in] right_report report_mouse_t + * @return pointing_device_combine_reports(left_report, right_report) by default + */ +__attribute__((weak)) report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report) { return pointing_device_combine_reports(left_report, right_report); } +#endif diff --git a/quantum/pointing_device.h b/quantum/pointing_device.h index 5106c26660..00229e8a24 100644 --- a/quantum/pointing_device.h +++ b/quantum/pointing_device.h @@ -86,3 +86,16 @@ void           pointing_device_init_user(void);  report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report);  report_mouse_t pointing_device_task_user(report_mouse_t mouse_report);  uint8_t        pointing_device_handle_buttons(uint8_t buttons, bool pressed, pointing_device_buttons_t button); +report_mouse_t pointing_device_adjust_by_defines(report_mouse_t mouse_report); + +#if defined(SPLIT_POINTING_ENABLE) +void     pointing_device_set_shared_report(report_mouse_t report); +uint16_t pointing_device_get_shared_cpi(void); +#    if defined(POINTING_DEVICE_COMBINED) +void           pointing_device_set_cpi_on_side(bool left, uint16_t cpi); +report_mouse_t pointing_device_combine_reports(report_mouse_t left_report, report_mouse_t right_report); +report_mouse_t pointing_device_task_combined_kb(report_mouse_t left_report, report_mouse_t right_report); +report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report); +report_mouse_t pointing_device_adjust_by_defines_right(report_mouse_t mouse_report); +#    endif  // defined(POINTING_DEVICE_COMBINED) +#endif      // defined(SPLIT_POINTING_ENABLE) diff --git a/quantum/pointing_device_drivers.c b/quantum/pointing_device_drivers.c index 9ad5e76ba6..260a6d2eb4 100644 --- a/quantum/pointing_device_drivers.c +++ b/quantum/pointing_device_drivers.c @@ -165,14 +165,13 @@ const pointing_device_driver_t pointing_device_driver = {  // clang-format on  #elif defined(POINTING_DEVICE_DRIVER_pimoroni_trackball) -report_mouse_t pimorono_trackball_get_report(report_mouse_t mouse_report) { -    static fast_timer_t throttle      = 0; -    static uint16_t     debounce      = 0; -    static uint8_t      error_count   = 0; -    pimoroni_data_t     pimoroni_data = {0}; -    static int16_t      x_offset = 0, y_offset = 0; - -    if (error_count < PIMORONI_TRACKBALL_ERROR_COUNT && timer_elapsed_fast(throttle) >= PIMORONI_TRACKBALL_INTERVAL_MS) { +report_mouse_t pimoroni_trackball_get_report(report_mouse_t mouse_report) { +    static uint16_t debounce      = 0; +    static uint8_t  error_count   = 0; +    pimoroni_data_t pimoroni_data = {0}; +    static int16_t  x_offset = 0, y_offset = 0; + +    if (error_count < PIMORONI_TRACKBALL_ERROR_COUNT) {          i2c_status_t status = read_pimoroni_trackball(&pimoroni_data);          if (status == I2C_STATUS_SUCCESS) { @@ -195,22 +194,20 @@ report_mouse_t pimorono_trackball_get_report(report_mouse_t mouse_report) {          } else {              error_count++;          } -        throttle = timer_read_fast();      }      return mouse_report;  }  // clang-format off  const pointing_device_driver_t pointing_device_driver = { -    .init       = pimironi_trackball_device_init, -    .get_report = pimorono_trackball_get_report, -    .set_cpi    = NULL, -    .get_cpi    = NULL +    .init       = pimoroni_trackball_device_init, +    .get_report = pimoroni_trackball_get_report, +    .set_cpi    = pimoroni_trackball_set_cpi, +    .get_cpi    = pimoroni_trackball_get_cpi  };  // clang-format on  #elif defined(POINTING_DEVICE_DRIVER_pmw3360) - -static void init(void) { pmw3360_init(); } +static void pmw3360_device_init(void) { pmw3360_init(); }  report_mouse_t pmw3360_get_report(report_mouse_t mouse_report) {      report_pmw3360_t data        = pmw3360_read_burst(); @@ -239,7 +236,7 @@ report_mouse_t pmw3360_get_report(report_mouse_t mouse_report) {  // clang-format off  const pointing_device_driver_t pointing_device_driver = { -    .init       = init, +    .init       = pmw3360_device_init,      .get_report = pmw3360_get_report,      .set_cpi    = pmw3360_set_cpi,      .get_cpi    = pmw3360_get_cpi diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c index 3b5fa8490b..23664721e8 100644 --- a/quantum/process_keycode/process_audio.c +++ b/quantum/process_keycode/process_audio.c @@ -57,3 +57,4 @@ void process_audio_noteoff(uint8_t note) { stop_note(compute_freq_for_midi_note(  void process_audio_all_notes_off(void) { stop_all_notes(); }  __attribute__((weak)) void audio_on_user() {} +__attribute__((weak)) void audio_off_user() {} diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h index d89a834ea8..42cfab4af2 100644 --- a/quantum/process_keycode/process_audio.h +++ b/quantum/process_keycode/process_audio.h @@ -8,3 +8,4 @@ void process_audio_noteoff(uint8_t note);  void process_audio_all_notes_off(void);  void audio_on_user(void); +void audio_off_user(void); diff --git a/quantum/process_keycode/process_key_lock.c b/quantum/process_keycode/process_key_lock.c index 4bd58f0c1e..941a2c5780 100644 --- a/quantum/process_keycode/process_key_lock.c +++ b/quantum/process_keycode/process_key_lock.c @@ -56,6 +56,11 @@ static inline uint16_t translate_keycode(uint16_t keycode) {      }  } +void cancel_key_lock(void) { +    watching = false; +    UNSET_KEY_STATE(0x0); +} +  bool process_key_lock(uint16_t *keycode, keyrecord_t *record) {      // We start by categorizing the keypress event. In the event of a down      // event, there are several possibilities: diff --git a/quantum/process_keycode/process_key_lock.h b/quantum/process_keycode/process_key_lock.h index baa0b39077..5159b0ba02 100644 --- a/quantum/process_keycode/process_key_lock.h +++ b/quantum/process_keycode/process_key_lock.h @@ -18,4 +18,5 @@  #include "quantum.h" +void cancel_key_lock(void);  bool process_key_lock(uint16_t *keycode, keyrecord_t *record); diff --git a/quantum/process_keycode/process_magic.c b/quantum/process_keycode/process_magic.c index d5cff4f12a..6332be647c 100644 --- a/quantum/process_keycode/process_magic.c +++ b/quantum/process_keycode/process_magic.c @@ -44,6 +44,7 @@ bool process_magic(uint16_t keycode, keyrecord_t *record) {              case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI:              case MAGIC_SWAP_LCTL_LGUI ... MAGIC_EE_HANDS_RIGHT:              case MAGIC_TOGGLE_GUI: +            case MAGIC_TOGGLE_CONTROL_CAPSLOCK:                  /* keymap config */                  keymap_config.raw = eeconfig_read_keymap();                  switch (keycode) { @@ -168,6 +169,9 @@ bool process_magic(uint16_t keycode, keyrecord_t *record) {                      case MAGIC_TOGGLE_GUI:                          keymap_config.no_gui = !keymap_config.no_gui;                          break; +                    case MAGIC_TOGGLE_CONTROL_CAPSLOCK: +                        keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock; +                        break;                  }                  eeconfig_update_keymap(keymap_config.raw); diff --git a/quantum/process_keycode/process_printer.c b/quantum/process_keycode/process_printer.c index 82528cc680..0801f078ef 100644 --- a/quantum/process_keycode/process_printer.c +++ b/quantum/process_keycode/process_printer.c @@ -16,13 +16,14 @@  #include "process_printer.h"  #include "action_util.h" +#include "uart.h"  bool    printing_enabled = false;  uint8_t character_shift  = 0;  void enable_printing(void) {      printing_enabled = true; -    serial_init(); +    uart_init(19200);  }  void disable_printing(void) { printing_enabled = false; } @@ -35,7 +36,7 @@ uint8_t shifted_numbers[10] = {0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A, 0  void print_char(char c) {      USB_Disable(); -    serial_send(c); +    uart_write(c);      USB_Init();  } diff --git a/quantum/process_keycode/process_printer.h b/quantum/process_keycode/process_printer.h index 3c6d06ff94..6f4d09f333 100644 --- a/quantum/process_keycode/process_printer.h +++ b/quantum/process_keycode/process_printer.h @@ -18,6 +18,4 @@  #include "quantum.h" -#include "protocol/serial.h" -  bool process_printer(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/quantum.c b/quantum/quantum.c index 35b6351e9d..c106f795d0 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -76,9 +76,9 @@ uint8_t extract_mod_bits(uint16_t code) {      return mods_to_send;  } -static void do_code16(uint16_t code, void (*f)(uint8_t)) { f(extract_mod_bits(code)); } +void do_code16(uint16_t code, void (*f)(uint8_t)) { f(extract_mod_bits(code)); } -void register_code16(uint16_t code) { +__attribute__((weak)) void register_code16(uint16_t code) {      if (IS_MOD(code) || code == KC_NO) {          do_code16(code, register_mods);      } else { @@ -87,7 +87,7 @@ void register_code16(uint16_t code) {      register_code(code);  } -void unregister_code16(uint16_t code) { +__attribute__((weak)) void unregister_code16(uint16_t code) {      unregister_code(code);      if (IS_MOD(code) || code == KC_NO) {          do_code16(code, unregister_mods); @@ -96,7 +96,7 @@ void unregister_code16(uint16_t code) {      }  } -void tap_code16(uint16_t code) { +__attribute__((weak)) void tap_code16(uint16_t code) {      register_code16(code);  #if TAP_CODE_DELAY > 0      wait_ms(TAP_CODE_DELAY); @@ -263,7 +263,7 @@ bool process_record_quantum(keyrecord_t *record) {  #ifdef TAP_DANCE_ENABLE              process_tap_dance(keycode, record) &&  #endif -#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE) +#if defined(UNICODE_COMMON_ENABLE)              process_unicode_common(keycode, record) &&  #endif  #ifdef LEADER_ENABLE @@ -387,7 +387,7 @@ void matrix_init_quantum() {  #ifdef RGB_MATRIX_ENABLE      rgb_matrix_init();  #endif -#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE) +#if defined(UNICODE_COMMON_ENABLE)      unicode_input_mode_init();  #endif  #ifdef HAPTIC_ENABLE diff --git a/quantum/quantum.h b/quantum/quantum.h index 6927884e2f..5d3a665887 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -109,6 +109,10 @@ extern layer_state_t layer_state;  #    include "process_unicodemap.h"  #endif +#ifdef UNICODE_COMMON_ENABLE +#    include "process_unicode_common.h" +#endif +  #ifdef KEY_OVERRIDE_ENABLE  #    include "process_key_override.h"  #endif diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index e4d0167aac..3950a3bcae 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -597,6 +597,8 @@ enum quantum_keycodes {      MACRO_30,      MACRO_31, +    MAGIC_TOGGLE_CONTROL_CAPSLOCK, +      // Start of custom keycode range for keyboards and keymaps - always leave at the end      SAFE_RANGE  }; @@ -749,6 +751,7 @@ enum quantum_keycodes {  #define CL_NORM MAGIC_UNSWAP_CONTROL_CAPSLOCK  #define CL_CTRL MAGIC_CAPSLOCK_TO_CONTROL  #define CL_CAPS MAGIC_UNCAPSLOCK_TO_CONTROL +#define CL_TOGG MAGIC_TOGGLE_CONTROL_CAPSLOCK  #define LCG_SWP MAGIC_SWAP_LCTL_LGUI  #define LCG_NRM MAGIC_UNSWAP_LCTL_LGUI diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h index ef72043bb7..c7eabea233 100644 --- a/quantum/split_common/split_util.h +++ b/quantum/split_common/split_util.h @@ -2,7 +2,6 @@  #include <stdbool.h>  #include <stdint.h> -#include <stdio.h>  #include <stdlib.h>  #include "matrix.h" diff --git a/quantum/split_common/transaction_id_define.h b/quantum/split_common/transaction_id_define.h index 535bc21aea..aa71c3621e 100644 --- a/quantum/split_common/transaction_id_define.h +++ b/quantum/split_common/transaction_id_define.h @@ -78,6 +78,12 @@ enum serial_transaction_id {      PUT_ST7565,  #endif  // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE) +#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +    GET_POINTING_CHECKSUM, +    GET_POINTING_DATA, +    PUT_POINTING_CPI, +#endif  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)      PUT_RPC_INFO,      PUT_RPC_REQ_DATA, diff --git a/quantum/split_common/transactions.c b/quantum/split_common/transactions.c index 3ff87710e7..9622acb377 100644 --- a/quantum/split_common/transactions.c +++ b/quantum/split_common/transactions.c @@ -579,6 +579,82 @@ static void st7565_handlers_slave(matrix_row_t master_matrix[], matrix_row_t sla  #endif  // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)  //////////////////////////////////////////////////// +// POINTING + +#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) + +static bool pointing_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { +#    if defined(POINTING_DEVICE_LEFT) +    if (is_keyboard_left()) { +        return true; +    } +#    elif defined(POINTING_DEVICE_RIGHT) +    if (!is_keyboard_left()) { +        return true; +    } +#    endif +    static uint32_t last_update = 0; +    static uint16_t last_cpi    = 0; +    report_mouse_t  temp_state; +    uint16_t        temp_cpi; +    bool            okay = read_if_checksum_mismatch(GET_POINTING_CHECKSUM, GET_POINTING_DATA, &last_update, &temp_state, &split_shmem->pointing.report, sizeof(temp_state)); +    if (okay) pointing_device_set_shared_report(temp_state); +    temp_cpi = pointing_device_get_shared_cpi(); +    if (temp_cpi && memcmp(&last_cpi, &temp_cpi, sizeof(temp_cpi)) != 0) { +        memcpy(&split_shmem->pointing.cpi, &temp_cpi, sizeof(temp_cpi)); +        okay = transport_write(PUT_POINTING_CPI, &split_shmem->pointing.cpi, sizeof(split_shmem->pointing.cpi)); +        if (okay) { +            last_cpi = temp_cpi; +        } +    } +    return okay; +} + +extern const pointing_device_driver_t pointing_device_driver; + +static void pointing_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { +#    if defined(POINTING_DEVICE_LEFT) +    if (!is_keyboard_left()) { +        return; +    } +#    elif defined(POINTING_DEVICE_RIGHT) +    if (is_keyboard_left()) { +        return; +    } +#    endif +    report_mouse_t temp_report; +    uint16_t       temp_cpi; +#    ifdef POINTING_DEVICE_TASK_THROTTLE_MS +    static uint32_t last_exec = 0; +    if (timer_elapsed32(last_exec) < POINTING_DEVICE_TASK_THROTTLE_MS) { +        return; +    } +    last_exec = timer_read32(); +#    endif +    temp_cpi = pointing_device_driver.get_cpi(); +    if (split_shmem->pointing.cpi && memcmp(&split_shmem->pointing.cpi, &temp_cpi, sizeof(temp_cpi)) != 0) { +        pointing_device_driver.set_cpi(split_shmem->pointing.cpi); +    } +    memset(&temp_report, 0, sizeof(temp_report)); +    temp_report = pointing_device_driver.get_report(temp_report); +    memcpy(&split_shmem->pointing.report, &temp_report, sizeof(temp_report)); +    // Now update the checksum given that the pointing has been written to +    split_shmem->pointing.checksum = crc8(&temp_report, sizeof(temp_report)); +} + +#    define TRANSACTIONS_POINTING_MASTER() TRANSACTION_HANDLER_MASTER(pointing) +#    define TRANSACTIONS_POINTING_SLAVE() TRANSACTION_HANDLER_SLAVE(pointing) +#    define TRANSACTIONS_POINTING_REGISTRATIONS [GET_POINTING_CHECKSUM] = trans_target2initiator_initializer(pointing.checksum), [GET_POINTING_DATA] = trans_target2initiator_initializer(pointing.report), [PUT_POINTING_CPI] = trans_initiator2target_initializer(pointing.cpi), + +#else  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) + +#    define TRANSACTIONS_POINTING_MASTER() +#    define TRANSACTIONS_POINTING_SLAVE() +#    define TRANSACTIONS_POINTING_REGISTRATIONS + +#endif  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) + +////////////////////////////////////////////////////  uint8_t                  dummy;  split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = { @@ -604,6 +680,7 @@ split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = {      TRANSACTIONS_WPM_REGISTRATIONS      TRANSACTIONS_OLED_REGISTRATIONS      TRANSACTIONS_ST7565_REGISTRATIONS +    TRANSACTIONS_POINTING_REGISTRATIONS  // clang-format on  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) @@ -629,6 +706,7 @@ bool transactions_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix      TRANSACTIONS_WPM_MASTER();      TRANSACTIONS_OLED_MASTER();      TRANSACTIONS_ST7565_MASTER(); +    TRANSACTIONS_POINTING_MASTER();      return true;  } @@ -647,6 +725,7 @@ void transactions_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[      TRANSACTIONS_WPM_SLAVE();      TRANSACTIONS_OLED_SLAVE();      TRANSACTIONS_ST7565_SLAVE(); +    TRANSACTIONS_POINTING_SLAVE();  }  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) diff --git a/quantum/split_common/transport.h b/quantum/split_common/transport.h index 1d4f6ed0cd..31b804908b 100644 --- a/quantum/split_common/transport.h +++ b/quantum/split_common/transport.h @@ -106,6 +106,15 @@ typedef struct _split_mods_sync_t {  } split_mods_sync_t;  #endif  // SPLIT_MODS_ENABLE +#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +#    include "pointing_device.h" +typedef struct _split_slave_pointing_sync_t { +    uint8_t        checksum; +    report_mouse_t report; +    uint16_t       cpi; +} split_slave_pointing_sync_t; +#endif  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)  typedef struct _rpc_sync_info_t {      int8_t  transaction_id; @@ -173,6 +182,10 @@ typedef struct _split_shared_memory_t {      uint8_t current_st7565_state;  #endif  // ST7565_ENABLE(OLED_ENABLE) && defined(SPLIT_ST7565_ENABLE) +#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +    split_slave_pointing_sync_t pointing; +#endif  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)      rpc_sync_info_t rpc_info;      uint8_t         rpc_m2s_buffer[RPC_M2S_BUFFER_SIZE]; diff --git a/quantum/wpm.c b/quantum/wpm.c index 925e2c416e..62d4128b8e 100644 --- a/quantum/wpm.c +++ b/quantum/wpm.c @@ -22,33 +22,37 @@  // WPM Stuff  static uint8_t  current_wpm = 0;  static uint32_t wpm_timer   = 0; -#ifndef WPM_UNFILTERED -static uint32_t smoothing_timer = 0; -#endif  /* The WPM calculation works by specifying a certain number of 'periods' inside   * a ring buffer, and we count the number of keypresses which occur in each of   * those periods.  Then to calculate WPM, we add up all of the keypresses in   * the whole ring buffer, divide by the number of keypresses in a 'word', and - * then adjust for how much time is captured by our ring buffer.  Right now - * the ring buffer is hardcoded below to be six half-second periods, accounting - * for a total WPM sampling period of up to three seconds of typing. + * then adjust for how much time is captured by our ring buffer.  The size + * of the ring buffer can be configured using the keymap configuration + * value `WPM_SAMPLE_PERIODS`.   * - * Whenever our WPM drops to absolute zero due to no typing occurring within - * any contiguous three seconds, we reset and start measuring fresh, - * which lets our WPM immediately reach the correct value even before a full - * three second sampling buffer has been filled.   */  #define MAX_PERIODS (WPM_SAMPLE_PERIODS)  #define PERIOD_DURATION (1000 * WPM_SAMPLE_SECONDS / MAX_PERIODS) -#define LATENCY (100) -static int8_t  period_presses[MAX_PERIODS] = {0}; + +static int16_t period_presses[MAX_PERIODS] = {0};  static uint8_t current_period              = 0;  static uint8_t periods                     = 1;  #if !defined(WPM_UNFILTERED) -static uint8_t prev_wpm = 0; -static uint8_t next_wpm = 0; +/* LATENCY is used as part of filtering, and controls how quickly the reported + * WPM trails behind our actual instantaneous measured WPM value, and is + * defined in milliseconds.  So for LATENCY == 100, the displayed WPM is + * smoothed out over periods of 0.1 seconds.  This results in a nice, + * smoothly-moving reported WPM value which nevertheless is never more than + * 0.1 seconds behind the typist's actual current WPM. + * + * LATENCY is not used if WPM_UNFILTERED is defined. + */ +#    define LATENCY (100) +static uint32_t smoothing_timer = 0; +static uint8_t  prev_wpm        = 0; +static uint8_t  next_wpm        = 0;  #endif  void    set_current_wpm(uint8_t new_wpm) { current_wpm = new_wpm; } @@ -71,7 +75,7 @@ __attribute__((weak)) bool wpm_keycode_user(uint16_t keycode) {      return false;  } -#ifdef WPM_ALLOW_COUNT_REGRESSION +#if defined(WPM_ALLOW_COUNT_REGRESSION)  __attribute__((weak)) uint8_t wpm_regress_count(uint16_t keycode) {      bool weak_modded = (keycode >= QK_LCTL && keycode < QK_LSFT) || (keycode >= QK_RCTL && keycode < QK_RSFT); @@ -95,12 +99,12 @@ __attribute__((weak)) uint8_t wpm_regress_count(uint16_t keycode) {  // Outside 'raw' mode we smooth results over time.  void update_wpm(uint16_t keycode) { -    if (wpm_keycode(keycode)) { +    if (wpm_keycode(keycode) && period_presses[current_period] < INT16_MAX) {          period_presses[current_period]++;      } -#ifdef WPM_ALLOW_COUNT_REGRESSION +#if defined(WPM_ALLOW_COUNT_REGRESSION)      uint8_t regress = wpm_regress_count(keycode); -    if (regress) { +    if (regress && period_presses[current_period] > INT16_MIN) {          period_presses[current_period]--;      }  #endif @@ -116,32 +120,41 @@ void decay_wpm(void) {      }      int32_t  elapsed  = timer_elapsed32(wpm_timer);      uint32_t duration = (((periods)*PERIOD_DURATION) + elapsed); -    uint32_t wpm_now  = (60000 * presses) / (duration * WPM_ESTIMATED_WORD_SIZE); -    wpm_now           = (wpm_now > 240) ? 240 : wpm_now; +    int32_t  wpm_now  = (60000 * presses) / (duration * WPM_ESTIMATED_WORD_SIZE); + +    if (wpm_now < 0)  // set some reasonable WPM measurement limits +        wpm_now = 0; +    if (wpm_now > 240) wpm_now = 240;      if (elapsed > PERIOD_DURATION) {          current_period                 = (current_period + 1) % MAX_PERIODS;          period_presses[current_period] = 0;          periods                        = (periods < MAX_PERIODS - 1) ? periods + 1 : MAX_PERIODS - 1;          elapsed                        = 0; -        /* if (wpm_timer == 0) { */ -        wpm_timer = timer_read32(); -        /* } else { */ -        /*     wpm_timer += PERIOD_DURATION; */ -        /* } */ +        wpm_timer                      = timer_read32();      }      if (presses < 2)  // don't guess high WPM based on a single keypress.          wpm_now = 0; -#if defined WPM_LAUNCH_CONTROL +#if defined(WPM_LAUNCH_CONTROL) +    /* +     * If the `WPM_LAUNCH_CONTROL` option is enabled, then whenever our WPM +     * drops to absolute zero due to no typing occurring within our sample +     * ring buffer, we reset and start measuring fresh, which lets our WPM +     * immediately reach the correct value even before a full sampling buffer +     * has been filled. +     */      if (presses == 0) { -        current_period = 0; -        periods        = 0; -        wpm_now        = 0; +        current_period    = 0; +        periods           = 0; +        wpm_now           = 0; +        period_presses[0] = 0;      }  #endif  // WPM_LAUNCH_CONTROL -#ifndef WPM_UNFILTERED +#if defined(WPM_UNFILTERED) +    current_wpm = wpm_now; +#else      int32_t latency = timer_elapsed32(smoothing_timer);      if (latency > LATENCY) {          smoothing_timer = timer_read32(); @@ -150,7 +163,5 @@ void decay_wpm(void) {      }      current_wpm = prev_wpm + (latency * ((int)next_wpm - (int)prev_wpm) / LATENCY); -#else -    current_wpm = wpm_now;  #endif  } diff --git a/quantum/wpm.h b/quantum/wpm.h index c8e7d26684..305d75b450 100644 --- a/quantum/wpm.h +++ b/quantum/wpm.h @@ -26,7 +26,7 @@  #    define WPM_SAMPLE_SECONDS 5  #endif  #ifndef WPM_SAMPLE_PERIODS -#    define WPM_SAMPLE_PERIODS 50 +#    define WPM_SAMPLE_PERIODS 25  #endif  bool wpm_keycode(uint16_t keycode); @@ -1,3 +1,7 @@ +# This is the `develop` branch! + +See the [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) document for more information. +  # Quantum Mechanical Keyboard Firmware  [](https://github.com/qmk/qmk_firmware/tags) diff --git a/tests/auto_shift/test_auto_shift.cpp b/tests/auto_shift/test_auto_shift.cpp index 9c5ed9a832..a19b5dfa82 100644 --- a/tests/auto_shift/test_auto_shift.cpp +++ b/tests/auto_shift/test_auto_shift.cpp @@ -42,7 +42,6 @@ TEST_F(AutoShift, key_release_before_timeout) {      /* Release regular key */      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      regular_key.release();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); @@ -65,8 +64,6 @@ TEST_F(AutoShift, key_release_after_timeout) {      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_A)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      regular_key.release();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); diff --git a/tests/basic/test_action_layer.cpp b/tests/basic/test_action_layer.cpp index 1b12d13642..fe5c729f7c 100644 --- a/tests/basic/test_action_layer.cpp +++ b/tests/basic/test_action_layer.cpp @@ -131,14 +131,12 @@ TEST_F(ActionLayer, MomentaryLayerDoesNothing) {      set_keymap({layer_key});      /* Press and release MO, nothing should happen. */ -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.press();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.release();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); @@ -153,8 +151,7 @@ TEST_F(ActionLayer, MomentaryLayerWithKeypress) {      set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});      /* Press MO. */ -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.press();      run_one_scan_loop();      EXPECT_TRUE(layer_state_is(1)); @@ -175,8 +172,7 @@ TEST_F(ActionLayer, MomentaryLayerWithKeypress) {      testing::Mock::VerifyAndClearExpectations(&driver);      /* Release MO */ -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.release();      run_one_scan_loop();      EXPECT_TRUE(layer_state_is(0)); @@ -199,8 +195,7 @@ TEST_F(ActionLayer, ToggleLayerDoesNothing) {      testing::Mock::VerifyAndClearExpectations(&driver);      /* Release TG. */ -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.release();      run_one_scan_loop();      EXPECT_TRUE(layer_state_is(1)); @@ -223,8 +218,7 @@ TEST_F(ActionLayer, ToggleLayerUpAndDown) {      EXPECT_TRUE(layer_state_is(1));      testing::Mock::VerifyAndClearExpectations(&driver); -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      toggle_layer_1_on_layer_0.release();      run_one_scan_loop();      EXPECT_TRUE(layer_state_is(1)); @@ -237,8 +231,7 @@ TEST_F(ActionLayer, ToggleLayerUpAndDown) {      EXPECT_TRUE(layer_state_is(0));      testing::Mock::VerifyAndClearExpectations(&driver); -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      toggle_layer_0_on_layer_1.release();      run_one_scan_loop();      EXPECT_TRUE(layer_state_is(0)); @@ -254,14 +247,13 @@ TEST_F(ActionLayer, LayerTapToggleDoesNothing) {      set_keymap({layer_key});      /* Press and release TT. */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.press();      run_one_scan_loop();      EXPECT_TRUE(layer_state_is(1));      testing::Mock::VerifyAndClearExpectations(&driver); -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.release();      run_one_scan_loop();      EXPECT_TRUE(layer_state_is(0)); @@ -279,7 +271,6 @@ TEST_F(ActionLayer, LayerTapToggleWithKeypress) {      set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});      /* Press TT. */ -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);      layer_key.press();      run_one_scan_loop(); @@ -298,8 +289,7 @@ TEST_F(ActionLayer, LayerTapToggleWithKeypress) {      EXPECT_TRUE(layer_state_is(1));      testing::Mock::VerifyAndClearExpectations(&driver); -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.release();      run_one_scan_loop();      EXPECT_TRUE(layer_state_is(0)); @@ -317,8 +307,7 @@ TEST_F(ActionLayer, LayerTapToggleWithToggleWithKeypress) {      set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});      /* Tap TT five times . */ -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(9); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.press();      run_one_scan_loop(); diff --git a/tests/basic/test_keypress.cpp b/tests/basic/test_keypress.cpp index 1c175c9d56..044fc29378 100644 --- a/tests/basic/test_keypress.cpp +++ b/tests/basic/test_keypress.cpp @@ -85,7 +85,7 @@ TEST_F(KeyPress, CorrectKeysAreReportedWhenTwoKeysArePressed) {  TEST_F(KeyPress, LeftShiftIsReportedCorrectly) {      TestDriver driver;      auto       key_a    = KeymapKey(0, 0, 0, KC_A); -    auto       key_lsft = KeymapKey(0, 3, 0, KC_LSFT); +    auto       key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT);      set_keymap({key_a, key_lsft}); @@ -110,8 +110,8 @@ TEST_F(KeyPress, LeftShiftIsReportedCorrectly) {  TEST_F(KeyPress, PressLeftShiftAndControl) {      TestDriver driver; -    auto       key_lsft  = KeymapKey(0, 3, 0, KC_LSFT); -    auto       key_lctrl = KeymapKey(0, 5, 0, KC_LCTRL); +    auto       key_lsft  = KeymapKey(0, 3, 0, KC_LEFT_SHIFT); +    auto       key_lctrl = KeymapKey(0, 5, 0, KC_LEFT_CTRL);      set_keymap({key_lctrl, key_lsft}); @@ -138,8 +138,8 @@ TEST_F(KeyPress, PressLeftShiftAndControl) {  TEST_F(KeyPress, LeftAndRightShiftCanBePressedAtTheSameTime) {      TestDriver driver; -    auto       key_lsft = KeymapKey(0, 3, 0, KC_LSFT); -    auto       key_rsft = KeymapKey(0, 4, 0, KC_RSFT); +    auto       key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT); +    auto       key_rsft = KeymapKey(0, 4, 0, KC_RIGHT_SHIFT);      set_keymap({key_rsft, key_lsft}); @@ -175,12 +175,12 @@ TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) {      // The underlying cause is that we use only one bit to represent the right hand      // modifiers.      combo_key.press(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL))); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL, KC_O))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL, KC_O)));      keyboard_task();      combo_key.release(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      keyboard_task();  } @@ -189,18 +189,18 @@ TEST_F(KeyPress, PressPlusEqualReleaseBeforePress) {      TestDriver driver;      InSequence s;      auto       key_plus = KeymapKey(0, 1, 1, KC_PLUS); -    auto       key_eql  = KeymapKey(0, 0, 1, KC_EQL); +    auto       key_eql  = KeymapKey(0, 0, 1, KC_EQUAL);      set_keymap({key_plus, key_eql});      key_plus.press(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL)));      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver);      key_plus.release(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); @@ -220,13 +220,13 @@ TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) {      TestDriver driver;      InSequence s;      auto       key_plus = KeymapKey(0, 1, 1, KC_PLUS); -    auto       key_eql  = KeymapKey(0, 0, 1, KC_EQL); +    auto       key_eql  = KeymapKey(0, 0, 1, KC_EQUAL);      set_keymap({key_plus, key_eql});      key_plus.press(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL)));      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); @@ -237,14 +237,13 @@ TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) {      testing::Mock::VerifyAndClearExpectations(&driver);      key_plus.release(); -    // BUG: Should really still return KC_EQL, but this is fine too -    // It's also called twice for some reason -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2); +    // BUG: Should really still return KC_EQUAL, but this is fine too +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver);      key_eql.release(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver);  } @@ -253,12 +252,12 @@ TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) {      TestDriver driver;      InSequence s;      auto       key_plus = KeymapKey(0, 1, 1, KC_PLUS); -    auto       key_eql  = KeymapKey(0, 0, 1, KC_EQL); +    auto       key_eql  = KeymapKey(0, 0, 1, KC_EQUAL);      set_keymap({key_plus, key_eql});      key_eql.press(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL)));      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); @@ -268,13 +267,13 @@ TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) {      testing::Mock::VerifyAndClearExpectations(&driver);      key_plus.press(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL)));      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver);      key_plus.release(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); @@ -284,12 +283,12 @@ TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) {      TestDriver driver;      InSequence s;      auto       key_plus = KeymapKey(0, 1, 1, KC_PLUS); -    auto       key_eql  = KeymapKey(0, 0, 1, KC_EQL); +    auto       key_eql  = KeymapKey(0, 0, 1, KC_EQUAL);      set_keymap({key_plus, key_eql});      key_eql.press(); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL)));      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); @@ -309,9 +308,7 @@ TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) {      testing::Mock::VerifyAndClearExpectations(&driver);      key_plus.release(); -    // This report is not needed -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); -}
\ No newline at end of file +} diff --git a/tests/basic/test_one_shot_keys.cpp b/tests/basic/test_one_shot_keys.cpp index 98178912e4..43fc3e1ba3 100644 --- a/tests/basic/test_one_shot_keys.cpp +++ b/tests/basic/test_one_shot_keys.cpp @@ -175,22 +175,20 @@ TEST_F(OneShot, OSLWithAdditionalKeypress) {      testing::Mock::VerifyAndClearExpectations(&driver);      /* Release OSL key */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      osl_key.release();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver);      /* Press regular key */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(regular_key.report_code))).Times(2); -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); +    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(regular_key.report_code))).Times(1);      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      regular_key.press();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver);      /* Release regular key */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      regular_key.release();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); diff --git a/tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp b/tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp index ab9dd1518b..00c2b33cb7 100644 --- a/tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp +++ b/tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp @@ -117,7 +117,6 @@ TEST_F(PermissiveHold, tap_regular_key_while_layer_tap_key_is_held) {      testing::Mock::VerifyAndClearExpectations(&driver);      /* Release regular key */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(layer_key.report_code)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      regular_key.release(); @@ -125,7 +124,7 @@ TEST_F(PermissiveHold, tap_regular_key_while_layer_tap_key_is_held) {      testing::Mock::VerifyAndClearExpectations(&driver);      /* Release layer-tap-hold key */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_tap_hold_key.release();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); diff --git a/tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp b/tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp index 67f394653f..67706f80dc 100644 --- a/tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp +++ b/tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp @@ -119,7 +119,6 @@ TEST_F(PermissiveHold_IgnoreModTapInterrupt, tap_regular_key_while_layer_tap_key      testing::Mock::VerifyAndClearExpectations(&driver);      /* Release regular key */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));      regular_key.release(); @@ -127,7 +126,7 @@ TEST_F(PermissiveHold_IgnoreModTapInterrupt, tap_regular_key_while_layer_tap_key      testing::Mock::VerifyAndClearExpectations(&driver);      /* Release layer-tap-hold key */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_tap_hold_key.release();      run_one_scan_loop();      testing::Mock::VerifyAndClearExpectations(&driver); diff --git a/tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp b/tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp index 02416eed73..54e7daa22c 100644 --- a/tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp +++ b/tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp @@ -31,9 +31,8 @@ TEST_F(ActionLayer, LayerTapToggleWithToggleWithKeypress) {      set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});      /* Tap TT five times . */ -    /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */      /* TODO: Tapping Force Hold breaks TT */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(10); +    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);      layer_key.press();      run_one_scan_loop(); diff --git a/tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp b/tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp index cb68429617..3ae7c4ccfd 100644 --- a/tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp +++ b/tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp @@ -60,7 +60,6 @@ TEST_F(TappingForceHold, tap_regular_key_while_mod_tap_key_is_held) {      testing::Mock::VerifyAndClearExpectations(&driver);      /* Idle for tapping term of mod tap hold key. */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_A)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); @@ -101,7 +100,6 @@ TEST_F(TappingForceHold, tap_mod_tap_key_while_mod_tap_key_is_held) {      testing::Mock::VerifyAndClearExpectations(&driver);      /* Idle for tapping term of first mod tap hold key. */ -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_A)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));      EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); diff --git a/tests/test_common/test_fixture.cpp b/tests/test_common/test_fixture.cpp index 0601b17191..91bf3e779e 100644 --- a/tests/test_common/test_fixture.cpp +++ b/tests/test_common/test_fixture.cpp @@ -48,7 +48,6 @@ void TestFixture::SetUpTestCase() {      eeconfig_update_debug(debug_config.raw);      TestDriver driver; -    EXPECT_CALL(driver, send_keyboard_mock(_));      keyboard_init();      test_logger.info() << "TestFixture setup-up end." << std::endl; @@ -62,8 +61,6 @@ TestFixture::~TestFixture() {      test_logger.info() << "TestFixture clean-up start." << std::endl;      TestDriver driver; -    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2); -      /* Reset keyboard state. */      clear_all_keys(); diff --git a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h index e1749f872d..319ff8487d 100644 --- a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h +++ b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h @@ -19,7 +19,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define _ARM_ATSAM_PROTOCOL_H_  #include "samd51j18a.h" -#include "md_bootloader.h"  #include "timer.h"  #include "d51_util.h" diff --git a/tmk_core/protocol/arm_atsam/md_bootloader.h b/tmk_core/protocol/arm_atsam/md_bootloader.h deleted file mode 100644 index 362b9bd52a..0000000000 --- a/tmk_core/protocol/arm_atsam/md_bootloader.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _MD_BOOTLOADER_H_ -#define _MD_BOOTLOADER_H_ - -extern uint32_t _srom; -extern uint32_t _lrom; -extern uint32_t _erom; - -#define BOOTLOADER_SERIAL_MAX_SIZE 20  // DO NOT MODIFY! - -#ifdef KEYBOARD_massdrop_ctrl -// WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support -extern uint32_t _eram; -#    define BOOTLOADER_MAGIC 0x3B9ACA00 -#    define MAGIC_ADDR (uint32_t *)((intptr_t)(&_eram) - 4) -#endif - -#ifdef MD_BOOTLOADER - -#    define MCU_HZ 48000000 -#    define I2C_HZ 0  // Not used - -#endif  // MD_BOOTLOADER - -#endif  //_MD_BOOTLOADER_H_ diff --git a/tmk_core/protocol/arm_atsam/startup.c b/tmk_core/protocol/arm_atsam/startup.c index 7a5791ab55..ce043bad51 100644 --- a/tmk_core/protocol/arm_atsam/startup.c +++ b/tmk_core/protocol/arm_atsam/startup.c @@ -28,7 +28,6 @@   */  #include "samd51.h" -#include "md_bootloader.h"  /* Initialize segments */  extern uint32_t _sfixed; @@ -496,6 +495,11 @@ __attribute__((section(".vectors"))) const DeviceVectors exception_table = {  #endif  }; +// WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support +extern uint32_t _eram; +#define BOOTLOADER_MAGIC 0x3B9ACA00 +#define MAGIC_ADDR (uint32_t *)((intptr_t)(&_eram) - 4) +  /**   * \brief This is the code that gets called on processor reset.   * To initialize the device, and call the main() routine. diff --git a/tmk_core/protocol/arm_atsam/usb/udc.c b/tmk_core/protocol/arm_atsam/usb/udc.c index d04e9b7b28..1f0c0d95d6 100644 --- a/tmk_core/protocol/arm_atsam/usb/udc.c +++ b/tmk_core/protocol/arm_atsam/usb/udc.c @@ -51,7 +51,8 @@  #include "udi_device_conf.h"  #include "udi.h"  #include "udc.h" -#include "md_bootloader.h" + +#define BOOTLOADER_SERIAL_MAX_SIZE 20  // DO NOT MODIFY!  /**   * \ingroup udc_group @@ -122,6 +123,8 @@ static uint8_t udc_string_product_name[] = USB_DEVICE_PRODUCT_NAME;  #    define USB_DEVICE_SERIAL_NAME_SIZE 0  #endif +extern uint32_t _srom; +  uint8_t     usb_device_serial_name_size = 0;  #if defined USB_DEVICE_SERIAL_USE_BOOTLOADER_SERIAL  uint8_t     bootloader_serial_number[BOOTLOADER_SERIAL_MAX_SIZE + 1] = ""; diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index e3be96d93d..b9c2616058 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -69,8 +69,8 @@ extern keymap_config_t keymap_config;  #    include "outputselect.h"  #    ifdef MODULE_ADAFRUIT_BLE  #        include "adafruit_ble.h" -#    else -#        include "../serial.h" +#    elif MODULE_RN42 +#        include "rn42.h"  #    endif  #endif @@ -90,46 +90,6 @@ extern keymap_config_t keymap_config;  #    include "joystick.h"  #endif -// https://cdn.sparkfun.com/datasheets/Wireless/Bluetooth/bluetooth_cr_UG-v1.0r.pdf#G7.663734 -static inline uint16_t CONSUMER2RN42(uint16_t usage) { -    switch (usage) { -        case AC_HOME: -            return 0x0001; -        case AL_EMAIL: -            return 0x0002; -        case AC_SEARCH: -            return 0x0004; -        case AL_KEYBOARD_LAYOUT: -            return 0x0008; -        case AUDIO_VOL_UP: -            return 0x0010; -        case AUDIO_VOL_DOWN: -            return 0x0020; -        case AUDIO_MUTE: -            return 0x0040; -        case TRANSPORT_PLAY_PAUSE: -            return 0x0080; -        case TRANSPORT_NEXT_TRACK: -            return 0x0100; -        case TRANSPORT_PREV_TRACK: -            return 0x0200; -        case TRANSPORT_STOP: -            return 0x0400; -        case TRANSPORT_EJECT: -            return 0x0800; -        case TRANSPORT_FAST_FORWARD: -            return 0x1000; -        case TRANSPORT_REWIND: -            return 0x2000; -        case TRANSPORT_STOP_EJECT: -            return 0x4000; -        case AL_LOCAL_BROWSER: -            return 0x8000; -        default: -            return 0; -    } -} -  uint8_t keyboard_idle = 0;  /* 0: Boot Protocol, 1: Report Protocol(default) */  uint8_t        keyboard_protocol  = 1; @@ -688,14 +648,7 @@ static void send_keyboard(report_keyboard_t *report) {  #    ifdef MODULE_ADAFRUIT_BLE          adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys));  #    elif MODULE_RN42 -        serial_send(0xFD); -        serial_send(0x09); -        serial_send(0x01); -        serial_send(report->mods); -        serial_send(report->reserved); -        for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { -            serial_send(report->keys[i]); -        } +        rn42_send_keyboard(report);  #    endif          return;      } @@ -741,16 +694,8 @@ static void send_mouse(report_mouse_t *report) {  #        ifdef MODULE_ADAFRUIT_BLE          // FIXME: mouse buttons          adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h, report->buttons); -#        else -        serial_send(0xFD); -        serial_send(0x00); -        serial_send(0x03); -        serial_send(report->buttons); -        serial_send(report->x); -        serial_send(report->y); -        serial_send(report->v);  // should try sending the wheel v here -        serial_send(report->h);  // should try sending the wheel h here -        serial_send(0x00); +#        elif MODULE_RN42 +        rn42_send_mouse(report);  #        endif          return;      } @@ -821,15 +766,7 @@ static void send_consumer(uint16_t data) {  #        ifdef MODULE_ADAFRUIT_BLE          adafruit_ble_send_consumer_key(data);  #        elif MODULE_RN42 -        static uint16_t last_data = 0; -        if (data == last_data) return; -        last_data       = data; -        uint16_t bitmap = CONSUMER2RN42(data); -        serial_send(0xFD); -        serial_send(0x03); -        serial_send(0x03); -        serial_send(bitmap & 0xFF); -        serial_send((bitmap >> 8) & 0xFF); +        rn42_send_consumer(data);  #        endif          return;      } @@ -1077,7 +1014,7 @@ void protocol_pre_init(void) {      sei();  #if defined(MODULE_RN42) -    serial_init(); +    rn42_init();  #endif      /* wait for USB startup & debug output */ diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index a43755f899..0b992ba6c5 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -450,7 +450,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = {  #endif  #ifndef USB_POLLING_INTERVAL_MS -#    define USB_POLLING_INTERVAL_MS 10 +#    define USB_POLLING_INTERVAL_MS 1  #endif  /* diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index bd0f1c21aa..8bdcccc9c9 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -647,7 +647,6 @@ const PROGMEM uchar console_hid_report[] = {  #    define USB_MAX_POWER_CONSUMPTION 500  #endif -// TODO: change this to 10ms to match LUFA  #ifndef USB_POLLING_INTERVAL_MS  #    define USB_POLLING_INTERVAL_MS 1  #endif diff --git a/users/drashna/oled/oled_stuff.c b/users/drashna/oled/oled_stuff.c index 9ee2cbfed8..8894814985 100644 --- a/users/drashna/oled/oled_stuff.c +++ b/users/drashna/oled/oled_stuff.c @@ -348,9 +348,8 @@ void render_wpm(uint8_t padding) {  #endif  } -#if defined(KEYBOARD_handwired_tractyl_manuform) || defined(KEYBOARD_bastardkb_charybdis) -extern kb_config_data_t kb_config; -void                    render_pointing_dpi_status(uint8_t padding) { +#if defined(POINTING_DEVICE_ENABLE) +void render_pointing_dpi_status(uint16_t cpi, uint8_t padding) {      oled_write_P(PSTR("CPI:"), false);      if (padding) {          for (uint8_t n = padding - 1; n > 0; n--) { @@ -358,7 +357,7 @@ void                    render_pointing_dpi_status(uint8_t padding) {          }      } -    oled_write(get_u16_str(kb_config.device_cpi, ' '), false); +    oled_write(get_u16_str(cpi, ' '), false);  }  #endif @@ -381,8 +380,10 @@ __attribute__((weak)) void oled_driver_render_logo_left(void) {      render_wpm(0);  #    endif      oled_write_P(PSTR("  "), false); -#    if defined(KEYBOARD_handwired_tractyl_manuform) || defined(KEYBOARD_bastardkb_charybdis) -    render_pointing_dpi_status(1); +#    if defined(KEYBOARD_handwired_tractyl_manuform) +    render_pointing_dpi_status(kb_config_data.device_cpi, 1); +#    elif defined(KEYBOARD_bastardkb_charybdis) +    render_pointing_dpi_status(, 1);  #    endif      oled_set_cursor(0, 4);  #else diff --git a/users/drashna/oled/oled_stuff.h b/users/drashna/oled/oled_stuff.h index 8795684d6a..fd64b50874 100644 --- a/users/drashna/oled/oled_stuff.h +++ b/users/drashna/oled/oled_stuff.h @@ -33,7 +33,7 @@ void            render_bootmagic_status(void);  void            render_user_status(void);  void            oled_driver_render_logo(void);  void            render_wpm(uint8_t padding); -void            render_pointing_dpi_status(uint8_t padding); +void            render_pointing_dpi_status(uint16_t cpi, uint8_t padding);  void            oled_driver_render_logo_left(void);  void            oled_driver_render_logo_right(void); diff --git a/users/vitoni/readme.adoc b/users/vitoni/readme.adoc new file mode 100644 index 0000000000..acf65793d2 --- /dev/null +++ b/users/vitoni/readme.adoc @@ -0,0 +1,16 @@ += User functions + +Functions are mostly related to changing the RGB lights depending on user interaction and when idling. + +== utils.h + +Common functions are declared in link:utils.h[]. These function are not directly RGB related but used to modify state and calculate values. + +== rgb_matrix_effects.h + +Functions in link:rgb_matrix_effects.h[] make use of common function in `utils.h` and are used to create to RGB matrix effects such as fading or breathing. + +== vitoni.h + +The functions declared in link:vitoni.h[] are used as entry points for usage of RGB effects. +One entry point is `matrix_scan` based for regular task while the other is `process_record` based for user activity tasks. diff --git a/users/vitoni/rgb_matrix_effects.c b/users/vitoni/rgb_matrix_effects.c new file mode 100644 index 0000000000..3a13e99bc7 --- /dev/null +++ b/users/vitoni/rgb_matrix_effects.c @@ -0,0 +1,236 @@ +// Copyright 2021 Victor Toni (@vitoni) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rgb_matrix_effects.h" + +#include <rgb_matrix.h> +#include <lib/lib8tion/lib8tion.h> + +#include "utils.h" + +/* + Offset used to start at the right point in th curve to avoid big jumps in brightness +  0 =>    0% (signed) =>  50% (unsigned) +  64 =>  100% (signed) => 100% (unsigned) + 128 =>    0% (signed) =>  50% (unsigned) + 192 => -100% (signed) =>   0% (unsigned) +*/ +enum PHASE { +    PHASE_ZERO_RAISING +    ,PHASE_HIGH +    ,PHASE_ZERO_FALLING +    ,PHASE_LOW +}; + +/** + * @brief Calculates the offset so that a specific time is aligned to a specific point in the sine curve. + * @param[in]   time    The time for which the offset shopuld be calculated. + * @param[in]   phase   Phase which should be reached with the offset + * @see PHASE + */ +uint8_t offset_for_time(const uint8_t time, const uint8_t phase) { +    switch (phase) { +        case PHASE_ZERO_RAISING: +            return 0 - time; +        case PHASE_HIGH: +            return 64 - time; +        case PHASE_ZERO_FALLING: +            return 128 - time; +        case PHASE_LOW: +            return 192 - time; +        default: +            return 0; +    } +} + +/** + * @brief Scales down `g_rgb_timer` so that it can be used for RGB effects. + * @return scaled down timer + * @see rgb_time_2_scale_w_factor() + */ +uint8_t rgb_time_2_scale(void) { +    static const uint8_t factor = 1; +    return rgb_time_2_scale_w_factor(factor); +} + +/* + * Used to slow down RGB speed. + */ +static const uint8_t rgb_speed_divisor = 8; + +/** + * @brief Scales down `g_rgb_timer` so that it can be used for RGB effects. + * @details Usually these calculations aredone internally by some RGB effects. + This method exposed to scaling so that all effects to have same timebase. If `rgb_matrix_config.speed` all effects are affected the same. + * @param[in]   factor The factor can be used to speed up some operations in relation to others. + * @return scaled down timer taking into account the given factor + * @see g_rgb_timer + * @see rgb_matrix_config.speed + */ +uint8_t rgb_time_2_scale_w_factor(const uint8_t rgb_speed_factor) { +    const uint8_t scaled_time = scale16by8(g_rgb_timer, rgb_matrix_config.speed * rgb_speed_factor / rgb_speed_divisor); + +    return scaled_time; +} + +/** + * @brief Inverse function to calculate time required to execute `timer` steps. + * @details This method allows calculation of the time needed to execute N `timer`steps. + Usefull when using a scaled down time but requiring the time needed to perform these steps. + * @param[in]   scaled_time scaled down timer to inverse to time + * @return time corresponding to scaled down time + * @see rgb_time_2_scale() + */ +uint16_t scale_2_rgb_time(const uint8_t scaled_time) { +    const uint16_t time = scaled_time * rgb_speed_divisor * UINT8_MAX / rgb_matrix_config.speed; + +    return time; +} + +bool fade_in_ranged(const uint8_t time, const uint8_t range_min, const uint8_t range_max) { +    static const uint8_t max_delta = 1; +    return scaled_sin_up(time, range_min, range_max, max_delta, &(rgb_matrix_config.hsv.v)); +} + +bool fade_out_ranged(const uint8_t time, const uint8_t range_min, const uint8_t range_max) { +    static const uint8_t max_delta = 1; +    return scaled_sin_down(time, range_min, range_max, max_delta, &(rgb_matrix_config.hsv.v)); +} + +/** + * @brief Convenience method to eventually skip the value part when setting HSV. + * @details When setting HSV this includes the value/brightness. + As changing brightness might interfer with fading or breathing effects, + this method can skip the value part of HSV (depending on the preprocessor flag: RGB_FADE_IN). + * @param[in]   hue Hue + * @param[in]   sat Saturation + * @param[in]   hue Value (brightness) + * @see rgb_matrix_sethsv_noeeprom() + */ +void rgb_matrix_sethsv_noeeprom_user(const uint16_t hue, const uint8_t sat, const uint8_t val) { +#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT) +    rgb_matrix_config.hsv.h = hue; +    rgb_matrix_config.hsv.s = sat; +    // omitting setting the value to avoid interfering with effects +//    rgb_matrix_config.hsv.v = val; +#else +    rgb_matrix_sethsv_noeeprom(hue, sat, val); +#endif +} + +#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT) +/** + * @brief Calculates the time offset required by fade in. + * @details Using an arbitrary timer any point on the sine curve might be pointed to. + * The offest is calculated so that + * a) the point is at the lowest point in the curve and the curve is raising + * b) the point is near the current brightness (eg. fade in might be called while fading out and the lowest value has not yet been reached). + * @param[in]   time Current time usually represented by (usually scaled) timer + * @return Offset required so that time matches the current brightness + */ +uint8_t calc_fade_in_offset(const uint8_t time) { +    static const uint8_t max_steps = UINT8_MAX/2; +    static const uint8_t range_min = 0; +    static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS; + +    // start at the right point in the sine curve +    uint8_t time_offset = offset_for_time(time, PHASE_LOW); + +    // find the right offset to match the current brightness +    for (int i = 1; i < max_steps; i++) { +        const uint8_t value = scaled_sin(time + time_offset + 1, range_min, range_max); +        if (in_range(value, range_min, range_max) && value < rgb_matrix_config.hsv.v) { +            time_offset++; +        } else { +            break; +        } +    } + +    return time_offset; +} + +/** + * @brief Increases value/brightness until reaching RGB_MATRIX_MAXIMUM_BRIGHTNESS based on given timer. + * @param[in]   time A (usually scaled) timer + * @return Returns `true` if RGB_MATRIX_MAXIMUM_BRIGHTNESS has been reached, `false` otherwise. + */ +bool fade_in(const uint8_t time) { +    static const uint8_t range_min = 0; +    static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS; + +    return fade_in_ranged(time, range_min, range_max); +} +#endif + +#if defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT) +/** + * @brief Calculates the time offset required by fade out. + * @details Using an arbitrary timer any point on the Sinus curve might be pointed to. + * The offest is calculated so that + * a) the point is at the highest point in the curve and the curve is failing + * b) the point is near the current brightness (eg. fade out might be called while on breath effect). + * @param[in]   time Current time usually represented by a(usually scaled) timer + * @return Offset required so that time matches the current brightness + */ +uint8_t calc_fade_out_offset(const uint8_t time) { +    static const uint8_t range_min = 0; +    static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS; + +    // start at the right point in the sin() curve +    uint8_t time_offset = offset_for_time(time, PHASE_HIGH); + +    // find the right offset to match the current brightness +    for (int i = 1; i < 127; i++) { +        const uint8_t value = scaled_sin(time + time_offset + 1, range_min, range_max); +        if (in_range(value, range_min, range_max) && rgb_matrix_config.hsv.v < value) { +            time_offset++; +        } else { +            break; +        } +    } + +    return time_offset; +} +#endif + +#if defined(RGB_DISABLE_WITH_FADE_OUT) +/** + * @brief Decreases value/brightness until reaching 0 based on given timer. + * @param[in]   time A (usually scaled) timer + * @return Returns `true` if 0 has been reached, `false` otherwise. + */ +bool fade_out(const uint8_t time) { +    static const uint8_t range_min = 0; +    static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS; + +    return fade_out_ranged(time, range_min, range_max); +} +#endif + +#if defined(RGB_IDLE_TIMEOUT) +/** + * @brief Decreases value/brightness until reaching `RGB_IDLE_MINIMUM_BRIGHTNESS` based on given timer. + * @param[in]   time A (usually scaled) timer + * @return Returns `true` if `RGB_IDLE_MINIMUM_BRIGHTNESS` has been reached, `false` otherwise. + */ +bool idle_fade_out(const uint8_t time) { +    static const uint8_t range_min = RGB_IDLE_MINIMUM_BRIGHTNESS; +    static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS; + +    return fade_out_ranged(time, range_min, range_max); +} + +#if defined(RGB_IDLE_BREATHE) +/** + * @brief Changes value/brightness to create a breathing effect based on given timer. + * @details Brightness will breathe in the range starting from `RGB_IDLE_MINIMUM_BRIGHTNESS` to `RGB_IDLE_MAXIMUM_BRIGHTNESS`. + * @param[in]   time A (usually scaled) timer + */ +void idle_breathe(const uint8_t time) { +    static const uint8_t range_min = RGB_IDLE_MINIMUM_BRIGHTNESS; +    static const uint8_t range_max = RGB_IDLE_MAXIMUM_BRIGHTNESS; + +    rgb_matrix_config.hsv.v = scaled_sin(time, range_min, range_max); +} +#endif // RGB_IDLE_BREATHE +#endif // RGB_IDLE_TIMEOUT diff --git a/users/vitoni/rgb_matrix_effects.h b/users/vitoni/rgb_matrix_effects.h new file mode 100644 index 0000000000..ed74500b18 --- /dev/null +++ b/users/vitoni/rgb_matrix_effects.h @@ -0,0 +1,174 @@ +// Copyright 2021 Victor Toni (@vitoni) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include <stdint.h> +#include <stdbool.h> + +/** + * States reflecting the state of the keyboard. + * Dependeing on these states various effects can set for the RGB matrix. + */ +enum states { +    REGULAR             //!< when in regular use +#if defined(RGB_IDLE_TIMEOUT) +    ,IDLE_FADE_OUT      //!< when started idling +    ,IDLE               //!< when idling +#endif +#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT) +    ,FADE_IN            //!< when starting initially or before going back to REGULAR +#endif +#if defined(RGB_DISABLE_WITH_FADE_OUT) +    ,FADE_OUT           //!< before supending +#endif +    ,SUSPENDED          //!< expecting to be suspended by RGB_DISABLE_TIMEOUT any time +}; + +/** + * @brief Scales down `g_rgb_timer` so that it can be used for RGB effects. + * @details Usually these calculations aredone internally by some RGB effects. + This method exposed to scaling so that all effects to have same timebase. If `rgb_matrix_config.speed` all effects are affected the same. + * @param[in]   factor The factor can be used to speed up some operations in relation to others. + * @return scaled down timer taking into account the given factor + * @see g_rgb_timer + * @see rgb_matrix_config.speed + */ +uint8_t rgb_time_2_scale_w_factor(const uint8_t factor); + +/** + * @brief Scales down `g_rgb_timer` so that it can be used for RGB effects. + * @return scaled down timer + * @see rgb_time_2_scale_w_factor() + */ +uint8_t rgb_time_2_scale(void); + +/** + * @brief Inverse function to calculate time required to execute `timer` steps. + * @details This method allows calculation of the time needed to execute N `timer`steps. + Usefull when using a scaled down time but requiring the time needed to perform these steps. + * @param[in]   scaled_time scaled down timer to inverse to time + * @return time corresponding to scaled down time + * @see rgb_time_2_scale() + */ +uint16_t scale_2_rgb_time(const uint8_t scaled_time); + +/** + * @brief Convenience method to eventually skip the value part when setting HSV. + * @details When setting HSV this includes the value/brightness. + As changing brightness might interfer with fading or breathing effects, + this method can skip the value part of HSV (depending on the preprocessor flag: RGB_FADE_IN). + * @param[in]   hue Hue + * @param[in]   sat Saturation + * @param[in]   hue Value (brightness) + * @see rgb_matrix_sethsv_noeeprom() + */ +void rgb_matrix_sethsv_noeeprom_user(const uint16_t hue, const uint8_t sat, const uint8_t val); + +#if defined(RGB_FADE_IN) || defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT) +#   if defined(RGB_MATRIX_MAXIMUM_BRIGHTNESS) +#       if (RGB_MATRIX_MAXIMUM_BRIGHTNESS) < 1 +#           error "RGB_MATRIX_MAXIMUM_BRIGHTNESS must not be less than ONE" +#       endif +#       if UINT8_MAX < (RGB_MATRIX_MAXIMUM_BRIGHTNESS) +#           error "RGB_MATRIX_MAXIMUM_BRIGHTNESS must not be larger than UINT8_MAX" +#       endif +#   else +#       define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 +#   endif +#endif + +#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT) +/** + * @brief Calculates the time offset required by fade in. + * @details Using an arbitrary timer any point on the sine curve might be pointed to. + * The offset is calculated so that + * a) the point is at the lowest point in the curve and the curve is raising + * b) the point is near the current brightness (eg. fade in might be called while fading out and the lowest value has not yet been reached). + * @param[in]   time Current time usually represented by a(usually scaled) timer + * @return Offset required so that time matches the current brightness + */ +uint8_t calc_fade_in_offset(const uint8_t time); + +/** + * @brief Increases value/brightness until reaching RGB_MATRIX_MAXIMUM_BRIGHTNESS based on given timer. + * @param[in]   time A (usually scaled) timer + * @return Returns `true` if RGB_MATRIX_MAXIMUM_BRIGHTNESS has been reached, `false` otherwise. + */ +bool fade_in(const uint8_t time); +#endif + +#if defined(RGB_DISABLE_WITH_FADE_OUT) +#   if !defined(RGB_DISABLE_TIMEOUT) +#       warning "RGB_DISABLE_WITH_FADE_OUT expects RGB_DISABLE_TIMEOUT to be defined" +#   endif +#endif + +#if defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT) +/** + * @brief Calculates the time offset required by fade out. + * @details Using an arbitrary timer any point on the Sinus curve might be pointed to. + * The offest is calculated so that + * a) the point is at the highest point in the curve and the curve is failing + * b) the point is near the current brightness (eg. fade out might be called while on breath effect). + * @param[in]   time Current time usually represented by a(usually scaled) timer + * @return Offset required so that time matches the current brightness + */ +uint8_t calc_fade_out_offset(const uint8_t time); +#endif + +#if defined(RGB_DISABLE_WITH_FADE_OUT) +/** + * @brief Decreases value/brightness until reaching 0 based on given timer. + * @param[in]   time A (usually scaled) timer + * @return Returns `true` if 0 has been reached, `false` otherwise. + */ +bool fade_out(const uint8_t time); +#endif + +#if defined(RGB_IDLE_TIMEOUT) +#   if RGB_IDLE_TIMEOUT < 0 +#       error "RGB_IDLE_TIMEOUT must not be less than ZERO" +#   endif +#   if !defined(RGB_IDLE_MINIMUM_BRIGHTNESS) +        // minimum brightness when idling +#       define RGB_IDLE_MINIMUM_BRIGHTNESS (RGB_MATRIX_MAXIMUM_BRIGHTNESS/5) +#   endif +#   if RGB_IDLE_MINIMUM_BRIGHTNESS < 0 +#       error "RGB_IDLE_MINIMUM_BRIGHTNESS must not be less than ZERO" +#   endif // RGB_IDLE_MINIMUM_BRIGHTNESS < 0 +#   if RGB_MATRIX_MAXIMUM_BRIGHTNESS <= RGB_IDLE_MINIMUM_BRIGHTNESS +#       error "RGB_IDLE_MINIMUM_BRIGHTNESS must be less than RGB_MATRIX_MAXIMUM_BRIGHTNESS" +#   endif // RGB_MATRIX_MAXIMUM_BRIGHTNESS <= RGB_IDLE_MINIMUM_BRIGHTNESS + +/** + * @brief Decreases value/brightness until reaching `RGB_IDLE_MINIMUM_BRIGHTNESS` based on given timer. + * @param[in]   time A (usually scaled) timer + * @return Returns `true` if `RGB_IDLE_MINIMUM_BRIGHTNESS` has been reached, `false` otherwise. + */ +bool idle_fade_out(const uint8_t time); + +#if defined(RGB_IDLE_BREATHE) +#   if !defined(RGB_IDLE_MAXIMUM_BRIGHTNESS) +        // maximum brightness when idling +#       define RGB_IDLE_MAXIMUM_BRIGHTNESS (RGB_MATRIX_MAXIMUM_BRIGHTNESS*3/5) +#   endif +#   if !(0 <= RGB_IDLE_MAXIMUM_BRIGHTNESS) +#       error "RGB_IDLE_MINIMUM_BRIGHTNESS must not be less than ZERO, was: " RGB_IDLE_MAXIMUM_BRIGHTNESS +#   endif // RGB_IDLE_MAXIMUM_BRIGHTNESS < 0 +#   if !(RGB_IDLE_MINIMUM_BRIGHTNESS < RGB_IDLE_MAXIMUM_BRIGHTNESS) +#       error "RGB_IDLE_MINIMUM_BRIGHTNESS must be less than RGB_IDLE_MAXIMUM_BRIGHTNESS" +#   endif // RGB_IDLE_MAXIMUM_BRIGHTNESS <= RGB_IDLE_MINIMUM_BRIGHTNESS +#   if !(RGB_IDLE_MAXIMUM_BRIGHTNESS <= RGB_MATRIX_MAXIMUM_BRIGHTNESS) +#       error "RGB_IDLE_MAXIMUM_BRIGHTNESS must be less than or equal to RGB_MATRIX_MAXIMUM_BRIGHTNESS" +#   endif // RGB_MATRIX_MAXIMUM_BRIGHTNESS <= RGB_IDLE_MAXIMUM_BRIGHTNESS + +/** + * @brief Changes value/brightness to create a breathing effect based on given timer. + * @details Brightness will breathe in the range starting from `RGB_IDLE_MINIMUM_BRIGHTNESS` to `RGB_IDLE_MAXIMUM_BRIGHTNESS`. + * @param[in]   time A (usually scaled) timer + */ +void idle_breathe(const uint8_t time); +#endif // RGB_IDLE_BREATHE + +#endif // RGB_IDLE_TIMEOUT diff --git a/users/vitoni/rules.mk b/users/vitoni/rules.mk new file mode 100644 index 0000000000..2f3b0d15e5 --- /dev/null +++ b/users/vitoni/rules.mk @@ -0,0 +1,4 @@ +SRC += \ +	vitoni.c \ +	utils.c \ +	rgb_matrix_effects.c diff --git a/users/vitoni/utils.c b/users/vitoni/utils.c new file mode 100644 index 0000000000..fb011570e4 --- /dev/null +++ b/users/vitoni/utils.c @@ -0,0 +1,129 @@ +// Copyright 2021 Victor Toni (@vitoni) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "utils.h" + +#include <lib/lib8tion/lib8tion.h> + +/** +* @brief Changes `*value` to `new_value`. +* @param[in,out] value      Pointer to variable to be changed. +* @param[in]     new_value  Value to be changed. +* @param[in,out] changed    Flag indicating `*value` and `new_value` were different. +*/ +void update_value(uint8_t *value, const uint8_t new_value, bool *changed) { +    if (new_value != (*value)) { +        (*changed) = true; +        (*value) = new_value; +    } +} + +/** +* @brief Checks whether a value is in the given range. +* @param[in] value      Value to be checked. +* @param[in] range_min  Lower bound of range (inclusive). +* @param[in] range_max  Upper bound of range (inclusive). +* @return `true` if (range_min <= value <= range_max), `false` otherwise +*/ +bool in_range(const uint8_t value, const uint8_t range_min, const uint8_t range_max) { +    return range_min <= value && value <= range_max; +} + +/** +* @brief Calculates the sine value based on sin8() and scales it to the given range (unsigned). +* +* Table of values for unscaled sin8() eg. a theta of 0 results to 128 and a theta of 255 (240+15) results to 125. +        0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 +    +---------------------------------------------------------------- +   0: 128 131 134 137 140 143 146 149 152 155 158 161 164 167 170 173 +  16: 177 179 182 184 187 189 192 194 197 200 202 205 207 210 212 215 +  32: 218 219 221 223 224 226 228 229 231 233 234 236 238 239 241 243 +  48: 245 245 246 246 247 248 248 249 250 250 251 251 252 253 253 254 +  64: 255 254 253 253 252 251 251 250 250 249 248 248 247 246 246 245 +  80: 245 243 241 239 238 236 234 233 231 229 228 226 224 223 221 219 +  96: 218 215 212 210 207 205 202 200 197 194 192 189 187 184 182 179 + 112: 177 173 170 167 164 161 158 155 152 149 146 143 140 137 134 131 + 128: 128 125 122 119 116 113 110 107 104 101  98  95  92  89  86  83 + 144:  79  77  74  72  69  67  64  62  59  56  54  51  49  46  44  41 + 160:  38  37  35  33  32  30  28  27  25  23  22  20  18  17  15  13 + 176:  11  11  10  10   9   8   8   7   6   6   5   5   4   3   3   2 + 192:   1   2   3   3   4   5   5   6   6   7   8   8   9  10  10  11 + 208:  11  13  15  17  18  20  22  23  25  27  28  30  32  33  35  37 + 224:  38  41  44  46  49  51  54  56  59  62  64  67  69  72  74  77 + 240:  79  83  86  89  92  95  98 101 104 107 110 113 116 119 122 125 +* +* @param[in] theta      Angle (a full circle mapped to 0-255) used as input for sine calculation. +* @param[in] range_min  Lower bound of range (inclusive). +* @param[in] range_max  Upper bound of range (inclusive). +* @return Calculated sine value mapped to the given range. +*/ +uint8_t scaled_sin(const uint8_t theta, const uint8_t range_min, const uint8_t range_max) { +    const uint8_t range = range_max - range_min; +    return scale8(sin8(theta), range) + range_min; +} + +/** +* @brief Increases the given value until reaching range_max. +* The increments occur following an upwards sine wave (scaled from range_min to range_max). +* @param[in]        theta       Angle (a full circle mapped to 0-255) used as input for sine calculation. +* @param[in]        range_min   Lower bound of range (inclusive). +* @param[in]        range_max   Upper bound of range (inclusive). +* @param[in]        max_delta   Maximum delta between value and range_max (due to values being integers and eventually not fully matching). +* @param[in,out]    value       Reference of variable to be increased +* @return `true` if value and range_max are within a delta of 3 (chosen by fair dice rolling), `false` otherwise +* @see scaled_sin() +*/ +bool scaled_sin_up(const uint8_t theta, const uint8_t range_min, const uint8_t range_max, const uint8_t max_delta, uint8_t *value) { +    // ensure upper range bound +    if (range_max <= (*value)) { +        (*value) = range_max; +        return true; +    } + +    const uint8_t new_value = scaled_sin(theta, range_min, range_max); +    if (in_range(new_value, range_min, range_max) && (*value) < new_value) { +        (*value) = new_value; + +        return range_max == (*value); +    } + +    const uint8_t delta = range_max - (*value); +    if (delta <= max_delta) { +        (*value) = range_max; +    } + +    return delta <= max_delta; +} + +/** +* @brief Decreases the given value until reaching range_min. +* The decrements occur following an downwards sinus wave (scaled from range_min to range_max). +* @param[in]        theta       Angle (a full circle mapped to 0-255) used as input for sinus calculation. +* @param[in]        range_min   Lower bound of range (inclusive). +* @param[in]        range_max   Upper bound of range (inclusive). +* @param[in]        max_delta   Maximum delta between value and range_min (due to values being integers and eventually not fully matching). +* @param[in,out]    value       Reference of variable to be decreased +* @return `true` if value and range_max are within a delta of 3 (chosen by fair dice rolling), `false` otherwise +* @see scaled_sin() +*/ +bool scaled_sin_down(const uint8_t theta, const uint8_t range_min, const uint8_t range_max, const uint8_t max_delta, uint8_t *value) { +    // ensure lower range bound +    if ((*value) <= range_min) { +        (*value) = range_min; +        return true; +    } + +    const uint8_t new_value = scaled_sin(theta, range_min, range_max); +    if (in_range(new_value, range_min, range_max) && new_value < (*value)) { +        (*value) = new_value; + +        return range_min == (*value); +    } + +    const uint8_t delta = (*value) - range_min; +    if (delta <= max_delta) { +        (*value) = range_min; +    } + +    return delta <= max_delta; +} diff --git a/users/vitoni/utils.h b/users/vitoni/utils.h new file mode 100644 index 0000000000..987b612d58 --- /dev/null +++ b/users/vitoni/utils.h @@ -0,0 +1,80 @@ +// Copyright 2021 Victor Toni (@vitoni) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include <stdint.h> +#include <stdbool.h> + +/** +* @brief Changes `*value` to `new_value`. +* @param[in,out] value      Pointer to variable to be changed. +* @param[in]     new_value  Value to be changed. +* @param[in,out] changed    Flag indicating `*value` and `new_value` were different. +*/ +void update_value(uint8_t *value, const uint8_t new_value, bool *changed); + +/** +* @brief Checks whether a value is in the given range. +* @param[in] value      Value to be checked. +* @param[in] range_min  Lower bound of range (inclusive). +* @param[in] range_max  Upper bound of range (inclusive). +* @return `true` if (range_min <= value <= range_max), `false` otherwise +*/ +bool in_range(const uint8_t value, const uint8_t range_min, const uint8_t range_max); + +/** +* @brief Calculates the sine value based on sin8() and scales it to the given range (unsigned). +* +* Table of values for unscaled sin8() eg. a theta of 0 results to 128 and a theta of 255 (240+15) results to 125. +        0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 +    +---------------------------------------------------------------- +   0: 128 131 134 137 140 143 146 149 152 155 158 161 164 167 170 173 +  16: 177 179 182 184 187 189 192 194 197 200 202 205 207 210 212 215 +  32: 218 219 221 223 224 226 228 229 231 233 234 236 238 239 241 243 +  48: 245 245 246 246 247 248 248 249 250 250 251 251 252 253 253 254 +  64: 255 254 253 253 252 251 251 250 250 249 248 248 247 246 246 245 +  80: 245 243 241 239 238 236 234 233 231 229 228 226 224 223 221 219 +  96: 218 215 212 210 207 205 202 200 197 194 192 189 187 184 182 179 + 112: 177 173 170 167 164 161 158 155 152 149 146 143 140 137 134 131 + 128: 128 125 122 119 116 113 110 107 104 101  98  95  92  89  86  83 + 144:  79  77  74  72  69  67  64  62  59  56  54  51  49  46  44  41 + 160:  38  37  35  33  32  30  28  27  25  23  22  20  18  17  15  13 + 176:  11  11  10  10   9   8   8   7   6   6   5   5   4   3   3   2 + 192:   1   2   3   3   4   5   5   6   6   7   8   8   9  10  10  11 + 208:  11  13  15  17  18  20  22  23  25  27  28  30  32  33  35  37 + 224:  38  41  44  46  49  51  54  56  59  62  64  67  69  72  74  77 + 240:  79  83  86  89  92  95  98 101 104 107 110 113 116 119 122 125 +* +* @param[in] theta      Angle (a full circle mapped to 0-255) used as input for sine calculation. +* @param[in] range_min  Lower bound of range (inclusive). +* @param[in] range_max  Upper bound of range (inclusive). +* @return Calculated sine value mapped to the given range. +*/ +uint8_t scaled_sin(const uint8_t theta, const uint8_t range_min, const uint8_t range_max); + +/** +* @brief Increases the given value until reaching range_max. +* The increments occur following an upwards sine wave (scaled from range_min to range_max). +* @param[in]        theta       Angle (a full circle mapped to 0-255) used as input for sine calculation. +* @param[in]        range_min   Lower bound of range (inclusive). +* @param[in]        range_max   Upper bound of range (inclusive). +* @param[in]        max_delta   Maximum delta between value and range_max (due to values being integers and eventually not fully matching). +* @param[in,out]    value       Reference of variable to be increased +* @return `true` if value and range_max are within a delta of 3 (chosen by fair dice rolling), `false` otherwise +* @see scaled_sin() +*/ +bool scaled_sin_up(const uint8_t thea, const uint8_t range_min, const uint8_t range_max, const uint8_t max_delta, uint8_t *value); + +/** +* @brief Decreases the given value until reaching range_min. +* The decrements occur following an downwards sinus wave (scaled from range_min to range_max). +* @param[in]        theta       Angle (a full circle mapped to 0-255) used as input for sinus calculation. +* @param[in]        range_min   Lower bound of range (inclusive). +* @param[in]        range_max   Upper bound of range (inclusive). +* @param[in]        max_delta   Maximum delta between value and range_min (due to values being integers and eventually not fully matching). +* @param[in,out]    value       Reference of variable to be decreased +* @return `true` if value and range_max are within a delta of 3 (chosen by fair dice rolling), `false` otherwise +* @see scaled_sin() +*/ +bool scaled_sin_down(const uint8_t theta, const uint8_t range_min, const uint8_t range_max, const uint8_t max_delta, uint8_t *value); diff --git a/users/vitoni/vitoni.c b/users/vitoni/vitoni.c new file mode 100644 index 0000000000..2a0ff5c46f --- /dev/null +++ b/users/vitoni/vitoni.c @@ -0,0 +1,131 @@ +// Copyright 2021 Victor Toni (@vitoni) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "vitoni.h" + +#include <rgb_matrix.h> +#include <lib/lib8tion/lib8tion.h> + +#include "rgb_matrix_effects.h" +#include "utils.h" + +#if defined(RGB_FADE_IN) || defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT) +static uint8_t state; + +// flag used to indicate that offset calculation is needed to adjust the timer, +// so that it matches the index used for sine calculation +static bool calc_offset; + +void matrix_scan_user_rgb(void) { +#if defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT) +    const uint8_t time = rgb_time_2_scale(); +#endif +    static uint8_t time_offset; + +    const uint32_t inactivity_millis = last_input_activity_elapsed(); + +#if defined(RGB_IDLE_TIMEOUT) +    if (IDLE != state && RGB_IDLE_TIMEOUT <= inactivity_millis) { +        update_value(&state, IDLE_FADE_OUT, &calc_offset); +    } +#endif +#if defined(RGB_DISABLE_WITH_FADE_OUT) +    const uint32_t fade_out_duration = scale_2_rgb_time(128); +    const uint32_t start_fade_out_after_millis = (RGB_DISABLE_TIMEOUT) > fade_out_duration +        ? (RGB_DISABLE_TIMEOUT) - fade_out_duration +        : 0; + +    if (start_fade_out_after_millis <= inactivity_millis) { +        update_value(&state, FADE_OUT, &calc_offset); +    } +#elif defined(RGB_DISABLE_TIMEOUT) +    // having to set brightness "manually" to black as starting point for fade in +    // for the time when returning from suspended state +    if (RGB_DISABLE_TIMEOUT <= inactivity_millis + 15) { +        rgb_matrix_config.hsv.v = 0; +        state = SUSPENDED; +    } +#endif + +    switch(state) { +#if defined(RGB_IDLE_TIMEOUT) +        case IDLE_FADE_OUT: +            if (calc_offset) { +                time_offset = calc_fade_out_offset(time); + +                // resetting flag for subsequent calls +                calc_offset = false; +            } +            if (idle_fade_out(time + time_offset)) { +                update_value(&state, IDLE, &calc_offset); +            } +            break; +        case IDLE: +#if defined(RGB_IDLE_BREATHE) +            if (calc_offset) { +                // no need to calculate time_offset since we are aligned already due to IDLE_FADE_OUT +                // resetting flag for subsequent calls +                calc_offset = false; +            } +            idle_breathe(time + time_offset); +#endif +            break; +#endif +#if defined(RGB_DISABLE_WITH_FADE_OUT) +        case FADE_OUT: +            if (calc_offset) { +                time_offset = calc_fade_out_offset(time); + +                // resetting flag for subsequent calls +                calc_offset = false; +            } +            if (fade_out(time + time_offset)) { +                update_value(&state, SUSPENDED, &calc_offset); +            } +            break; +#endif +#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT) +        case FADE_IN: +            { +                // since we want to be active, fade in should be faster than e.g. fading out +                const uint8_t fade_in_time = rgb_time_2_scale_w_factor(4); +                if (calc_offset) { +                    time_offset = calc_fade_in_offset(fade_in_time); + +                    // resetting flag for subsequent calls +                    calc_offset = false; +                } +                if (fade_in(fade_in_time + time_offset)) { +                    update_value(&state, REGULAR, &calc_offset); +                } +            } +            break; +#endif +        default: +            break; +    } +} + +#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT) +bool process_record_user_rgb(const uint16_t keycode, const keyrecord_t *record) { +    // if we are in a non regular state we might have faded out (eventually partially) +    // so we restore brightness (to max as we don't keep track of manually changed brightness) +    // if (REGULAR != state && FADE_IN != state) { +    if (FADE_IN != state && REGULAR != state) { +        update_value(&state, FADE_IN, &calc_offset); +    } + +    return true; // Process all other keycodes normally +} + +void suspend_wakeup_init_user(void) { +    if (FADE_IN != state) { +        // setting brightness to black as starting point for fade in +        rgb_matrix_config.hsv.v = 0; + +        update_value(&state, FADE_IN, &calc_offset); +    } +} +#endif // defined(RGB_FADE_IN) + +#endif // defined(RGB_FADE_IN) || defined(RGB_DISABLE_WITH_FADE_OUT) diff --git a/users/vitoni/vitoni.h b/users/vitoni/vitoni.h new file mode 100644 index 0000000000..1f26037135 --- /dev/null +++ b/users/vitoni/vitoni.h @@ -0,0 +1,30 @@ +// Copyright 2021 Victor Toni (@vitoni) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include <stdint.h> +#include <stdbool.h> + +#include <quantum/action.h> + +#include "rgb_matrix_effects.h" + +/** + * @brief Executes periodic tasks, eg. fading or checking for upcoming supend. + * @details Function declaration as weak as the implementation might "disappear" depending on the RGB settings used. + * The weak declaration avoids having to change `keymap.c`. + */ +__attribute__((weak)) +void matrix_scan_user_rgb(void); + +/** + * @brief Executes tasks based on user activity, eg. fading in. + * @details Function declaration as weak as the implementation might "disappear" depending on the RGB settings used. + * The weak declaration avoids having to change `keymap.c`. + * @param[in]   keycode + * @param[in]   record + * @return `false` if further processing should be stopped, `true` otherwise + */ +__attribute__((weak)) +bool process_record_user_rgb(const uint16_t keycode, const keyrecord_t *record); diff --git a/util/update_chibios_mirror.sh b/util/update_chibios_mirror.sh index 0bf648ebfd..e6666c55c9 100755 --- a/util/update_chibios_mirror.sh +++ b/util/update_chibios_mirror.sh @@ -4,13 +4,13 @@  # Configuration  # The ChibiOS branches to mirror -chibios_branches="trunk stable_20.3.x stable_21.6.x" +chibios_branches="trunk stable_20.3.x stable_21.11.x"  # The ChibiOS tags to mirror -chibios_tags="ver20.3.1 ver20.3.2 ver20.3.3 ver20.3.4 ver21.6.0" +chibios_tags="ver20.3.1 ver20.3.2 ver20.3.3 ver20.3.4 ver21.11.1"  # The ChibiOS-Contrib branches to mirror -contrib_branches="chibios-20.3.x chibios-21.6.x" +contrib_branches="chibios-20.3.x chibios-21.11.x"  ################################  # Actions @@ -88,5 +88,5 @@ echo "Updating ChibiOS-Contrib branches..."  for branch in $contrib_branches ; do      echo "Creating branch 'mirror/$branch' from 'upstream/$branch'..."      git branch -f mirror/$branch upstream/$branch \ -        && git push qmk mirror/$branch +        && git push qmk mirror/$branch || true # Allow for nonexistent ChibiOS-Contrib branches -- they'll turn up eventually.  done  | 
