~ruther/qmk_firmware

19f480992c015aec0a15dca43e740bad8b7834e6 — Jack Humbert 9 years ago c6d671e + e5726b0
Merge pull request #487 from fredizzimo/serial_link_ergodox

Integrate serial link support for ChibiOS and Infinity Ergodox
M Makefile => Makefile +25 -1
@@ 59,6 59,12 @@ ifndef KEYBOARD
	KEYBOARD=planck
endif

MASTER ?= left
ifdef master
	MASTER = $(master)
endif


# converts things to keyboards/subproject
ifneq (,$(findstring /,$(KEYBOARD)))
	TEMP:=$(KEYBOARD)


@@ 198,10 204,28 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
endif

ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
  OPT_DEFS += -DTAP_DANCE_ENABLE
	OPT_DEFS += -DTAP_DANCE_ENABLE
	SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
endif

ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
	SERIAL_DIR = $(QUANTUM_DIR)/serial_link
	SERIAL_PATH = $(QUANTUM_PATH)/serial_link
	SERIAL_SRC = $(wildcard $(SERIAL_PATH)/protocol/*.c)
	SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
	SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
	OPT_DEFS += -DSERIAL_LINK_ENABLE
	VAPTH += $(SERIAL_PATH)
endif

ifeq ($(MASTER),right)	
	OPT_DEFS += -DMASTER_IS_ON_RIGHT
else 
	ifneq ($(MASTER),left)
$(error MASTER does not have a valid value(left/right))
	endif
endif

# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax


M keyboards/infinity_ergodox/Makefile => keyboards/infinity_ergodox/Makefile +1 -0
@@ 66,6 66,7 @@ COMMAND_ENABLE ?= yes    # Commands for debug and configuration
SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
NKRO_ENABLE ?= yes	    # USB Nkey Rollover
CUSTOM_MATRIX ?= yes # Custom matrix file
SERIAL_LINK_ENABLE = yes

ifndef QUANTUM_DIR
	include ../../Makefile

M keyboards/infinity_ergodox/infinity_ergodox.c => keyboards/infinity_ergodox/infinity_ergodox.c +10 -0
@@ 1,1 1,11 @@
#include "infinity_ergodox.h"
#include "ch.h"
#include "hal.h"
#include "serial_link/system/serial_link.h"

void init_serial_link_hal(void) {
    PORTA->PCR[1] = PORTx_PCRn_PE | PORTx_PCRn_PS | PORTx_PCRn_PFE | PORTx_PCRn_MUX(2);
    PORTA->PCR[2] = PORTx_PCRn_DSE | PORTx_PCRn_SRE | PORTx_PCRn_MUX(2);
    PORTE->PCR[0] = PORTx_PCRn_PE | PORTx_PCRn_PS | PORTx_PCRn_PFE | PORTx_PCRn_MUX(3);
    PORTE->PCR[1] = PORTx_PCRn_DSE | PORTx_PCRn_SRE | PORTx_PCRn_MUX(3);
}

M tmk_core/common.mk => tmk_core/common.mk +9 -0
@@ 97,6 97,15 @@ ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes)
    endif
endif

ifeq ($(MASTER),right)	
	OPT_DEFS += -DMASTER_IS_ON_RIGHT
else 
	ifneq ($(MASTER),left)
$(error MASTER does not have a valid value(left/right))
	endif
endif


# Version string
OPT_DEFS += -DVERSION=$(shell (git describe --always --dirty || echo 'unknown') 2> /dev/null)


M tmk_core/common/keyboard.c => tmk_core/common/keyboard.c +9 -2
@@ 49,6 49,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#ifdef RGBLIGHT_ENABLE
#   include "rgblight.h"
#endif
#ifdef SERIAL_LINK_ENABLE
#   include "serial_link/system/serial_link.h"
#endif

#ifdef MATRIX_HAS_GHOST
static bool has_ghost_in_row(uint8_t row)


@@ 167,11 170,15 @@ MATRIX_LOOP_END:
#endif

#ifdef SERIAL_MOUSE_ENABLE
        serial_mouse_task();
    serial_mouse_task();
#endif

#ifdef ADB_MOUSE_ENABLE
        adb_mouse_task();
    adb_mouse_task();
#endif

#ifdef SERIAL_LINK_ENABLE
	serial_link_update();
#endif

    // update LED

M tmk_core/protocol/chibios/main.c => tmk_core/protocol/chibios/main.c +27 -3
@@ 35,6 35,9 @@
#ifdef SLEEP_LED_ENABLE
#include "sleep_led.h"
#endif
#ifdef SERIAL_LINK_ENABLE
#include "serial_link/system/serial_link.h"
#endif
#include "suspend.h"




@@ 98,9 101,27 @@ int main(void) {
  /* init printf */
  init_printf(NULL,sendchar_pf);

  /* Wait until the USB is active */
  while(USB_DRIVER.state != USB_ACTIVE)
#ifdef SERIAL_LINK_ENABLE
  init_serial_link();
#endif

  host_driver_t* driver = NULL;

  /* Wait until the USB or serial link is active */
  while (true) {
    if(USB_DRIVER.state == USB_ACTIVE) {
      driver = &chibios_driver;
      break;
    }
#ifdef SERIAL_LINK_ENABLE
    if(is_serial_link_connected()) {
      driver = get_serial_link_driver();
      break;
    }
    serial_link_update();
#endif
    chThdSleepMilliseconds(50);
  }

  /* Do need to wait here!
   * Otherwise the next print might start a transfer on console EP


@@ 113,7 134,7 @@ int main(void) {

  /* init TMK modules */
  keyboard_init();
  host_set_driver(&chibios_driver);
  host_set_driver(driver);

#ifdef SLEEP_LED_ENABLE
  sleep_led_init();


@@ 128,6 149,9 @@ int main(void) {
      print("[s]");
      while(USB_DRIVER.state == USB_SUSPENDED) {
        /* Do this in the suspended state */
#ifdef SERIAL_LINK_ENABLE
        serial_link_update();
#endif
        suspend_power_down(); // on AVR this deep sleeps for 15ms
        /* Remote wakeup */
        if((USB_DRIVER.status & 2) && suspend_wakeup_condition()) {