From a7e3e4e652a2b9f172282f3876d74ee247a63105 Mon Sep 17 00:00:00 2001
From: Fred Sundvik <fsundvik@gmail.com>
Date: Wed, 6 Jul 2016 14:29:46 +0300
Subject: [PATCH 1/3] Add serial_link compilation to Infinity Ergodox

---
 Makefile                                      | 12 +++++++++++-
 keyboards/infinity_ergodox/Makefile           |  1 +
 keyboards/infinity_ergodox/infinity_ergodox.c | 10 ++++++++++
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index c285dabad..79f9e8b42 100644
--- a/Makefile
+++ b/Makefile
@@ -198,10 +198,20 @@ 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 += -DUSE_SERIAL_LINK
+	VAPTH += $(SERIAL_PATH)
+endif
+
 # Optimize size but this may cause error "relocation truncated to fit"
 #EXTRALDFLAGS = -Wl,--relax
 
diff --git a/keyboards/infinity_ergodox/Makefile b/keyboards/infinity_ergodox/Makefile
index fb21aae5e..efa32e037 100644
--- a/keyboards/infinity_ergodox/Makefile
+++ b/keyboards/infinity_ergodox/Makefile
@@ -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
diff --git a/keyboards/infinity_ergodox/infinity_ergodox.c b/keyboards/infinity_ergodox/infinity_ergodox.c
index 34aded1a7..85054775e 100644
--- a/keyboards/infinity_ergodox/infinity_ergodox.c
+++ b/keyboards/infinity_ergodox/infinity_ergodox.c
@@ -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);
+}

From 4b45deb652045aac73e5fdd7412a73bcef19c0c8 Mon Sep 17 00:00:00 2001
From: Fred Sundvik <fsundvik@gmail.com>
Date: Wed, 6 Jul 2016 15:22:34 +0300
Subject: [PATCH 2/3] Enable serial_link support for ChibiOS

---
 Makefile                         |  2 +-
 tmk_core/common/keyboard.c       | 11 +++++++++--
 tmk_core/protocol/chibios/main.c | 30 +++++++++++++++++++++++++++---
 3 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/Makefile b/Makefile
index 79f9e8b42..cfbe0e994 100644
--- a/Makefile
+++ b/Makefile
@@ -208,7 +208,7 @@ ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
 	SERIAL_SRC = $(wildcard $(SERIAL_PATH)/protocol/*.c)
 	SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
 	SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
-	OPT_DEFS += -DUSE_SERIAL_LINK
+	OPT_DEFS += -DSERIAL_LINK_ENABLE
 	VAPTH += $(SERIAL_PATH)
 endif
 
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index 81df8eb73..3a1262a9f 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -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
diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c
index 54bb6a8f5..aeb11752f 100644
--- a/tmk_core/protocol/chibios/main.c
+++ b/tmk_core/protocol/chibios/main.c
@@ -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()) {

From e5726b017a9de2922ea923818c6e215600f68a85 Mon Sep 17 00:00:00 2001
From: Fred Sundvik <fsundvik@gmail.com>
Date: Wed, 6 Jul 2016 15:36:45 +0300
Subject: [PATCH 3/3] Add setting of the master side to the makefile

---
 Makefile           | 14 ++++++++++++++
 tmk_core/common.mk |  9 +++++++++
 2 files changed, 23 insertions(+)

diff --git a/Makefile b/Makefile
index cfbe0e994..7c00ce2cc 100644
--- a/Makefile
+++ b/Makefile
@@ -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)
@@ -212,6 +218,14 @@ ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
 	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
 
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index d71fba9bc..5bae0d762 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -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)