diff options
Diffstat (limited to 'tmk_core')
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 | 
