summaryrefslogtreecommitdiff
path: root/tmk_core
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/common.mk19
-rw-r--r--tmk_core/common/avr/suspend.c98
-rw-r--r--tmk_core/common/chibios/_wait.h2
-rw-r--r--tmk_core/common/chibios/chibios_config.h41
-rw-r--r--tmk_core/common/chibios/eeprom_stm32.c57
-rw-r--r--tmk_core/common/chibios/eeprom_stm32_defs.h17
-rw-r--r--tmk_core/common/chibios/flash_stm32.c41
-rw-r--r--tmk_core/common/chibios/suspend.c89
-rw-r--r--tmk_core/common/host.c15
-rw-r--r--tmk_core/common/host.h2
-rw-r--r--tmk_core/common/host_driver.h1
-rw-r--r--tmk_core/common/report.h6
-rw-r--r--tmk_core/common/suspend.h2
-rw-r--r--tmk_core/common/test/rules.mk1
-rw-r--r--tmk_core/protocol/ibm4704.c185
-rw-r--r--tmk_core/protocol/ibm4704.h103
-rw-r--r--tmk_core/protocol/lufa.mk27
-rw-r--r--tmk_core/protocol/lufa/lufa.c35
-rw-r--r--tmk_core/protocol/news.c161
-rw-r--r--tmk_core/protocol/news.h48
-rw-r--r--tmk_core/protocol/next_kbd.c219
-rw-r--r--tmk_core/protocol/next_kbd.h60
-rw-r--r--tmk_core/protocol/usb_descriptor.c19
-rw-r--r--tmk_core/protocol/usb_hid/parser.h5
-rw-r--r--tmk_core/protocol/usb_hid/usb_hid.h6
-rw-r--r--tmk_core/protocol/vusb/vusb.c36
26 files changed, 202 insertions, 1093 deletions
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index 7f74200590..e5eced56fd 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -55,8 +55,6 @@ ifeq ($(strip $(NKRO_ENABLE)), yes)
$(info NKRO is not currently supported on V-USB, and has been disabled.)
else ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
$(info NKRO is not currently supported with Bluetooth, and has been disabled.)
- else ifneq ($(BLUETOOTH),)
- $(info NKRO is not currently supported with Bluetooth, and has been disabled.)
else
TMK_COMMON_DEFS += -DNKRO_ENABLE
SHARED_EP_ENABLE = yes
@@ -77,23 +75,6 @@ ifeq ($(strip $(NO_SUSPEND_POWER_DOWN)), yes)
TMK_COMMON_DEFS += -DNO_SUSPEND_POWER_DOWN
endif
-ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
- TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE
- TMK_COMMON_DEFS += -DNO_USB_STARTUP_CHECK
-endif
-
-ifeq ($(strip $(BLUETOOTH)), AdafruitBLE)
- TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE
- TMK_COMMON_DEFS += -DMODULE_ADAFRUIT_BLE
- TMK_COMMON_DEFS += -DNO_USB_STARTUP_CHECK
-endif
-
-ifeq ($(strip $(BLUETOOTH)), RN42)
- TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE
- TMK_COMMON_DEFS += -DMODULE_RN42
- TMK_COMMON_DEFS += -DNO_USB_STARTUP_CHECK
-endif
-
ifeq ($(strip $(SWAP_HANDS_ENABLE)), yes)
TMK_COMMON_DEFS += -DSWAP_HANDS_ENABLE
endif
diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c
index 690d7f38ca..b614746e6c 100644
--- a/tmk_core/common/avr/suspend.c
+++ b/tmk_core/common/avr/suspend.c
@@ -16,25 +16,6 @@
# include "vusb.h"
#endif
-#ifdef BACKLIGHT_ENABLE
-# include "backlight.h"
-#endif
-
-#ifdef AUDIO_ENABLE
-# include "audio.h"
-#endif /* AUDIO_ENABLE */
-
-#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
-# include "rgblight.h"
-#endif
-
-#ifdef LED_MATRIX_ENABLE
-# include "led_matrix.h"
-#endif
-#ifdef RGB_MATRIX_ENABLE
-# include "rgb_matrix.h"
-#endif
-
/** \brief Suspend idle
*
* FIXME: needs doc
@@ -50,17 +31,6 @@ void suspend_idle(uint8_t time) {
// TODO: This needs some cleanup
-/** \brief Run keyboard level Power down
- *
- * FIXME: needs doc
- */
-__attribute__((weak)) void suspend_power_down_user(void) {}
-/** \brief Run keyboard level Power down
- *
- * FIXME: needs doc
- */
-__attribute__((weak)) void suspend_power_down_kb(void) { suspend_power_down_user(); }
-
#if !defined(NO_SUSPEND_POWER_DOWN) && defined(WDT_vect)
// clang-format off
@@ -135,41 +105,9 @@ void suspend_power_down(void) {
if (!vusb_suspended) return;
#endif
- suspend_power_down_kb();
+ suspend_power_down_quantum();
#ifndef NO_SUSPEND_POWER_DOWN
- // Turn off backlight
-# ifdef BACKLIGHT_ENABLE
- backlight_set(0);
-# endif
-
- // Turn off LED indicators
- uint8_t leds_off = 0;
-# if defined(BACKLIGHT_CAPS_LOCK) && defined(BACKLIGHT_ENABLE)
- if (is_backlight_enabled()) {
- // Don't try to turn off Caps Lock indicator as it is backlight and backlight is already off
- leds_off |= (1 << USB_LED_CAPS_LOCK);
- }
-# endif
- led_set(leds_off);
-
- // Turn off audio
-# ifdef AUDIO_ENABLE
- stop_all_notes();
-# endif
-
- // Turn off underglow
-# if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
- rgblight_suspend();
-# endif
-
-# if defined(LED_MATRIX_ENABLE)
- led_matrix_set_suspend_state(true);
-# endif
-# if defined(RGB_MATRIX_ENABLE)
- rgb_matrix_set_suspend_state(true);
-# endif
-
// Enter sleep state if possible (ie, the MCU has a watchdog timeout interrupt)
# if defined(WDT_vect)
power_down(WDTO_15MS);
@@ -189,18 +127,6 @@ bool suspend_wakeup_condition(void) {
return false;
}
-/** \brief run user level code immediately after wakeup
- *
- * FIXME: needs doc
- */
-__attribute__((weak)) void suspend_wakeup_init_user(void) {}
-
-/** \brief run keyboard level code immediately after wakeup
- *
- * FIXME: needs doc
- */
-__attribute__((weak)) void suspend_wakeup_init_kb(void) { suspend_wakeup_init_user(); }
-
/** \brief run immediately after wakeup
*
* FIXME: needs doc
@@ -209,27 +135,7 @@ void suspend_wakeup_init(void) {
// clear keyboard state
clear_keyboard();
- // Turn on backlight
-#ifdef BACKLIGHT_ENABLE
- backlight_init();
-#endif
-
- // Restore LED indicators
- led_set(host_keyboard_leds());
-
- // Wake up underglow
-#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
- rgblight_wakeup();
-#endif
-
-#if defined(LED_MATRIX_ENABLE)
- led_matrix_set_suspend_state(false);
-#endif
-#if defined(RGB_MATRIX_ENABLE)
- rgb_matrix_set_suspend_state(false);
-#endif
-
- suspend_wakeup_init_kb();
+ suspend_wakeup_init_quantum();
}
#if !defined(NO_SUSPEND_POWER_DOWN) && defined(WDT_vect)
diff --git a/tmk_core/common/chibios/_wait.h b/tmk_core/common/chibios/_wait.h
index b740afbd24..2f36c64a2e 100644
--- a/tmk_core/common/chibios/_wait.h
+++ b/tmk_core/common/chibios/_wait.h
@@ -43,8 +43,6 @@ void wait_us(uint16_t duration);
#include "_wait.c"
-#define CPU_CLOCK STM32_SYSCLK
-
/* For GPIOs on ARM-based MCUs, the input pins are sampled by the clock of the bus
* to which the GPIO is connected.
* The connected buses differ depending on the various series of MCUs.
diff --git a/tmk_core/common/chibios/chibios_config.h b/tmk_core/common/chibios/chibios_config.h
index 23c65f9428..c35f589557 100644
--- a/tmk_core/common/chibios/chibios_config.h
+++ b/tmk_core/common/chibios/chibios_config.h
@@ -19,22 +19,33 @@
# define SPLIT_USB_DETECT // Force this on when dedicated pin is not used
#endif
-#if defined(STM32F1XX)
-# define USE_GPIOV1
-#endif
+// STM32 compatibility
+#if defined(MCU_STM32)
+# define CPU_CLOCK STM32_SYSCLK
-#if defined(STM32F1XX) || defined(STM32F2XX) || defined(STM32F4XX) || defined(STM32L1XX)
-# define USE_I2CV1
-#endif
+# if defined(STM32F1XX)
+# define USE_GPIOV1
+# define PAL_MODE_ALTERNATE_OPENDRAIN PAL_MODE_STM32_ALTERNATE_OPENDRAIN
+# define PAL_MODE_ALTERNATE_PUSHPULL PAL_MODE_STM32_ALTERNATE_PUSHPULL
+# else
+# define PAL_OUTPUT_TYPE_OPENDRAIN PAL_STM32_OTYPE_OPENDRAIN
+# define PAL_OUTPUT_TYPE_PUSHPULL PAL_STM32_OTYPE_PUSHPULL
+# define PAL_OUTPUT_SPEED_HIGHEST PAL_STM32_OSPEED_HIGHEST
+# define PAL_PUPDR_FLOATING PAL_STM32_PUPDR_FLOATING
+# endif
-// teensy
-#if defined(K20x) || defined(KL2x)
-# define USE_I2CV1
-# define USE_I2CV1_CONTRIB // for some reason a bunch of ChibiOS-Contrib boards only have clock_speed
-# define USE_GPIOV1
-# define STM32_SYSCLK KINETIS_SYSCLK_FREQUENCY
+# if defined(STM32F1XX) || defined(STM32F2XX) || defined(STM32F4XX) || defined(STM32L1XX)
+# define USE_I2CV1
+# endif
#endif
-#if defined(MK66F18)
-# define STM32_SYSCLK KINETIS_SYSCLK_FREQUENCY
-#endif
+// teensy compatibility
+#if defined(MCU_KINETIS)
+# define CPU_CLOCK KINETIS_SYSCLK_FREQUENCY
+
+# if defined(K20x) || defined(KL2x)
+# define USE_I2CV1
+# define USE_I2CV1_CONTRIB // for some reason a bunch of ChibiOS-Contrib boards only have clock_speed
+# define USE_GPIOV1
+# endif
+#endif \ No newline at end of file
diff --git a/tmk_core/common/chibios/eeprom_stm32.c b/tmk_core/common/chibios/eeprom_stm32.c
index 1fdf8c1e29..acc6a48516 100644
--- a/tmk_core/common/chibios/eeprom_stm32.c
+++ b/tmk_core/common/chibios/eeprom_stm32.c
@@ -620,48 +620,11 @@ uint16_t EEPROM_ReadDataWord(uint16_t Address) {
}
/*****************************************************************************
- * Wrap library in AVR style functions.
+ * Bind to eeprom_driver.c
*******************************************************************************/
-uint8_t eeprom_read_byte(const uint8_t *Address) { return EEPROM_ReadDataByte((const uintptr_t)Address); }
+void eeprom_driver_init(void) { EEPROM_Init(); }
-void eeprom_write_byte(uint8_t *Address, uint8_t Value) { EEPROM_WriteDataByte((uintptr_t)Address, Value); }
-
-void eeprom_update_byte(uint8_t *Address, uint8_t Value) { EEPROM_WriteDataByte((uintptr_t)Address, Value); }
-
-uint16_t eeprom_read_word(const uint16_t *Address) { return EEPROM_ReadDataWord((const uintptr_t)Address); }
-
-void eeprom_write_word(uint16_t *Address, uint16_t Value) { EEPROM_WriteDataWord((uintptr_t)Address, Value); }
-
-void eeprom_update_word(uint16_t *Address, uint16_t Value) { EEPROM_WriteDataWord((uintptr_t)Address, Value); }
-
-uint32_t eeprom_read_dword(const uint32_t *Address) {
- const uint16_t p = (const uintptr_t)Address;
- /* Check word alignment */
- if (p % 2) {
- /* Not aligned */
- return (uint32_t)EEPROM_ReadDataByte(p) | (uint32_t)(EEPROM_ReadDataWord(p + 1) << 8) | (uint32_t)(EEPROM_ReadDataByte(p + 3) << 24);
- } else {
- /* Aligned */
- return EEPROM_ReadDataWord(p) | (EEPROM_ReadDataWord(p + 2) << 16);
- }
-}
-
-void eeprom_write_dword(uint32_t *Address, uint32_t Value) {
- uint16_t p = (const uintptr_t)Address;
- /* Check word alignment */
- if (p % 2) {
- /* Not aligned */
- EEPROM_WriteDataByte(p, (uint8_t)Value);
- EEPROM_WriteDataWord(p + 1, (uint16_t)(Value >> 8));
- EEPROM_WriteDataByte(p + 3, (uint8_t)(Value >> 24));
- } else {
- /* Aligned */
- EEPROM_WriteDataWord(p, (uint16_t)Value);
- EEPROM_WriteDataWord(p + 2, (uint16_t)(Value >> 16));
- }
-}
-
-void eeprom_update_dword(uint32_t *Address, uint32_t Value) { eeprom_write_dword(Address, Value); }
+void eeprom_driver_erase(void) { EEPROM_Erase(); }
void eeprom_read_block(void *buf, const void *addr, size_t len) {
const uint8_t *src = (const uint8_t *)addr;
@@ -670,14 +633,14 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) {
/* Check word alignment */
if (len && (uintptr_t)src % 2) {
/* Read the unaligned first byte */
- *dest++ = eeprom_read_byte(src++);
+ *dest++ = EEPROM_ReadDataByte((const uintptr_t)src++);
--len;
}
uint16_t value;
bool aligned = ((uintptr_t)dest % 2 == 0);
while (len > 1) {
- value = eeprom_read_word((uint16_t *)src);
+ value = EEPROM_ReadDataWord((const uintptr_t)((uint16_t *)src));
if (aligned) {
*(uint16_t *)dest = value;
dest += 2;
@@ -689,7 +652,7 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) {
len -= 2;
}
if (len) {
- *dest = eeprom_read_byte(src);
+ *dest = EEPROM_ReadDataByte((const uintptr_t)src);
}
}
@@ -700,7 +663,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
/* Check word alignment */
if (len && (uintptr_t)dest % 2) {
/* Write the unaligned first byte */
- eeprom_write_byte(dest++, *src++);
+ EEPROM_WriteDataByte((uintptr_t)dest++, *src++);
--len;
}
@@ -712,15 +675,13 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
} else {
value = *(uint8_t *)src | (*(uint8_t *)(src + 1) << 8);
}
- eeprom_write_word((uint16_t *)dest, value);
+ EEPROM_WriteDataWord((uintptr_t)((uint16_t *)dest), value);
dest += 2;
src += 2;
len -= 2;
}
if (len) {
- eeprom_write_byte(dest, *src);
+ EEPROM_WriteDataByte((uintptr_t)dest, *src);
}
}
-
-void eeprom_update_block(const void *buf, void *addr, size_t len) { eeprom_write_block(buf, addr, len); }
diff --git a/tmk_core/common/chibios/eeprom_stm32_defs.h b/tmk_core/common/chibios/eeprom_stm32_defs.h
index 22b4ab858e..57de42c6ba 100644
--- a/tmk_core/common/chibios/eeprom_stm32_defs.h
+++ b/tmk_core/common/chibios/eeprom_stm32_defs.h
@@ -32,6 +32,13 @@
# ifndef FEE_PAGE_COUNT
# define FEE_PAGE_COUNT 4 // How many pages are used
# endif
+# elif defined(STM32F401xC) || defined(STM32F411xE)
+# ifndef FEE_PAGE_SIZE
+# define FEE_PAGE_SIZE 0x4000 // Page size = 16KByte
+# endif
+# ifndef FEE_PAGE_COUNT
+# define FEE_PAGE_COUNT 1 // How many pages are used
+# endif
# endif
#endif
@@ -40,17 +47,19 @@
# define FEE_MCU_FLASH_SIZE 32 // Size in Kb
# elif defined(STM32F103xB) || defined(STM32F072xB) || defined(STM32F070xB)
# define FEE_MCU_FLASH_SIZE 128 // Size in Kb
-# elif defined(STM32F303xC)
+# elif defined(STM32F303xC) || defined(STM32F401xC)
# define FEE_MCU_FLASH_SIZE 256 // Size in Kb
-# elif defined(STM32F103xE)
+# elif defined(STM32F103xE) || defined(STM32F411xE)
# define FEE_MCU_FLASH_SIZE 512 // Size in Kb
# endif
#endif
/* Start of the emulated eeprom */
#if !defined(FEE_PAGE_BASE_ADDRESS)
-# if 0
-/* TODO: Add support for F4 */
+# if defined(STM32F401xC) || defined(STM32F411xE)
+# ifndef FEE_PAGE_BASE_ADDRESS
+# define FEE_PAGE_BASE_ADDRESS 0x08004000 // bodge to force 2nd 16k page
+# endif
# else
# ifndef FEE_FLASH_BASE
# define FEE_FLASH_BASE 0x8000000
diff --git a/tmk_core/common/chibios/flash_stm32.c b/tmk_core/common/chibios/flash_stm32.c
index 6b80ff71c3..8f10903d3d 100644
--- a/tmk_core/common/chibios/flash_stm32.c
+++ b/tmk_core/common/chibios/flash_stm32.c
@@ -23,6 +23,29 @@
# define FLASH_SR_WRPERR FLASH_SR_WRPRTERR
#endif
+#if defined(EEPROM_EMU_STM32F401xC)
+# define FLASH_SR_PGERR (FLASH_SR_PGSERR | FLASH_SR_PGPERR | FLASH_SR_PGAERR)
+
+# define FLASH_KEY1 0x45670123U
+# define FLASH_KEY2 0xCDEF89ABU
+
+static uint8_t ADDR2PAGE(uint32_t Page_Address) {
+ switch (Page_Address) {
+ case 0x08000000 ... 0x08003FFF:
+ return 0;
+ case 0x08004000 ... 0x08007FFF:
+ return 1;
+ case 0x08008000 ... 0x0800BFFF:
+ return 2;
+ case 0x0800C000 ... 0x0800FFFF:
+ return 3;
+ }
+
+ // TODO: bad times...
+ return 7;
+}
+#endif
+
/* Delay definition */
#define EraseTimeout ((uint32_t)0x00000FFF)
#define ProgramTimeout ((uint32_t)0x0000001F)
@@ -53,7 +76,9 @@ FLASH_Status FLASH_GetStatus(void) {
if ((FLASH->SR & FLASH_SR_WRPERR) != 0) return FLASH_ERROR_WRP;
+#if defined(FLASH_OBR_OPTERR)
if ((FLASH->SR & FLASH_OBR_OPTERR) != 0) return FLASH_ERROR_OPT;
+#endif
return FLASH_COMPLETE;
}
@@ -95,15 +120,24 @@ FLASH_Status FLASH_ErasePage(uint32_t Page_Address) {
if (status == FLASH_COMPLETE) {
/* if the previous operation is completed, proceed to erase the page */
+#if defined(FLASH_CR_SNB)
+ FLASH->CR &= ~FLASH_CR_SNB;
+ FLASH->CR |= FLASH_CR_SER | (ADDR2PAGE(Page_Address) << FLASH_CR_SNB_Pos);
+#else
FLASH->CR |= FLASH_CR_PER;
FLASH->AR = Page_Address;
+#endif
FLASH->CR |= FLASH_CR_STRT;
/* Wait for last operation to be completed */
status = FLASH_WaitForLastOperation(EraseTimeout);
if (status != FLASH_TIMEOUT) {
- /* if the erase operation is completed, disable the PER Bit */
+ /* if the erase operation is completed, disable the configured Bits */
+#if defined(FLASH_CR_SNB)
+ FLASH->CR &= ~(FLASH_CR_SER | FLASH_CR_SNB);
+#else
FLASH->CR &= ~FLASH_CR_PER;
+#endif
}
FLASH->SR = (FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR);
}
@@ -126,6 +160,11 @@ FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) {
status = FLASH_WaitForLastOperation(ProgramTimeout);
if (status == FLASH_COMPLETE) {
/* if the previous operation is completed, proceed to program the new data */
+
+#if defined(FLASH_CR_PSIZE)
+ FLASH->CR &= ~FLASH_CR_PSIZE;
+ FLASH->CR |= FLASH_CR_PSIZE_0;
+#endif
FLASH->CR |= FLASH_CR_PG;
*(__IO uint16_t*)Address = Data;
/* Wait for last operation to be completed */
diff --git a/tmk_core/common/chibios/suspend.c b/tmk_core/common/chibios/suspend.c
index 38517e06f0..9310a99920 100644
--- a/tmk_core/common/chibios/suspend.c
+++ b/tmk_core/common/chibios/suspend.c
@@ -7,30 +7,12 @@
#include "action.h"
#include "action_util.h"
#include "mousekey.h"
+#include "programmable_button.h"
#include "host.h"
#include "suspend.h"
#include "led.h"
#include "wait.h"
-#ifdef AUDIO_ENABLE
-# include "audio.h"
-#endif /* AUDIO_ENABLE */
-
-#ifdef BACKLIGHT_ENABLE
-# include "backlight.h"
-#endif
-
-#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
-# include "rgblight.h"
-#endif
-
-#ifdef LED_MATRIX_ENABLE
-# include "led_matrix.h"
-#endif
-#ifdef RGB_MATRIX_ENABLE
-# include "rgb_matrix.h"
-#endif
-
/** \brief suspend idle
*
* FIXME: needs doc
@@ -40,61 +22,12 @@ void suspend_idle(uint8_t time) {
wait_ms(time);
}
-/** \brief Run keyboard level Power down
- *
- * FIXME: needs doc
- */
-__attribute__((weak)) void suspend_power_down_user(void) {}
-/** \brief Run keyboard level Power down
- *
- * FIXME: needs doc
- */
-__attribute__((weak)) void suspend_power_down_kb(void) { suspend_power_down_user(); }
-
/** \brief suspend power down
*
* FIXME: needs doc
*/
void suspend_power_down(void) {
-#ifdef BACKLIGHT_ENABLE
- backlight_set(0);
-#endif
-
-#ifdef LED_MATRIX_ENABLE
- led_matrix_task();
-#endif
-#ifdef RGB_MATRIX_ENABLE
- rgb_matrix_task();
-#endif
-
- // Turn off LED indicators
- uint8_t leds_off = 0;
-#if defined(BACKLIGHT_CAPS_LOCK) && defined(BACKLIGHT_ENABLE)
- if (is_backlight_enabled()) {
- // Don't try to turn off Caps Lock indicator as it is backlight and backlight is already off
- leds_off |= (1 << USB_LED_CAPS_LOCK);
- }
-#endif
- led_set(leds_off);
-
- // TODO: figure out what to power down and how
- // shouldn't power down TPM/FTM if we want a breathing LED
- // also shouldn't power down USB
-#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
- rgblight_suspend();
-#endif
-
-#if defined(LED_MATRIX_ENABLE)
- led_matrix_set_suspend_state(true);
-#endif
-#if defined(RGB_MATRIX_ENABLE)
- rgb_matrix_set_suspend_state(true);
-#endif
-#ifdef AUDIO_ENABLE
- stop_all_notes();
-#endif /* AUDIO_ENABLE */
-
- suspend_power_down_kb();
+ suspend_power_down_quantum();
// on AVR, this enables the watchdog for 15ms (max), and goes to
// SLEEP_MODE_PWR_DOWN
@@ -147,23 +80,13 @@ void suspend_wakeup_init(void) {
#ifdef MOUSEKEY_ENABLE
mousekey_clear();
#endif /* MOUSEKEY_ENABLE */
+#ifdef PROGRAMMABLE_BUTTON_ENABLE
+ programmable_button_clear();
+#endif /* PROGRAMMABLE_BUTTON_ENABLE */
#ifdef EXTRAKEY_ENABLE
host_system_send(0);
host_consumer_send(0);
#endif /* EXTRAKEY_ENABLE */
-#ifdef BACKLIGHT_ENABLE
- backlight_init();
-#endif /* BACKLIGHT_ENABLE */
- led_set(host_keyboard_leds());
-#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
- rgblight_wakeup();
-#endif
-#if defined(LED_MATRIX_ENABLE)
- led_matrix_set_suspend_state(false);
-#endif
-#if defined(RGB_MATRIX_ENABLE)
- rgb_matrix_set_suspend_state(false);
-#endif
- suspend_wakeup_init_kb();
+ suspend_wakeup_init_quantum();
}
diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c
index f0c396b189..56d4bb0847 100644
--- a/tmk_core/common/host.c
+++ b/tmk_core/common/host.c
@@ -30,8 +30,9 @@ extern keymap_config_t keymap_config;
#endif
static host_driver_t *driver;
-static uint16_t last_system_report = 0;
-static uint16_t last_consumer_report = 0;
+static uint16_t last_system_report = 0;
+static uint16_t last_consumer_report = 0;
+static uint32_t last_programmable_button_report = 0;
void host_set_driver(host_driver_t *d) { driver = d; }
@@ -122,6 +123,16 @@ void host_digitizer_send(digitizer_t *digitizer) {
__attribute__((weak)) void send_digitizer(report_digitizer_t *report) {}
+void host_programmable_button_send(uint32_t report) {
+ if (report == last_programmable_button_report) return;
+ last_programmable_button_report = report;
+
+ if (!driver) return;
+ (*driver->send_programmable_button)(report);
+}
+
uint16_t host_last_system_report(void) { return last_system_report; }
uint16_t host_last_consumer_report(void) { return last_consumer_report; }
+
+uint32_t host_last_programmable_button_report(void) { return last_programmable_button_report; }
diff --git a/tmk_core/common/host.h b/tmk_core/common/host.h
index 2cffef6e15..6b15f0d0c1 100644
--- a/tmk_core/common/host.h
+++ b/tmk_core/common/host.h
@@ -47,9 +47,11 @@ void host_keyboard_send(report_keyboard_t *report);
void host_mouse_send(report_mouse_t *report);
void host_system_send(uint16_t data);
void host_consumer_send(uint16_t data);
+void host_programmable_button_send(uint32_t data);
uint16_t host_last_system_report(void);
uint16_t host_last_consumer_report(void);
+uint32_t host_last_programmable_button_report(void);
#ifdef __cplusplus
}
diff --git a/tmk_core/common/host_driver.h b/tmk_core/common/host_driver.h
index 2aebca043d..affd0dcb34 100644
--- a/tmk_core/common/host_driver.h
+++ b/tmk_core/common/host_driver.h
@@ -29,6 +29,7 @@ typedef struct {
void (*send_mouse)(report_mouse_t *);
void (*send_system)(uint16_t);
void (*send_consumer)(uint16_t);
+ void (*send_programmable_button)(uint32_t);
} host_driver_t;
void send_digitizer(report_digitizer_t *report); \ No newline at end of file
diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h
index f2223e8063..1adc892f3b 100644
--- a/tmk_core/common/report.h
+++ b/tmk_core/common/report.h
@@ -29,6 +29,7 @@ enum hid_report_ids {
REPORT_ID_MOUSE,
REPORT_ID_SYSTEM,
REPORT_ID_CONSUMER,
+ REPORT_ID_PROGRAMMABLE_BUTTON,
REPORT_ID_NKRO,
REPORT_ID_JOYSTICK,
REPORT_ID_DIGITIZER
@@ -196,6 +197,11 @@ typedef struct {
} __attribute__((packed)) report_extra_t;
typedef struct {
+ uint8_t report_id;
+ uint32_t usage;
+} __attribute__((packed)) report_programmable_button_t;
+
+typedef struct {
#ifdef MOUSE_SHARED_EP
uint8_t report_id;
#endif
diff --git a/tmk_core/common/suspend.h b/tmk_core/common/suspend.h
index 95845e4b63..081735f90e 100644
--- a/tmk_core/common/suspend.h
+++ b/tmk_core/common/suspend.h
@@ -10,8 +10,10 @@ void suspend_wakeup_init(void);
void suspend_wakeup_init_user(void);
void suspend_wakeup_init_kb(void);
+void suspend_wakeup_init_quantum(void);
void suspend_power_down_user(void);
void suspend_power_down_kb(void);
+void suspend_power_down_quantum(void);
#ifndef USB_SUSPEND_WAKEUP_DELAY
# define USB_SUSPEND_WAKEUP_DELAY 0
diff --git a/tmk_core/common/test/rules.mk b/tmk_core/common/test/rules.mk
index 48632a095b..73d2302da7 100644
--- a/tmk_core/common/test/rules.mk
+++ b/tmk_core/common/test/rules.mk
@@ -16,6 +16,7 @@ eeprom_stm32_tiny_INC := $(eeprom_stm32_INC)
eeprom_stm32_large_INC := $(eeprom_stm32_INC)
eeprom_stm32_SRC := \
+ $(TOP_DIR)/drivers/eeprom/eeprom_driver.c \
$(TMK_PATH)/common/test/eeprom_stm32_tests.cpp \
$(TMK_PATH)/common/test/flash_stm32_mock.c \
$(TMK_PATH)/common/chibios/eeprom_stm32.c
diff --git a/tmk_core/protocol/ibm4704.c b/tmk_core/protocol/ibm4704.c
deleted file mode 100644
index a19443976e..0000000000
--- a/tmk_core/protocol/ibm4704.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
-Copyright 2010,2011,2012,2013 Jun WAKO <wakojun@gmail.com>
-*/
-#include <stdbool.h>
-#include <util/delay.h>
-#include "debug.h"
-#include "ring_buffer.h"
-#include "ibm4704.h"
-
-#define WAIT(stat, us, err) \
- do { \
- if (!wait_##stat(us)) { \
- ibm4704_error = err; \
- goto ERROR; \
- } \
- } while (0)
-
-uint8_t ibm4704_error = 0;
-
-void ibm4704_init(void) {
- inhibit(); // keep keyboard from sending
- IBM4704_INT_INIT();
- IBM4704_INT_ON();
- idle(); // allow keyboard sending
-}
-
-/*
-Host to Keyboard
-----------------
-Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
-
- ____ __ __ __ __ __ __ __ __ __ ________
-Clock \______/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
- ^ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___
-Data ____|__/ X____X____X____X____X____X____X____X____X____X \___
- | Start 0 1 2 3 4 5 6 7 P Stop
- Request by host
-
-Start bit: can be long as 300-350us.
-Request: Host pulls Clock line down to request to send a command.
-Timing: After Request keyboard pull up Data and down Clock line to low for start bit.
- After request host release Clock line once Data line becomes hi.
- Host writes a bit while Clock is hi and Keyboard reads while low.
-Stop bit: Host releases or pulls up Data line to hi after 9th clock and waits for keyboard pull down the line to lo.
-*/
-uint8_t ibm4704_send(uint8_t data) {
- bool parity = true; // odd parity
- ibm4704_error = 0;
-
- IBM4704_INT_OFF();
-
- /* Request to send */
- idle();
- clock_lo();
-
- /* wait for Start bit(Clock:lo/Data:hi) */
- WAIT(data_hi, 300, 0x30);
-
- /* Data bit */
- for (uint8_t i = 0; i < 8; i++) {
- WAIT(clock_hi, 100, 0x40 + i);
- if (data & (1 << i)) {
- parity = !parity;
- data_hi();
- } else {
- data_lo();
- }
- WAIT(clock_lo, 100, 0x48 + i);
- }
-
- /* Parity bit */
- WAIT(clock_hi, 100, 0x34);
- if (parity) {
- data_hi();
- } else {
- data_lo();
- }
- WAIT(clock_lo, 100, 0x35);
-
- /* Stop bit */
- WAIT(clock_hi, 100, 0x34);
- data_hi();
-
- /* End */
- WAIT(data_lo, 100, 0x36);
-
- idle();
- IBM4704_INT_ON();
- return 0;
-ERROR:
- idle();
- if (ibm4704_error > 0x30) {
- xprintf("S:%02X ", ibm4704_error);
- }
- IBM4704_INT_ON();
- return -1;
-}
-
-/* wait forever to receive data */
-uint8_t ibm4704_recv_response(void) {
- while (!rbuf_has_data()) {
- _delay_ms(1);
- }
- return rbuf_dequeue();
-}
-
-uint8_t ibm4704_recv(void) {
- if (rbuf_has_data()) {
- return rbuf_dequeue();
- } else {
- return -1;
- }
-}
-
-/*
-Keyboard to Host
-----------------
-Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
-
- ____ __ __ __ __ __ __ __ __ __ _______
-Clock \_____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
- ____ ____ ____ ____ ____ ____ ____ ____ ____ ____
-Data ____/ X____X____X____X____X____X____X____X____X____X________
- Start 0 1 2 3 4 5 6 7 P Stop
-
-Start bit: can be long as 300-350us.
-Inhibit: Pull Data line down to inhibit keyboard to send.
-Timing: Host reads bit while Clock is hi.(rising edge)
-Stop bit: Keyboard pulls down Data line to lo after 9th clock.
-*/
-ISR(IBM4704_INT_VECT) {
- static enum { BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP } state = BIT0;
- // LSB first
- static uint8_t data = 0;
- // Odd parity
- static uint8_t parity = false;
-
- ibm4704_error = 0;
-
- switch (state) {
- case BIT0:
- case BIT1:
- case BIT2:
- case BIT3:
- case BIT4:
- case BIT5:
- case BIT6:
- case BIT7:
- data >>= 1;
- if (data_in()) {
- data |= 0x80;
- parity = !parity;
- }
- break;
- case PARITY:
- if (data_in()) {
- parity = !parity;
- }
- if (!parity) goto ERROR;
- break;
- case STOP:
- // Data:Low
- WAIT(data_lo, 100, state);
- if (!rbuf_enqueue(data)) {
- print("rbuf: full\n");
- }
- ibm4704_error = IBM4704_ERR_NONE;
- goto DONE;
- break;
- default:
- goto ERROR;
- }
- state++;
- goto RETURN;
-ERROR:
- ibm4704_error = state;
- while (ibm4704_send(0xFE)) _delay_ms(1); // resend
- xprintf("R:%02X%02X\n", state, data);
-DONE:
- state = BIT0;
- data = 0;
- parity = false;
-RETURN:
- return;
-}
diff --git a/tmk_core/protocol/ibm4704.h b/tmk_core/protocol/ibm4704.h
deleted file mode 100644
index 4f88d148b3..0000000000
--- a/tmk_core/protocol/ibm4704.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
-Copyright 2014 Jun WAKO <wakojun@gmail.com>
-*/
-
-#pragma once
-
-#define IBM4704_ERR_NONE 0
-#define IBM4704_ERR_PARITY 0x70
-
-void ibm4704_init(void);
-uint8_t ibm4704_send(uint8_t data);
-uint8_t ibm4704_recv_response(void);
-uint8_t ibm4704_recv(void);
-
-/* Check pin configuration */
-#if !(defined(IBM4704_CLOCK_PORT) && defined(IBM4704_CLOCK_PIN) && defined(IBM4704_CLOCK_DDR) && defined(IBM4704_CLOCK_BIT))
-# error "ibm4704 clock pin configuration is required in config.h"
-#endif
-
-#if !(defined(IBM4704_DATA_PORT) && defined(IBM4704_DATA_PIN) && defined(IBM4704_DATA_DDR) && defined(IBM4704_DATA_BIT))
-# error "ibm4704 data pin configuration is required in config.h"
-#endif
-
-/*--------------------------------------------------------------------
- * static functions
- *------------------------------------------------------------------*/
-static inline void clock_lo(void) {
- IBM4704_CLOCK_PORT &= ~(1 << IBM4704_CLOCK_BIT);
- IBM4704_CLOCK_DDR |= (1 << IBM4704_CLOCK_BIT);
-}
-static inline void clock_hi(void) {
- /* input with pull up */
- IBM4704_CLOCK_DDR &= ~(1 << IBM4704_CLOCK_BIT);
- IBM4704_CLOCK_PORT |= (1 << IBM4704_CLOCK_BIT);
-}
-static inline bool clock_in(void) {
- IBM4704_CLOCK_DDR &= ~(1 << IBM4704_CLOCK_BIT);
- IBM4704_CLOCK_PORT |= (1 << IBM4704_CLOCK_BIT);
- _delay_us(1);
- return IBM4704_CLOCK_PIN & (1 << IBM4704_CLOCK_BIT);
-}
-static inline void data_lo(void) {
- IBM4704_DATA_PORT &= ~(1 << IBM4704_DATA_BIT);
- IBM4704_DATA_DDR |= (1 << IBM4704_DATA_BIT);
-}
-static inline void data_hi(void) {
- /* input with pull up */
- IBM4704_DATA_DDR &= ~(1 << IBM4704_DATA_BIT);
- IBM4704_DATA_PORT |= (1 << IBM4704_DATA_BIT);
-}
-static inline bool data_in(void) {
- IBM4704_DATA_DDR &= ~(1 << IBM4704_DATA_BIT);
- IBM4704_DATA_PORT |= (1 << IBM4704_DATA_BIT);
- _delay_us(1);
- return IBM4704_DATA_PIN & (1 << IBM4704_DATA_BIT);
-}
-
-static inline uint16_t wait_clock_lo(uint16_t us) {
- while (clock_in() && us) {
- asm("");
- _delay_us(1);
- us--;
- }
- return us;
-}
-static inline uint16_t wait_clock_hi(uint16_t us) {
- while (!clock_in() && us) {
- asm("");
- _delay_us(1);
- us--;
- }
- return us;
-}
-static inline uint16_t wait_data_lo(uint16_t us) {
- while (data_in() && us) {
- asm("");
- _delay_us(1);
- us--;
- }
- return us;
-}
-static inline uint16_t wait_data_hi(uint16_t us) {
- while (!data_in() && us) {
- asm("");
- _delay_us(1);
- us--;
- }
- return us;
-}
-
-/* idle state that device can send */
-static inline void idle(void) {
- clock_hi();
- data_hi();
-}
-
-/* inhibit device to send
- * keyboard checks Data line on start bit(Data:hi) and it stops sending if Data line is low.
- */
-static inline void inhibit(void) {
- clock_hi();
- data_lo();
-}
diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk
index c8935dacb7..00fec478ac 100644
--- a/tmk_core/protocol/lufa.mk
+++ b/tmk_core/protocol/lufa.mk
@@ -3,7 +3,6 @@ LUFA_DIR = protocol/lufa
# Path to the LUFA library
LUFA_PATH = $(LIB_PATH)/lufa
-
# Create the LUFA source path variables by including the LUFA makefile
ifneq (, $(wildcard $(LUFA_PATH)/LUFA/Build/lufa_sources.mk))
# New build system from 20120730
@@ -22,23 +21,6 @@ ifeq ($(strip $(MIDI_ENABLE)), yes)
include $(TMK_PATH)/protocol/midi.mk
endif
-ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
- LUFA_SRC += outputselect.c \
- $(TMK_DIR)/protocol/serial_uart.c
-endif
-
-ifeq ($(strip $(BLUETOOTH)), AdafruitBLE)
- LUFA_SRC += spi_master.c \
- analog.c \
- outputselect.c \
- $(LUFA_DIR)/adafruit_ble.cpp
-endif
-
-ifeq ($(strip $(BLUETOOTH)), RN42)
- LUFA_SRC += outputselect.c \
- $(TMK_DIR)/protocol/serial_uart.c
-endif
-
ifeq ($(strip $(VIRTSER_ENABLE)), yes)
LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c
endif
@@ -50,19 +32,10 @@ SRC += $(LUFA_DIR)/usb_util.c
VPATH += $(TMK_PATH)/$(LUFA_DIR)
VPATH += $(LUFA_PATH)
-# Option modules
-#ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
-#endif
-
-#ifdef EXTRAKEY_ENABLE
-#endif
-
# LUFA library compile-time options and predefined tokens
LUFA_OPTS = -DUSB_DEVICE_ONLY
LUFA_OPTS += -DUSE_FLASH_DESCRIPTORS
LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
-#LUFA_OPTS += -DINTERRUPT_CONTROL_ENDPOINT
-LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8
LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8
LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 5b56e8a03c..4a30d22579 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -142,7 +142,8 @@ static void send_keyboard(report_keyboard_t *report);
static void send_mouse(report_mouse_t *report);
static void send_system(uint16_t data);
static void send_consumer(uint16_t data);
-host_driver_t lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer};
+static void send_programmable_button(uint32_t data);
+host_driver_t lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_programmable_button};
#ifdef VIRTSER_ENABLE
// clang-format off
@@ -760,29 +761,35 @@ static void send_mouse(report_mouse_t *report) {
#endif
}
-/** \brief Send Extra
- *
- * FIXME: Needs doc
- */
-#ifdef EXTRAKEY_ENABLE
-static void send_extra(uint8_t report_id, uint16_t data) {
+#if defined(EXTRAKEY_ENABLE) || defined(PROGRAMMABLE_BUTTON_ENABLE)
+static void send_report(void *report, size_t size) {
uint8_t timeout = 255;
if (USB_DeviceState != DEVICE_STATE_Configured) return;
- static report_extra_t r;
- r = (report_extra_t){.report_id = report_id, .usage = data};
Endpoint_SelectEndpoint(SHARED_IN_EPNUM);
/* Check if write ready for a polling interval around 10ms */
while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40);
if (!Endpoint_IsReadWriteAllowed()) return;
- Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
+ Endpoint_Write_Stream_LE(report, size, NULL);
Endpoint_ClearIN();
}
#endif
+/** \brief Send Extra
+ *
+ * FIXME: Needs doc
+ */
+#ifdef EXTRAKEY_ENABLE
+static void send_extra(uint8_t report_id, uint16_t data) {
+ static report_extra_t r;
+ r = (report_extra_t){.report_id = report_id, .usage = data};
+ send_report(&r, sizeof(r));
+}
+#endif
+
/** \brief Send System
*
* FIXME: Needs doc
@@ -822,6 +829,14 @@ static void send_consumer(uint16_t data) {
#endif
}
+static void send_programmable_button(uint32_t data) {
+#ifdef PROGRAMMABLE_BUTTON_ENABLE
+ static report_programmable_button_t r;
+ r = (report_programmable_button_t){.report_id = REPORT_ID_PROGRAMMABLE_BUTTON, .usage = data};
+ send_report(&r, sizeof(r));
+#endif
+}
+
/*******************************************************************************
* sendchar
******************************************************************************/
diff --git a/tmk_core/protocol/news.c b/tmk_core/protocol/news.c
deleted file mode 100644
index 4463e8dd42..0000000000
--- a/tmk_core/protocol/news.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
-Copyright 2012 Jun WAKO <wakojun@gmail.com>
-
-This software is licensed with a Modified BSD License.
-All of this is supposed to be Free Software, Open Source, DFSG-free,
-GPL-compatible, and OK to use in both free and proprietary applications.
-Additions and corrections to this file are welcome.
-
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
-* Neither the name of the copyright holders nor the names of
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <stdbool.h>
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include "news.h"
-
-void news_init(void) { NEWS_KBD_RX_INIT(); }
-
-// RX ring buffer
-#define RBUF_SIZE 8
-static uint8_t rbuf[RBUF_SIZE];
-static uint8_t rbuf_head = 0;
-static uint8_t rbuf_tail = 0;
-
-uint8_t news_recv(void) {
- uint8_t data = 0;
- if (rbuf_head == rbuf_tail) {
- return 0;
- }
-
- data = rbuf[rbuf_tail];
- rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;
- return data;
-}
-
-// USART RX complete interrupt
-ISR(NEWS_KBD_RX_VECT) {
- uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
- if (next != rbuf_tail) {
- rbuf[rbuf_head] = NEWS_KBD_RX_DATA;
- rbuf_head = next;
- }
-}
-
-/*
-SONY NEWS Keyboard Protocol
-===========================
-
-Resources
----------
- Mouse protocol of NWA-5461(Japanese)
- http://groups.google.com/group/fj.sys.news/browse_thread/thread/a01b3e3ac6ae5b2d
-
- SONY NEWS Info(Japanese)
- http://katsu.watanabe.name/doc/sonynews/
-
-
-Pinouts
--------
- EIA 232 male connector from NWP-5461
- -------------
- \ 1 2 3 4 5 /
- \ 6 7 8 9 /
- ---------
- 1 VCC
- 2 BZ(Speaker)
- 3 Keyboard Data(from keyboard MCU TxD)
- 4 NC
- 5 GND
- 6 Unknown Input(to keyboard MCU RxD via schmitt trigger)
- 7 Mouse Data(from Mouse Ext connector)
- 8 Unknown Input(to Keyboard MCU Input via diode and buffer)
- 9 FG
- NOTE: Two LED on keyboard are controlled by pin 6,8?
-
- EIA 232 male connector from NWP-411A
- -------------
- \ 1 2 3 4 5 /
- \ 6 7 8 9 /
- ---------
- 1 VCC
- 2 BZ(Speaker)
- 3 Keyboard Data(from keyboard MCU TxD)
- 4 NC
- 5 GND
- 6 NC
- 7 Mouse Data(from Mouse Ext connector)
- 8 NC
- 9 FG
- NOTE: These are just from my guess and not confirmed.
-
-
-Signaling
----------
- ~~~~~~~~~~ ____XOO0X111X222X333X444X555X666X777~~~~ ~~~~~~~
- Idle Start LSB MSB Stop Idle
-
- Idle: High
- Start bit: Low
- Stop bit: High
- Bit order: LSB first
-
- Baud rate: 9600
- Interface: TTL level(5V) UART
-
- NOTE: This is observed on NWP-5461 with its DIP switch all OFF.
-
-
-Format
-------
- MSB LSB
- 7 6 5 4 3 2 1 0 bit
- | | | | | | | |
- | +-+-+-+-+-+-+-- scan code(00-7F)
- +---------------- break flag: sets when released
-
-
-Scan Codes
-----------
- SONY NEWS NWP-5461
- ,---. ,------------------------, ,------------------------. ,---------.
- | 7A| | 01 | 02 | 03 | 04 | 05 | | 06 | 07 | 08 | 09 | 0A | | 68 | 69 | ,-----------.
- `---' `------------------------' `------------------------' `---------' | 64| 65| 52|
- ,-------------------------------------------------------------. ,---. ,---------------|
- | 0B| 0C| 0D| 0E| 0F| 10| 11| 12| 13| 14| 15| 16| 17| 18| 19 | | 6A| | 4B| 4C| 4D| 4E|
- |-------------------------------------------------------------| |---| |---------------|
- | 1A | 1B| 1C| 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| | | 6B| | 4F| 50| 51| 56|
- |---------------------------------------------------------' | |---| |---------------|
- | 28 | 29| 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35 | | 6C| | 53| 54| 55| |
- |-------------------------------------------------------------| |---| |-----------| 5A|
- | 36 | 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 42 | | 6D| | 57| 59| 58| |
- |-------------------------------------------------------------| |---| |---------------|
- | 43 | 44 | 45 | 46 | 47 | 48| 49| 4A | | 6E| | 66| 5B| 5C| 5D|
- `-------------------------------------------------------------' `---' `---------------'
-*/
diff --git a/tmk_core/protocol/news.h b/tmk_core/protocol/news.h
deleted file mode 100644
index 327a13856d..0000000000
--- a/tmk_core/protocol/news.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-Copyright 2012 Jun WAKO <wakojun@gmail.com>
-
-This software is licensed with a Modified BSD License.
-All of this is supposed to be Free Software, Open Source, DFSG-free,
-GPL-compatible, and OK to use in both free and proprietary applications.
-Additions and corrections to this file are welcome.
-
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
-* Neither the name of the copyright holders nor the names of
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#pragma once
-
-/*
- * Primitive PS/2 Library for AVR
- */
-
-/* host role */
-void news_init(void);
-uint8_t news_recv(void);
-
-/* device role */
diff --git a/tmk_core/protocol/next_kbd.c b/tmk_core/protocol/next_kbd.c
deleted file mode 100644
index 6f118e6172..0000000000
--- a/tmk_core/protocol/next_kbd.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
-
-NeXT non-ADB Keyboard Protocol
-
-Copyright 2013, Benjamin Gould (bgould@github.com)
-
-Based on:
-TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
-Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
-
-Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
-Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
-Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
-
-This software is licensed with a Modified BSD License.
-All of this is supposed to be Free Software, Open Source, DFSG-free,
-GPL-compatible, and OK to use in both free and proprietary applications.
-Additions and corrections to this file are welcome.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
-* Neither the name of the copyright holders nor the names of
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <util/atomic.h>
-#include <util/delay.h>
-#include "next_kbd.h"
-#include "debug.h"
-
-static inline void out_lo(void);
-static inline void out_hi(void);
-static inline void query(void);
-static inline void reset(void);
-static inline uint32_t response(void);
-
-/* The keyboard sends signal with 50us pulse width on OUT line
- * while it seems to miss the 50us pulse on In line.
- * next_kbd_set_leds() often fails to sync LED status with 50us
- * but it works well with 51us(+1us) on TMK converter(ATMeaga32u2) at least.
- * TODO: test on Teensy and Pro Micro configuration
- */
-#define out_hi_delay(intervals) \
- do { \
- out_hi(); \
- _delay_us((NEXT_KBD_TIMING + 1) * intervals); \
- } while (0);
-#define out_lo_delay(intervals) \
- do { \
- out_lo(); \
- _delay_us((NEXT_KBD_TIMING + 1) * intervals); \
- } while (0);
-#define query_delay(intervals) \
- do { \
- query(); \
- _delay_us((NEXT_KBD_TIMING + 1) * intervals); \
- } while (0);
-#define reset_delay(intervals) \
- do { \
- reset(); \
- _delay_us((NEXT_KBD_TIMING + 1) * intervals); \
- } while (0);
-
-void next_kbd_init(void) {
- out_hi();
- NEXT_KBD_IN_DDR &= ~(1 << NEXT_KBD_IN_BIT); // KBD_IN to input
- NEXT_KBD_IN_PORT |= (1 << NEXT_KBD_IN_BIT); // KBD_IN pull up
-
- query_delay(5);
- reset_delay(8);
-
- query_delay(5);
- reset_delay(8);
-}
-
-void next_kbd_set_leds(bool left, bool right) {
- cli();
- out_lo_delay(9);
-
- out_hi_delay(3);
- out_lo_delay(1);
-
- if (left) {
- out_hi_delay(1);
- } else {
- out_lo_delay(1);
- }
-
- if (right) {
- out_hi_delay(1);
- } else {
- out_lo_delay(1);
- }
-
- out_lo_delay(7);
- out_hi();
- sei();
-}
-
-#define NEXT_KBD_READ (NEXT_KBD_IN_PIN & (1 << NEXT_KBD_IN_BIT))
-uint32_t next_kbd_recv(void) {
- // First check to make sure that the keyboard is actually connected;
- // if not, just return
- // TODO: reflect the status of the keyboard in a return code
- if (!NEXT_KBD_READ) {
- sei();
- return 0;
- }
-
- query();
- uint32_t resp = response();
-
- return resp;
-}
-
-static inline uint32_t response(void) {
- cli();
-
- // try a 5ms read; this should be called after the query method has
- // been run so if a key is pressed we should get a response within
- // 5ms; if not then send a reset and exit
- uint8_t i = 0;
- uint32_t data = 0;
- uint16_t reset_timeout = 50000;
- while (NEXT_KBD_READ && reset_timeout) {
- asm("");
- _delay_us(1);
- reset_timeout--;
- }
- if (!reset_timeout) {
- reset();
- sei();
- return 0;
- }
- _delay_us(NEXT_KBD_TIMING / 2);
- for (; i < 22; i++) {
- if (NEXT_KBD_READ) {
- data |= ((uint32_t)1 << i);
- /* Note:
- * My testing with the ATmega32u4 showed that there might
- * something wrong with the timing here; by the end of the
- * second data byte some of the modifiers can get bumped out
- * to the next bit over if we just cycle through the data
- * based on the expected interval. There is a bit (i = 10)
- * in the middle of the data that is always on followed by
- * one that is always off - so we'll use that to reset our
- * timing in case we've gotten ahead of the keyboard;
- */
- if (i == 10) {
- i++;
- while (NEXT_KBD_READ)
- ;
- _delay_us(NEXT_KBD_TIMING / 2);
- }
- } else {
- /* redundant - but I don't want to remove if it might screw
- * up the timing
- */
- data |= ((uint32_t)0 << i);
- }
- _delay_us(NEXT_KBD_TIMING);
- }
-
- sei();
-
- return data;
-}
-
-static inline void out_lo(void) {
- NEXT_KBD_OUT_PORT &= ~(1 << NEXT_KBD_OUT_BIT);
- NEXT_KBD_OUT_DDR |= (1 << NEXT_KBD_OUT_BIT);
-}
-
-static inline void out_hi(void) {
- /* input with pull up */
- NEXT_KBD_OUT_DDR &= ~(1 << NEXT_KBD_OUT_BIT);
- NEXT_KBD_OUT_PORT |= (1 << NEXT_KBD_OUT_BIT);
-}
-
-static inline void query(void) {
- out_lo_delay(5);
- out_hi_delay(1);
- out_lo_delay(3);
- out_hi();
-}
-
-static inline void reset(void) {
- out_lo_delay(1);
- out_hi_delay(4);
- out_lo_delay(1);
- out_hi_delay(6);
- out_lo_delay(10);
- out_hi();
-}
diff --git a/tmk_core/protocol/next_kbd.h b/tmk_core/protocol/next_kbd.h
deleted file mode 100644
index 1249ebf392..0000000000
--- a/tmk_core/protocol/next_kbd.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-NeXT non-ADB Keyboard Protocol
-
-Copyright 2013, Benjamin Gould (bgould@github.com)
-
-Based on:
-TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
-Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
-
-Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
-Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
-Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
-
-This software is licensed with a Modified BSD License.
-All of this is supposed to be Free Software, Open Source, DFSG-free,
-GPL-compatible, and OK to use in both free and proprietary applications.
-Additions and corrections to this file are welcome.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
-* Neither the name of the copyright holders nor the names of
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-#pragma once
-
-#include <stdbool.h>
-
-#define NEXT_KBD_KMBUS_IDLE 0x300600
-#define NEXT_KBD_TIMING 50
-
-extern uint8_t next_kbd_error;
-
-/* host role */
-void next_kbd_init(void);
-void next_kbd_set_leds(bool left, bool right);
-uint32_t next_kbd_recv(void);
diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c
index 099964ae56..a43755f899 100644
--- a/tmk_core/protocol/usb_descriptor.c
+++ b/tmk_core/protocol/usb_descriptor.c
@@ -237,6 +237,25 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
HID_RI_END_COLLECTION(0),
#endif
+#ifdef PROGRAMMABLE_BUTTON_ENABLE
+ HID_RI_USAGE_PAGE(8, 0x0C), // Consumer
+ HID_RI_USAGE(8, 0x01), // Consumer Control
+ HID_RI_COLLECTION(8, 0x01), // Application
+ HID_RI_REPORT_ID(8, REPORT_ID_PROGRAMMABLE_BUTTON),
+ HID_RI_USAGE(8, 0x03), // Programmable Buttons
+ HID_RI_COLLECTION(8, 0x04), // Named Array
+ HID_RI_USAGE_PAGE(8, 0x09), // Button
+ HID_RI_USAGE_MINIMUM(8, 0x01), // Button 1
+ HID_RI_USAGE_MAXIMUM(8, 0x20), // Button 32
+ HID_RI_LOGICAL_MINIMUM(8, 0x00),
+ HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+ HID_RI_REPORT_COUNT(8, 32),
+ HID_RI_REPORT_SIZE(8, 1),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+ HID_RI_END_COLLECTION(0),
+ HID_RI_END_COLLECTION(0),
+#endif
+
#ifdef NKRO_ENABLE
HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
HID_RI_USAGE(8, 0x06), // Keyboard
diff --git a/tmk_core/protocol/usb_hid/parser.h b/tmk_core/protocol/usb_hid/parser.h
index 036281fa66..ba35b7af5a 100644
--- a/tmk_core/protocol/usb_hid/parser.h
+++ b/tmk_core/protocol/usb_hid/parser.h
@@ -1,5 +1,4 @@
-#ifndef PARSER_H
-#define PARSER_H
+#pragma once
#include "hid.h"
#include "report.h"
@@ -11,5 +10,3 @@ public:
uint16_t time_stamp;
virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};
-
-#endif
diff --git a/tmk_core/protocol/usb_hid/usb_hid.h b/tmk_core/protocol/usb_hid/usb_hid.h
index 083b68d1f5..5cb5f5d035 100644
--- a/tmk_core/protocol/usb_hid/usb_hid.h
+++ b/tmk_core/protocol/usb_hid/usb_hid.h
@@ -1,10 +1,6 @@
-#ifndef USB_HID_H
-#define USB_HID_H
+#pragma once
#include "report.h"
-
extern report_keyboard_t usb_hid_keyboard_report;
extern uint16_t usb_hid_time_stamp;
-
-#endif
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index 485b20c900..e4db5d0654 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -226,8 +226,9 @@ static void send_keyboard(report_keyboard_t *report);
static void send_mouse(report_mouse_t *report);
static void send_system(uint16_t data);
static void send_consumer(uint16_t data);
+static void send_programmable_button(uint32_t data);
-static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer};
+static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_programmable_button};
host_driver_t *vusb_driver(void) { return &driver; }
@@ -296,6 +297,19 @@ void send_digitizer(report_digitizer_t *report) {
#ifdef DIGITIZER_ENABLE
if (usbInterruptIsReadyShared()) {
usbSetInterruptShared((void *)report, sizeof(report_digitizer_t));
+#endif
+}
+
+static void send_programmable_button(uint32_t data) {
+#ifdef PROGRAMMABLE_BUTTON_ENABLE
+ static report_programmable_button_t report = {
+ .report_id = REPORT_ID_PROGRAMMABLE_BUTTON,
+ };
+
+ report.usage = data;
+
+ if (usbInterruptIsReadyShared()) {
+ usbSetInterruptShared((void *)&report, sizeof(report));
}
#endif
}
@@ -558,6 +572,26 @@ const PROGMEM uchar shared_hid_report[] = {
0xC0 // End Collection
#endif
+#ifdef PROGRAMMABLE_BUTTON_ENABLE
+ // Programmable buttons report descriptor
+ 0x05, 0x0C, // Usage Page (Consumer)
+ 0x09, 0x01, // Usage (Consumer Control)
+ 0xA1, 0x01, // Collection (Application)
+ 0x85, REPORT_ID_PROGRAMMABLE_BUTTON, // Report ID
+ 0x09, 0x03, // Usage (Programmable Buttons)
+ 0xA1, 0x04, // Collection (Named Array)
+ 0x05, 0x09, // Usage Page (Button)
+ 0x19, 0x01, // Usage Minimum (Button 1)
+ 0x29, 0x20, // Usage Maximum (Button 32)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x25, 0x01, // Logical Maximum (1)
+ 0x95, 0x20, // Report Count (32)
+ 0x75, 0x01, // Report Size (1)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+ 0xC0, // End Collection
+ 0xC0 // End Collection
+#endif
+
#ifdef SHARED_EP_ENABLE
};
#endif