From 79bb1a9932af7bfcdab67e2a1da9d9edcba87f71 Mon Sep 17 00:00:00 2001
From: Camil Staps
Date: Mon, 22 Aug 2016 22:28:32 +0200
Subject: old wip

---
 .../src/system_config/pic32mx695f512h/btl_mx.ld    | 798 +++++++++++++++++++++
 .../pic32mx695f512h/configuration.xml              | 210 ++++++
 .../framework/system/clk/src/sys_clk_static.c      | 216 ++++++
 .../framework/system/clk/sys_clk_static.h          |  65 ++
 .../framework/system/ports/src/sys_ports_static.c  |  81 +++
 .../pic32mx695f512h/gfx_hgc_definitions.c          | 248 +++++++
 .../pic32mx695f512h/gfx_hgc_definitions.h          | 219 ++++++
 .../pic32mx695f512h/pic32mx695f512h.mhc            | 406 +++++++++++
 .../system_config/pic32mx695f512h/system_config.h  | 238 ++++++
 .../pic32mx695f512h/system_definitions.h           | 136 ++++
 .../pic32mx695f512h/system_exceptions.c            | 143 ++++
 .../system_config/pic32mx695f512h/system_init.c    | 336 +++++++++
 .../pic32mx695f512h/system_interrupt.c             |  89 +++
 .../system_config/pic32mx695f512h/system_tasks.c   | 104 +++
 14 files changed, 3289 insertions(+)
 create mode 100644 firmware/src/system_config/pic32mx695f512h/btl_mx.ld
 create mode 100644 firmware/src/system_config/pic32mx695f512h/configuration.xml
 create mode 100644 firmware/src/system_config/pic32mx695f512h/framework/system/clk/src/sys_clk_static.c
 create mode 100644 firmware/src/system_config/pic32mx695f512h/framework/system/clk/sys_clk_static.h
 create mode 100644 firmware/src/system_config/pic32mx695f512h/framework/system/ports/src/sys_ports_static.c
 create mode 100644 firmware/src/system_config/pic32mx695f512h/gfx_hgc_definitions.c
 create mode 100644 firmware/src/system_config/pic32mx695f512h/gfx_hgc_definitions.h
 create mode 100644 firmware/src/system_config/pic32mx695f512h/pic32mx695f512h.mhc
 create mode 100644 firmware/src/system_config/pic32mx695f512h/system_config.h
 create mode 100644 firmware/src/system_config/pic32mx695f512h/system_definitions.h
 create mode 100644 firmware/src/system_config/pic32mx695f512h/system_exceptions.c
 create mode 100644 firmware/src/system_config/pic32mx695f512h/system_init.c
 create mode 100644 firmware/src/system_config/pic32mx695f512h/system_interrupt.c
 create mode 100644 firmware/src/system_config/pic32mx695f512h/system_tasks.c

(limited to 'firmware/src/system_config/pic32mx695f512h')

diff --git a/firmware/src/system_config/pic32mx695f512h/btl_mx.ld b/firmware/src/system_config/pic32mx695f512h/btl_mx.ld
new file mode 100644
index 0000000..f41053f
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/btl_mx.ld
@@ -0,0 +1,798 @@
+/*--------------------------------------------------------------------------
+ * MPLAB XC Compiler -  PIC32MX695F512H linker script
+ * Build date : May 01 2015
+ * 
+ * Copyright (c) 2015, Microchip Technology Inc. and its subsidiaries ("Microchip")
+ * All rights reserved.
+ * 
+ * This software is developed by Microchip Technology Inc. and its
+ * subsidiaries ("Microchip").
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are 
+ * met:
+ * 
+ * 1.      Redistributions of source code must retain the above copyright
+ *         notice, this list of conditions and the following disclaimer.
+ * 2.      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.
+ * 3.      Microchip's name may not be used to endorse or promote products
+ *         derived from this software without specific prior written 
+ *         permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY MICROCHIP "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR PURPOSE ARE DISCLAIMED. IN NO EVENT 
+ * SHALL MICROCHIP 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) HOWSOEVER 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.
+ * 
+ */
+
+/* Default linker script, for normal executables */
+
+/*  IMPORTANT: PIC32MX MCUs use two files for the default linker script: 
+ *    1) pic32mx/lib/ldscripts/elf32pic32.x (main linker script)
+ *    2) pic32mx/lib/proc/32MX695F512H/procdefs.ld (variant-specific fragment)
+ *
+ *  This file is provided only as a convenience when adding a custom linker script
+ *  to your application.
+ */
+
+OUTPUT_FORMAT("elf32-tradlittlemips")
+OUTPUT_ARCH(pic32mx)
+ENTRY(_reset)
+/*
+ * Provide for a minimum stack and heap size
+ * - _min_stack_size - represents the minimum space that must be made
+ *                     available for the stack.  Can be overridden from
+ *                     the command line using the linker's --defsym option.
+ * - _min_heap_size  - represents the minimum space that must be made
+ *                     available for the heap.  Must be specified on
+ *                     the command line using the linker's --defsym option.
+ */
+EXTERN (_min_stack_size _min_heap_size)
+PROVIDE(_min_stack_size = 0x400) ;
+
+/*************************************************************************
+ * Processor-specific object file.  Contains SFR definitions.
+ *************************************************************************/
+INPUT("processor.o")
+
+/*************************************************************************
+ * Processor-specific peripheral libraries are optional
+ *************************************************************************/
+OPTIONAL("libmchp_peripheral.a")
+OPTIONAL("libmchp_peripheral_32MX695F512H.a")
+
+/*************************************************************************
+ * For interrupt vector handling
+ *************************************************************************/
+PROVIDE(_vector_spacing = 0x00000001);
+_ebase_address = 0x9D00E000;
+
+/*************************************************************************
+ * Memory Address Equates
+ * _RESET_ADDR                    -- Reset Vector
+ * _BEV_EXCPT_ADDR                -- Boot exception Vector
+ * _DBG_EXCPT_ADDR                -- In-circuit Debugging Exception Vector
+ * _DBG_CODE_ADDR                 -- In-circuit Debug Executive address
+ * _DBG_CODE_SIZE                 -- In-circuit Debug Executive size
+ * _GEN_EXCPT_ADDR                -- General Exception Vector
+ *************************************************************************/
+_RESET_ADDR                    = 0x9D00F000;
+_BEV_EXCPT_ADDR                = 0x9D00F380;
+_DBG_EXCPT_ADDR                = 0x9D00F480;
+_DBG_CODE_ADDR                 = 0xBFC02000;
+_DBG_CODE_SIZE                 = 0xFF0;
+_GEN_EXCPT_ADDR                = _ebase_address + 0x180;
+
+/*************************************************************************
+ * Memory Regions
+ *
+ * Memory regions without attributes cannot be used for orphaned sections.
+ * Only sections specifically assigned to these regions can be allocated
+ * into these regions.
+ *
+ * The Debug exception vector is located at 0x9FC00480.
+ *
+ * The config_<address> sections are used to locate the config words at
+ * their absolute addresses.
+ *************************************************************************/
+MEMORY
+{
+  kseg0_program_mem     (rx)  : ORIGIN = 0x9d00F490, LENGTH = 0x70b70
+  kseg0_boot_mem              : ORIGIN = 0x9d00E000, LENGTH = 0x0
+  exception_mem               : ORIGIN = 0x9D00E000, LENGTH = 0x200
+  config3                     : ORIGIN = 0xBFC02FF0, LENGTH = 0x4
+  config2                     : ORIGIN = 0xBFC02FF4, LENGTH = 0x4
+  config1                     : ORIGIN = 0xBFC02FF8, LENGTH = 0x4
+  config0                     : ORIGIN = 0xBFC02FFC, LENGTH = 0x4
+  kseg1_boot_mem              : ORIGIN = 0x9d00F000, LENGTH = 0x490
+  kseg1_data_mem       (w!x)  : ORIGIN = 0xA0000000, LENGTH = 0x20000
+  sfrs                        : ORIGIN = 0xBF800000, LENGTH = 0x100000
+  debug_exec_mem              : ORIGIN = 0xBFC02000, LENGTH = 0xFF0
+  configsfrs                  : ORIGIN = 0xBFC02FF0, LENGTH = 0x10
+}
+
+/*************************************************************************
+ * Configuration-word sections. Map the config-pragma input sections to
+ * absolute-address output sections.
+ *************************************************************************/
+SECTIONS
+{
+  .config_BFC02FF0 : {
+    KEEP(*(.config_BFC02FF0))
+  } > config3
+  .config_BFC02FF4 : {
+    KEEP(*(.config_BFC02FF4))
+  } > config2
+  .config_BFC02FF8 : {
+    KEEP(*(.config_BFC02FF8))
+  } > config1
+  .config_BFC02FFC : {
+    KEEP(*(.config_BFC02FFC))
+  } > config0
+}
+SECTIONS
+{
+  /* Boot Sections */
+  .reset _RESET_ADDR :
+  {
+    KEEP(*(.reset))
+    KEEP(*(.reset.startup))
+  } > kseg1_boot_mem
+  .bev_excpt _BEV_EXCPT_ADDR :
+  {
+    KEEP(*(.bev_handler))
+  } > kseg1_boot_mem
+  /* Debug exception vector */
+  .dbg_excpt _DBG_EXCPT_ADDR (NOLOAD) :
+  {
+    . += (DEFINED (_DEBUGGER) ? 0x8 : 0x0);
+  } > kseg1_boot_mem
+  /* Space reserved for the debug executive */
+  .dbg_code _DBG_CODE_ADDR (NOLOAD) :
+  {
+    . += (DEFINED (_DEBUGGER) ? _DBG_CODE_SIZE : 0x0);
+  } > debug_exec_mem
+
+  .app_excpt _GEN_EXCPT_ADDR :
+  {
+    KEEP(*(.gen_handler))
+  } > exception_mem
+
+  .vector_0 _ebase_address + 0x200 + ((_vector_spacing << 5) * 0) :
+  {
+     KEEP(*(.vector_0))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_0) <= (_vector_spacing << 5), "function at exception vector 0 too large")
+  .vector_1 _ebase_address + 0x200 + ((_vector_spacing << 5) * 1) :
+  {
+     KEEP(*(.vector_1))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_1) <= (_vector_spacing << 5), "function at exception vector 1 too large")
+  .vector_2 _ebase_address + 0x200 + ((_vector_spacing << 5) * 2) :
+  {
+     KEEP(*(.vector_2))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_2) <= (_vector_spacing << 5), "function at exception vector 2 too large")
+  .vector_3 _ebase_address + 0x200 + ((_vector_spacing << 5) * 3) :
+  {
+     KEEP(*(.vector_3))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_3) <= (_vector_spacing << 5), "function at exception vector 3 too large")
+  .vector_4 _ebase_address + 0x200 + ((_vector_spacing << 5) * 4) :
+  {
+     KEEP(*(.vector_4))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_4) <= (_vector_spacing << 5), "function at exception vector 4 too large")
+  .vector_5 _ebase_address + 0x200 + ((_vector_spacing << 5) * 5) :
+  {
+     KEEP(*(.vector_5))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_5) <= (_vector_spacing << 5), "function at exception vector 5 too large")
+  .vector_6 _ebase_address + 0x200 + ((_vector_spacing << 5) * 6) :
+  {
+     KEEP(*(.vector_6))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_6) <= (_vector_spacing << 5), "function at exception vector 6 too large")
+  .vector_7 _ebase_address + 0x200 + ((_vector_spacing << 5) * 7) :
+  {
+     KEEP(*(.vector_7))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_7) <= (_vector_spacing << 5), "function at exception vector 7 too large")
+  .vector_8 _ebase_address + 0x200 + ((_vector_spacing << 5) * 8) :
+  {
+     KEEP(*(.vector_8))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_8) <= (_vector_spacing << 5), "function at exception vector 8 too large")
+  .vector_9 _ebase_address + 0x200 + ((_vector_spacing << 5) * 9) :
+  {
+     KEEP(*(.vector_9))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_9) <= (_vector_spacing << 5), "function at exception vector 9 too large")
+  .vector_10 _ebase_address + 0x200 + ((_vector_spacing << 5) * 10) :
+  {
+     KEEP(*(.vector_10))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_10) <= (_vector_spacing << 5), "function at exception vector 10 too large")
+  .vector_11 _ebase_address + 0x200 + ((_vector_spacing << 5) * 11) :
+  {
+     KEEP(*(.vector_11))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_11) <= (_vector_spacing << 5), "function at exception vector 11 too large")
+  .vector_12 _ebase_address + 0x200 + ((_vector_spacing << 5) * 12) :
+  {
+     KEEP(*(.vector_12))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_12) <= (_vector_spacing << 5), "function at exception vector 12 too large")
+  .vector_13 _ebase_address + 0x200 + ((_vector_spacing << 5) * 13) :
+  {
+     KEEP(*(.vector_13))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_13) <= (_vector_spacing << 5), "function at exception vector 13 too large")
+  .vector_14 _ebase_address + 0x200 + ((_vector_spacing << 5) * 14) :
+  {
+     KEEP(*(.vector_14))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_14) <= (_vector_spacing << 5), "function at exception vector 14 too large")
+  .vector_15 _ebase_address + 0x200 + ((_vector_spacing << 5) * 15) :
+  {
+     KEEP(*(.vector_15))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_15) <= (_vector_spacing << 5), "function at exception vector 15 too large")
+  .vector_16 _ebase_address + 0x200 + ((_vector_spacing << 5) * 16) :
+  {
+     KEEP(*(.vector_16))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_16) <= (_vector_spacing << 5), "function at exception vector 16 too large")
+  .vector_17 _ebase_address + 0x200 + ((_vector_spacing << 5) * 17) :
+  {
+     KEEP(*(.vector_17))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_17) <= (_vector_spacing << 5), "function at exception vector 17 too large")
+  .vector_18 _ebase_address + 0x200 + ((_vector_spacing << 5) * 18) :
+  {
+     KEEP(*(.vector_18))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_18) <= (_vector_spacing << 5), "function at exception vector 18 too large")
+  .vector_19 _ebase_address + 0x200 + ((_vector_spacing << 5) * 19) :
+  {
+     KEEP(*(.vector_19))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_19) <= (_vector_spacing << 5), "function at exception vector 19 too large")
+  .vector_20 _ebase_address + 0x200 + ((_vector_spacing << 5) * 20) :
+  {
+     KEEP(*(.vector_20))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_20) <= (_vector_spacing << 5), "function at exception vector 20 too large")
+  .vector_21 _ebase_address + 0x200 + ((_vector_spacing << 5) * 21) :
+  {
+     KEEP(*(.vector_21))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_21) <= (_vector_spacing << 5), "function at exception vector 21 too large")
+  .vector_22 _ebase_address + 0x200 + ((_vector_spacing << 5) * 22) :
+  {
+     KEEP(*(.vector_22))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_22) <= (_vector_spacing << 5), "function at exception vector 22 too large")
+  .vector_23 _ebase_address + 0x200 + ((_vector_spacing << 5) * 23) :
+  {
+     KEEP(*(.vector_23))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_23) <= (_vector_spacing << 5), "function at exception vector 23 too large")
+  .vector_24 _ebase_address + 0x200 + ((_vector_spacing << 5) * 24) :
+  {
+     KEEP(*(.vector_24))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_24) <= (_vector_spacing << 5), "function at exception vector 24 too large")
+  .vector_25 _ebase_address + 0x200 + ((_vector_spacing << 5) * 25) :
+  {
+     KEEP(*(.vector_25))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_25) <= (_vector_spacing << 5), "function at exception vector 25 too large")
+  .vector_26 _ebase_address + 0x200 + ((_vector_spacing << 5) * 26) :
+  {
+     KEEP(*(.vector_26))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_26) <= (_vector_spacing << 5), "function at exception vector 26 too large")
+  .vector_27 _ebase_address + 0x200 + ((_vector_spacing << 5) * 27) :
+  {
+     KEEP(*(.vector_27))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_27) <= (_vector_spacing << 5), "function at exception vector 27 too large")
+  .vector_28 _ebase_address + 0x200 + ((_vector_spacing << 5) * 28) :
+  {
+     KEEP(*(.vector_28))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_28) <= (_vector_spacing << 5), "function at exception vector 28 too large")
+  .vector_29 _ebase_address + 0x200 + ((_vector_spacing << 5) * 29) :
+  {
+     KEEP(*(.vector_29))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_29) <= (_vector_spacing << 5), "function at exception vector 29 too large")
+  .vector_30 _ebase_address + 0x200 + ((_vector_spacing << 5) * 30) :
+  {
+     KEEP(*(.vector_30))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_30) <= (_vector_spacing << 5), "function at exception vector 30 too large")
+  .vector_31 _ebase_address + 0x200 + ((_vector_spacing << 5) * 31) :
+  {
+     KEEP(*(.vector_31))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_31) <= (_vector_spacing << 5), "function at exception vector 31 too large")
+  .vector_32 _ebase_address + 0x200 + ((_vector_spacing << 5) * 32) :
+  {
+     KEEP(*(.vector_32))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_32) <= (_vector_spacing << 5), "function at exception vector 32 too large")
+  .vector_33 _ebase_address + 0x200 + ((_vector_spacing << 5) * 33) :
+  {
+     KEEP(*(.vector_33))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_33) <= (_vector_spacing << 5), "function at exception vector 33 too large")
+  .vector_34 _ebase_address + 0x200 + ((_vector_spacing << 5) * 34) :
+  {
+     KEEP(*(.vector_34))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_34) <= (_vector_spacing << 5), "function at exception vector 34 too large")
+  .vector_35 _ebase_address + 0x200 + ((_vector_spacing << 5) * 35) :
+  {
+     KEEP(*(.vector_35))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_35) <= (_vector_spacing << 5), "function at exception vector 35 too large")
+  .vector_36 _ebase_address + 0x200 + ((_vector_spacing << 5) * 36) :
+  {
+     KEEP(*(.vector_36))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_36) <= (_vector_spacing << 5), "function at exception vector 36 too large")
+  .vector_37 _ebase_address + 0x200 + ((_vector_spacing << 5) * 37) :
+  {
+     KEEP(*(.vector_37))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_37) <= (_vector_spacing << 5), "function at exception vector 37 too large")
+  .vector_38 _ebase_address + 0x200 + ((_vector_spacing << 5) * 38) :
+  {
+     KEEP(*(.vector_38))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_38) <= (_vector_spacing << 5), "function at exception vector 38 too large")
+  .vector_39 _ebase_address + 0x200 + ((_vector_spacing << 5) * 39) :
+  {
+     KEEP(*(.vector_39))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_39) <= (_vector_spacing << 5), "function at exception vector 39 too large")
+  .vector_40 _ebase_address + 0x200 + ((_vector_spacing << 5) * 40) :
+  {
+     KEEP(*(.vector_40))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_40) <= (_vector_spacing << 5), "function at exception vector 40 too large")
+  .vector_41 _ebase_address + 0x200 + ((_vector_spacing << 5) * 41) :
+  {
+     KEEP(*(.vector_41))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_41) <= (_vector_spacing << 5), "function at exception vector 41 too large")
+  .vector_42 _ebase_address + 0x200 + ((_vector_spacing << 5) * 42) :
+  {
+     KEEP(*(.vector_42))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_42) <= (_vector_spacing << 5), "function at exception vector 42 too large")
+  .vector_43 _ebase_address + 0x200 + ((_vector_spacing << 5) * 43) :
+  {
+     KEEP(*(.vector_43))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_43) <= (_vector_spacing << 5), "function at exception vector 43 too large")
+  .vector_44 _ebase_address + 0x200 + ((_vector_spacing << 5) * 44) :
+  {
+     KEEP(*(.vector_44))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_44) <= (_vector_spacing << 5), "function at exception vector 44 too large")
+  .vector_45 _ebase_address + 0x200 + ((_vector_spacing << 5) * 45) :
+  {
+     KEEP(*(.vector_45))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_45) <= (_vector_spacing << 5), "function at exception vector 45 too large")
+  .vector_46 _ebase_address + 0x200 + ((_vector_spacing << 5) * 46) :
+  {
+     KEEP(*(.vector_46))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_46) <= (_vector_spacing << 5), "function at exception vector 46 too large")
+  .vector_47 _ebase_address + 0x200 + ((_vector_spacing << 5) * 47) :
+  {
+     KEEP(*(.vector_47))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_47) <= (_vector_spacing << 5), "function at exception vector 47 too large")
+  .vector_48 _ebase_address + 0x200 + ((_vector_spacing << 5) * 48) :
+  {
+     KEEP(*(.vector_48))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_48) <= (_vector_spacing << 5), "function at exception vector 48 too large")
+  .vector_49 _ebase_address + 0x200 + ((_vector_spacing << 5) * 49) :
+  {
+     KEEP(*(.vector_49))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_49) <= (_vector_spacing << 5), "function at exception vector 49 too large")
+  .vector_50 _ebase_address + 0x200 + ((_vector_spacing << 5) * 50) :
+  {
+     KEEP(*(.vector_50))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_50) <= (_vector_spacing << 5), "function at exception vector 50 too large")
+  .vector_51 _ebase_address + 0x200 + ((_vector_spacing << 5) * 51) :
+  {
+     KEEP(*(.vector_51))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_51) <= (_vector_spacing << 5), "function at exception vector 51 too large")
+  .vector_52 _ebase_address + 0x200 + ((_vector_spacing << 5) * 52) :
+  {
+     KEEP(*(.vector_52))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_52) <= (_vector_spacing << 5), "function at exception vector 52 too large")
+  .vector_53 _ebase_address + 0x200 + ((_vector_spacing << 5) * 53) :
+  {
+     KEEP(*(.vector_53))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_53) <= (_vector_spacing << 5), "function at exception vector 53 too large")
+  .vector_54 _ebase_address + 0x200 + ((_vector_spacing << 5) * 54) :
+  {
+     KEEP(*(.vector_54))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_54) <= (_vector_spacing << 5), "function at exception vector 54 too large")
+  .vector_55 _ebase_address + 0x200 + ((_vector_spacing << 5) * 55) :
+  {
+     KEEP(*(.vector_55))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_55) <= (_vector_spacing << 5), "function at exception vector 55 too large")
+  .vector_56 _ebase_address + 0x200 + ((_vector_spacing << 5) * 56) :
+  {
+     KEEP(*(.vector_56))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_56) <= (_vector_spacing << 5), "function at exception vector 56 too large")
+  .vector_57 _ebase_address + 0x200 + ((_vector_spacing << 5) * 57) :
+  {
+     KEEP(*(.vector_57))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_57) <= (_vector_spacing << 5), "function at exception vector 57 too large")
+  .vector_58 _ebase_address + 0x200 + ((_vector_spacing << 5) * 58) :
+  {
+     KEEP(*(.vector_58))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_58) <= (_vector_spacing << 5), "function at exception vector 58 too large")
+  .vector_59 _ebase_address + 0x200 + ((_vector_spacing << 5) * 59) :
+  {
+     KEEP(*(.vector_59))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_59) <= (_vector_spacing << 5), "function at exception vector 59 too large")
+  .vector_60 _ebase_address + 0x200 + ((_vector_spacing << 5) * 60) :
+  {
+     KEEP(*(.vector_60))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_60) <= (_vector_spacing << 5), "function at exception vector 60 too large")
+  .vector_61 _ebase_address + 0x200 + ((_vector_spacing << 5) * 61) :
+  {
+     KEEP(*(.vector_61))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_61) <= (_vector_spacing << 5), "function at exception vector 61 too large")
+  .vector_62 _ebase_address + 0x200 + ((_vector_spacing << 5) * 62) :
+  {
+     KEEP(*(.vector_62))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_62) <= (_vector_spacing << 5), "function at exception vector 62 too large")
+  .vector_63 _ebase_address + 0x200 + ((_vector_spacing << 5) * 63) :
+  {
+     KEEP(*(.vector_63))
+  } > exception_mem
+  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_63) <= (_vector_spacing << 5), "function at exception vector 63 too large")
+
+  /*  The startup code is in the .reset.startup section.
+   *  Keep this here for backwards compatibility with older
+   *  C32 v1.xx releases.
+   */
+  .startup ORIGIN(kseg0_boot_mem) :
+  {
+    KEEP(*(.startup))
+  } > kseg0_boot_mem
+
+  /* Code Sections - Note that input sections *(.text) and *(.text.*)
+   * are not mapped here. The best-fit allocator locates them,
+   * so that .text may flow around absolute sections as needed.
+   */
+  .text :
+  {
+    *(.stub .gnu.linkonce.t.*)
+    KEEP (*(.text.*personality*))
+    *(.mips16.fn.*)
+    *(.mips16.call.*)
+    *(.gnu.warning)
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  /* Global-namespace object initialization */
+  .init   :
+  {
+    KEEP (*crti.o(.init))
+    KEEP (*crtbegin.o(.init))
+    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o *crtn.o ).init))
+    KEEP (*crtend.o(.init))
+    KEEP (*crtn.o(.init))
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  .fini   :
+  {
+    KEEP (*(.fini))
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  .preinit_array   :
+  {
+    PROVIDE_HIDDEN (__preinit_array_start = .);
+    KEEP (*(.preinit_array))
+    PROVIDE_HIDDEN (__preinit_array_end = .);
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  .init_array   :
+  {
+    PROVIDE_HIDDEN (__init_array_start = .);
+    KEEP (*(SORT(.init_array.*)))
+    KEEP (*(.init_array))
+    PROVIDE_HIDDEN (__init_array_end = .);
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  .fini_array   :
+  {
+    PROVIDE_HIDDEN (__fini_array_start = .);
+    KEEP (*(SORT(.fini_array.*)))
+    KEEP (*(.fini_array))
+    PROVIDE_HIDDEN (__fini_array_end = .);
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  .ctors   :
+  {
+    /* XC32 uses crtbegin.o to find the start of
+       the constructors, so we make sure it is
+       first.  Because this is a wildcard, it
+       doesn't matter if the user does not
+       actually link against crtbegin.o; the
+       linker won't look for a file to match a
+       wildcard.  The wildcard also means that it
+       doesn't matter which directory crtbegin.o
+       is in.  */
+    KEEP (*crtbegin.o(.ctors))
+    KEEP (*crtbegin?.o(.ctors))
+    /* We don't want to include the .ctor section from
+       the crtend.o file until after the sorted ctors.
+       The .ctor section from the crtend file contains the
+       end of ctors marker and it must be last */
+    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
+    KEEP (*(SORT(.ctors.*)))
+    KEEP (*(.ctors))
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  .dtors   :
+  {
+    KEEP (*crtbegin.o(.dtors))
+    KEEP (*crtbegin?.o(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  /* Read-only sections */
+  .rodata   :
+  {
+    *( .gnu.linkonce.r.*)
+    *(.rodata1)
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  /*
+   * Small initialized constant global and static data can be placed in the
+   * .sdata2 section.  This is different from .sdata, which contains small
+   * initialized non-constant global and static data.
+   */
+  .sdata2 ALIGN(4) :
+  {
+    *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  /*
+   * Uninitialized constant global and static data (i.e., variables which will
+   * always be zero).  Again, this is different from .sbss, which contains
+   * small non-initialized, non-constant global and static data.
+   */
+  .sbss2 ALIGN(4) :
+  {
+    *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
+    . = ALIGN(4) ;
+  } >kseg0_program_mem
+  .eh_frame_hdr   :
+  {
+    *(.eh_frame_hdr)
+  } >kseg0_program_mem
+    . = ALIGN(4) ;
+  .eh_frame   : ONLY_IF_RO
+  {
+    KEEP (*(.eh_frame))
+  } >kseg0_program_mem
+    . = ALIGN(4) ;
+  .gcc_except_table   : ONLY_IF_RO
+  {
+    *(.gcc_except_table .gcc_except_table.*)
+  } >kseg0_program_mem
+    . = ALIGN(4) ;
+  .dbg_data (NOLOAD) :
+  {
+    . += (DEFINED (_DEBUGGER) ? 0x200 : 0x0);
+  } >kseg1_data_mem
+  .jcr   :
+  {
+    KEEP (*(.jcr))
+    . = ALIGN(4) ;
+  } >kseg1_data_mem
+  .eh_frame    : ONLY_IF_RW
+  {
+    KEEP (*(.eh_frame))
+  } >kseg1_data_mem
+    . = ALIGN(4) ;
+  .gcc_except_table    : ONLY_IF_RW
+  {
+    *(.gcc_except_table .gcc_except_table.*)
+  } >kseg1_data_mem
+    . = ALIGN(4) ;
+  /* Persistent data - Use the new C 'persistent' attribute instead. */
+  .persist   :
+  {
+    _persist_begin = .;
+    *(.persist .persist.*)
+    *(.pbss .pbss.*)
+    . = ALIGN(4) ;
+    _persist_end = .;
+  } >kseg1_data_mem
+  /*
+   *  Note that input sections named .data* are not mapped here.
+   *  The best-fit allocator locates them, so that they may flow
+   *  around absolute sections as needed.
+   */
+  .data   :
+  {
+    *( .gnu.linkonce.d.*)
+    SORT(CONSTRUCTORS)
+    *(.data1)
+    . = ALIGN(4) ;
+  } >kseg1_data_mem
+  . = .;
+  _gp = ALIGN(16) + 0x7ff0;
+  .got ALIGN(4) :
+  {
+    *(.got.plt) *(.got)
+    . = ALIGN(4) ;
+  } >kseg1_data_mem /* AT>kseg0_program_mem */
+  /*
+   * Note that 'small' data sections are still mapped in the linker
+   * script. This ensures that they are grouped together for
+   * gp-relative addressing. Absolute sections are allocated after
+   * the 'small' data sections so small data cannot flow around them.
+   */
+  /*
+   * We want the small data sections together, so single-instruction offsets
+   * can access them all, and initialized data all before uninitialized, so
+   * we can shorten the on-disk segment size.
+   */
+  .sdata ALIGN(4) :
+  {
+    _sdata_begin = . ;
+    *(.sdata .sdata.* .gnu.linkonce.s.*)
+    . = ALIGN(4) ;
+    _sdata_end = . ;
+  } >kseg1_data_mem
+  .lit8           :
+  {
+    *(.lit8)
+  } >kseg1_data_mem
+  .lit4           :
+  {
+    *(.lit4)
+  } >kseg1_data_mem
+  . = ALIGN (4) ;
+  _data_end = . ;
+  _bss_begin = . ;
+  .sbss ALIGN(4) :
+  {
+    _sbss_begin = . ;
+    *(.dynsbss)
+    *(.sbss .sbss.* .gnu.linkonce.sb.*)
+    *(.scommon)
+    _sbss_end = . ;
+    . = ALIGN(4) ;
+  } >kseg1_data_mem
+  /*
+   *  Align here to ensure that the .bss section occupies space up to
+   *  _end.  Align after .bss to ensure correct alignment even if the
+   *  .bss section disappears because there are no input sections.
+   *
+   *  Note that input sections named .bss* are no longer mapped here.
+   *  The best-fit allocator locates them, so that they may flow
+   *  around absolute sections as needed.
+   *
+   */
+  .bss     :
+  {
+    *(.dynbss)
+    *(COMMON)
+   /* Align here to ensure that the .bss section occupies space up to
+      _end.  Align after .bss to ensure correct alignment even if the
+      .bss section disappears because there are no input sections. */
+   . = ALIGN(. != 0 ? 4 : 1);
+  } >kseg1_data_mem
+  . = ALIGN(4) ;
+  _end = . ;
+  _bss_end = . ;
+  /*
+   *  The heap and stack are best-fit allocated by the linker after other
+   *  data and bss sections have been allocated.
+   */
+  /*
+   * RAM functions go at the end of our stack and heap allocation.
+   * Alignment of 2K required by the boundary register (BMXDKPBA).
+   *
+   * RAM functions are now allocated by the linker. The linker generates
+   * _ramfunc_begin and _bmxdkpba_address symbols depending on the
+   * location of RAM functions.
+   */
+  _bmxdudba_address = LENGTH(kseg1_data_mem) ;
+  _bmxdupba_address = LENGTH(kseg1_data_mem) ;
+    /* The .pdr section belongs in the absolute section */
+    /DISCARD/ : { *(.pdr) }
+  .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
+  .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
+  .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) }
+  .mdebug.abiN32 : { KEEP(*(.mdebug.abiN32)) }
+  .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) }
+  .mdebug.abiO64 : { KEEP(*(.mdebug.abiO64)) }
+  .mdebug.eabi32 : { KEEP(*(.mdebug.eabi32)) }
+  .mdebug.eabi64 : { KEEP(*(.mdebug.eabi64)) }
+  .gcc_compiled_long32 : { KEEP(*(.gcc_compiled_long32)) }
+  .gcc_compiled_long64 : { KEEP(*(.gcc_compiled_long64)) }
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  /* DWARF debug sections used by MPLAB X for source-level debugging. 
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /DISCARD/ : { *(.rel.dyn) }
+  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+  /DISCARD/ : { *(.note.GNU-stack) }
+  /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.discard) }
+}
+
diff --git a/firmware/src/system_config/pic32mx695f512h/configuration.xml b/firmware/src/system_config/pic32mx695f512h/configuration.xml
new file mode 100644
index 0000000..de96ab1
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/configuration.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<configuration version="1.0.7.9">
+  <Designer>
+    <Assets>
+      <Settings bpp="16">
+        <MemoryLocations>
+          <MemoryLocation address="0" id="default"/>
+        </MemoryLocations>
+      </Settings>
+    </Assets>
+    <Screens height="200" width="320">
+      <Screen active="true" background="000000" clearOnShow="true" export="true" name="Screen1" primary="true" visible="true">
+        <Objects/>
+      </Screen>
+    </Screens>
+    <Schemes defaultSchemeName="default">
+      <Scheme name="default">
+        <Alpha>100</Alpha>
+        <BackgroundOffset>0,0</BackgroundOffset>
+        <EmbossSize>3</EmbossSize>
+        <Colors>
+          <Primary>FFFFFF</Primary>
+          <Secondary>404040</Secondary>
+          <Disabled>C0C0C0</Disabled>
+          <Background>000000</Background>
+          <EmbossLight>C0C0C0</EmbossLight>
+          <EmbossDark>404040</EmbossDark>
+          <TextPrimary>000000</TextPrimary>
+          <TextSecondary>FFFFFF</TextSecondary>
+          <TextDisabled>404040</TextDisabled>
+          <GradientStart>000000</GradientStart>
+          <GradientEnd>FFFFFF</GradientEnd>
+        </Colors>
+        <FillStyle>Color</FillStyle>
+        <BackgroundType>None</BackgroundType>
+      </Scheme>
+    </Schemes>
+  </Designer>
+  <General>
+    <HarmonyPath path="../../../../opt/microchip/harmony/v1_06"/>
+    <ForceOptimization flag="true"/>
+  </General>
+  <Manifest>
+    <Files>
+      <File>
+        <Name>drv_usbfs.c</Name>
+        <Path>Source Files/framework/driver/usb/usbfs/src/dynamic</Path>
+      </File>
+      <File>
+        <Name>drv_tmr.h</Name>
+        <Path>Header Files/framework/driver/tmr</Path>
+      </File>
+      <File>
+        <Name>sys_devcon.c</Name>
+        <Path>Source Files/framework/system/devcon/src</Path>
+      </File>
+      <File>
+        <Name>drv_tmr.c</Name>
+        <Path>Source Files/framework/driver/tmr/src/dynamic</Path>
+      </File>
+      <File>
+        <Name>sys_tmr.h</Name>
+        <Path>Header Files/framework/system/tmr</Path>
+      </File>
+      <File>
+        <Name>sys_ports.c</Name>
+        <Path>Source Files/framework/system/ports/src</Path>
+      </File>
+      <File>
+        <Name>sys_tmr.c</Name>
+        <Path>Source Files/framework/system/tmr/src</Path>
+      </File>
+      <File>
+        <Name>usb_host.h</Name>
+        <Path>Header Files/framework/usb</Path>
+      </File>
+      <File>
+        <Name>usb_host_hid.h</Name>
+        <Path>Header Files/framework/usb</Path>
+      </File>
+      <File>
+        <Name>sys_devcon.h</Name>
+        <Path>Header Files/framework/system/devcon</Path>
+      </File>
+      <File>
+        <Name>system.h</Name>
+        <Path>Header Files/framework/system</Path>
+      </File>
+      <File>
+        <Name>usb_host_hub_interface.h</Name>
+        <Path>Header Files/framework/usb</Path>
+      </File>
+      <File>
+        <Name>usb_host_hid.c</Name>
+        <Path>Source Files/framework/usb/src/dynamic</Path>
+      </File>
+      <File>
+        <Name>sys_module.h</Name>
+        <Path>Header Files/framework/system/common</Path>
+      </File>
+      <File>
+        <Name>sys_ports.h</Name>
+        <Path>Header Files/framework/system/ports</Path>
+      </File>
+      <File>
+        <Name>sys_devcon_pic32mx.c</Name>
+        <Path>Source Files/framework/system/devcon/src</Path>
+      </File>
+      <File>
+        <Name>drv_usbfs_host.c</Name>
+        <Path>Source Files/framework/driver/usb/usbfs/src/dynamic</Path>
+      </File>
+      <File>
+        <Name>usb_host_hid_keyboard.c</Name>
+        <Path>Source Files/framework/usb/src/dynamic</Path>
+      </File>
+      <File>
+        <Name>driver.h</Name>
+        <Path>Header Files/framework/driver</Path>
+      </File>
+      <File>
+        <Name>sys_common.h</Name>
+        <Path>Header Files/framework/system/common</Path>
+      </File>
+      <File>
+        <Name>sys_int_pic32.c</Name>
+        <Path>Source Files/framework/system/int/src</Path>
+      </File>
+      <File>
+        <Name>usb_host.c</Name>
+        <Path>Source Files/framework/usb/src/dynamic</Path>
+      </File>
+      <File>
+        <Name>sys_int.h</Name>
+        <Path>Header Files/framework/system/int</Path>
+      </File>
+      <File>
+        <Name>drv_usb.h</Name>
+        <Path>Header Files/framework/driver/usb</Path>
+      </File>
+    </Files>
+    <Templates>
+      <Template>
+        <Name>main.c</Name>
+        <Path>Source Files/app</Path>
+      </Template>
+      <Template>
+        <Name>system_tasks.c</Name>
+        <Path>Source Files/app/system_config/pic32mx695f512h</Path>
+        <Checksum>B4CB1F5B13561E07FA1E606E7D65176C</Checksum>
+      </Template>
+      <Template>
+        <Name>system_interrupt.c</Name>
+        <Path>Source Files/app/system_config/pic32mx695f512h</Path>
+        <Checksum>C1F87F2B27FDEE2F775A9D071102B6CE</Checksum>
+      </Template>
+      <Template>
+        <Name>system_config.h</Name>
+        <Path>Header Files/app/system_config/pic32mx695f512h</Path>
+        <Checksum>39015131093CE7970BF85F37A2919DDE</Checksum>
+      </Template>
+      <Template>
+        <Name>app.c</Name>
+        <Path>Source Files/app</Path>
+      </Template>
+      <Template>
+        <Name>sys_ports_static.c</Name>
+        <Path>Source Files/app/system_config/pic32mx695f512h/framework/system/ports/src</Path>
+        <Checksum>8C22202B87CB917EECD35DF44DED33EA</Checksum>
+      </Template>
+      <Template>
+        <Name>system_definitions.h</Name>
+        <Path>Header Files/app/system_config/pic32mx695f512h</Path>
+        <Checksum>EFD06A1C13E6C533C64C308BFF681244</Checksum>
+      </Template>
+      <Template>
+        <Name>system_exceptions.c</Name>
+        <Path>Source Files/app/system_config/pic32mx695f512h</Path>
+        <Checksum>C111969CA43D6CEA1E9E33A6164E7AE0</Checksum>
+      </Template>
+      <Template>
+        <Name>sys_clk_static.h</Name>
+        <Path>Header Files/app/system_config/pic32mx695f512h/framework/system/clk</Path>
+        <Checksum>999179DADE9ECD59953526F5E9F83ACC</Checksum>
+      </Template>
+      <Template>
+        <Name>sys_clk_static.c</Name>
+        <Path>Source Files/app/system_config/pic32mx695f512h/framework/system/clk/src</Path>
+        <Checksum>1B968DA82B5DD869A6119C3B7628D753</Checksum>
+      </Template>
+      <Template>
+        <Name>app.h</Name>
+        <Path>Header Files/app</Path>
+      </Template>
+      <Template>
+        <Name>system_init.c</Name>
+        <Path>Source Files/app/system_config/pic32mx695f512h</Path>
+        <Checksum>DA033280A90158D9C345EF049A33AB51</Checksum>
+      </Template>
+      <Template>
+        <Name>btl_mx.ld</Name>
+        <Path>Linker Files/system_config/pic32mx695f512h</Path>
+        <Checksum>95603DFB49B136E1C6B184C901573CD1</Checksum>
+      </Template>
+    </Templates>
+    <Libraries>
+      <Library value="../../../../../../opt/microchip/harmony/v1_06/bin/framework/peripheral/PIC32MX695F512H_peripherals.a"/>
+    </Libraries>
+  </Manifest>
+</configuration>
diff --git a/firmware/src/system_config/pic32mx695f512h/framework/system/clk/src/sys_clk_static.c b/firmware/src/system_config/pic32mx695f512h/framework/system/clk/src/sys_clk_static.c
new file mode 100644
index 0000000..837a4fb
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/framework/system/clk/src/sys_clk_static.c
@@ -0,0 +1,216 @@
+/*******************************************************************************
+  SYS CLK Static Functions for Clock System Service
+
+  Company:
+    Microchip Technology Inc.
+
+  File Name:
+    sys_clk_static.c
+
+  Summary:
+    SYS CLK static function implementations for the Clock System Service.
+
+  Description:
+    The Clock System Service provides a simple interface to manage the oscillators
+    on Microchip microcontrollers. This file defines the static implementation for the 
+    Clock System Service.
+    
+  Remarks:
+    Static functions incorporate all system clock configuration settings as
+    determined by the user via the Microchip Harmony Configurator GUI.  It provides 
+    static version of the routines, eliminating the need for an object ID or 
+    object handle.
+    
+    Static single-open interfaces also eliminate the need for the open handle.
+*******************************************************************************/
+
+//DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2014 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+*******************************************************************************/
+//DOM-IGNORE-END
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Include Files
+// *****************************************************************************
+// *****************************************************************************
+
+#include "system_config.h"
+#include "system_definitions.h"
+#include "peripheral/osc/plib_osc.h"
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: File Scope Functions
+// *****************************************************************************
+// *****************************************************************************
+
+// *****************************************************************************
+/* Function:
+    void SYS_CLK_Static_Initialize ( const SYS_CLK_INIT const * clkInit )
+
+  Summary:
+    Initializes hardware and internal data structure of the System Clock.
+
+  Description:
+    This function initializes the hardware and internal data structure of System
+    Clock Service.
+
+  Remarks:
+    This is configuration values for the static version of the Clock System Service 
+    module is determined by the user via the Microchip Harmony Configurator GUI.
+    This template will build a sys_clk_static.h and sys_clk_static.c file with 
+    the configuration per the user's choice.
+
+    The objective is to eliminate the user's need to be knowledgeable in the function of
+    the 'configuration bits' to configure the system oscillators. 
+*/
+
+void SYS_CLK_Initialize( const SYS_CLK_INIT const * clkInit )
+{
+    SYS_DEVCON_SystemUnlock ( );
+    
+    PLIB_OSC_FRCDivisorSelect( OSC_ID_0, OSC_FRC_DIV_2);
+
+    /* Enable Peripheral Bus 1 */
+    PLIB_OSC_PBClockDivisorSet (OSC_ID_0, 0, 1 );
+
+
+
+
+
+
+
+    SYS_DEVCON_SystemLock ( );
+}
+
+//******************************************************************************
+/* Function:
+    inline uint32_t SYS_CLK_SystemFrequencyGet ( void )
+
+  Summary:
+    Gets the system clock frequency in Hertz.
+
+  Description:
+    This function gets the System clock frequency in Hertz.
+
+  Precondition:
+    None.
+
+  Parameters:
+    None.
+
+  Returns:
+    System clock frequency in Hertz.
+
+  Example:
+    <code>
+    uint32_t sysClockHz;
+
+    sysClockHz = SYS_CLK_SystemFrequencyGet ( );
+    </code>
+
+  Remarks:
+ */
+
+inline uint32_t SYS_CLK_SystemFrequencyGet ( void )
+{
+    return SYS_CLK_FREQ;
+}
+
+//******************************************************************************
+/* Function:
+    inline uint32_t SYS_CLK_PeripheralFrequencyGet ( CLK_BUSES_PERIPHERAL peripheralBus )
+
+  Summary:
+    Gets the selected clock peripheral bus frequency in Hertz.
+
+  Description:
+    This function gets the selected peripheral bus clock frequency in Hertz.
+
+  Precondition:
+    None.
+
+  Parameters:
+	peripheralBus - Reference clock bus selection. One of the possible value from
+				CLK_BUSES_PERIPHERAL enum. For devices that do not have multiple
+				clock channels for Reference clock, CLK_BUS_PERIPHERAL_1 should be
+				the selection.
+
+  Returns:
+    Clock frequency in Hertz.
+
+  Example:
+    <code>
+    unsigned long peripheralClockHz;
+
+    peripheralClockHz = SYS_CLK_PeripheralFrequencyGet ( CLK_BUS_PERIPHERAL_5 );
+    </code>
+
+  Remarks:
+	Most of the devices doesn't have multiple Peripheral clock buses. In that case, 
+	pass CLK_USB_PERIPHERAL_1 as the bus number.
+ */
+
+inline uint32_t SYS_CLK_PeripheralFrequencyGet ( CLK_BUSES_PERIPHERAL peripheralBus )
+{
+    return SYS_CLK_BUS_PERIPHERAL_1;
+}
+
+
+//******************************************************************************
+/* Function:
+    inline uint32_t SYS_CLK_ReferenceClockFrequencyGet ( CLK_BUSES_REFERENCE referenceBus )
+
+  Summary:
+    Gets the selected Reference clock bus frequency in Hertz.
+
+  Description:
+    This function gets frequency of the selected Reference clock bus in Hertz.
+
+  Precondition:
+    None.
+
+  Parameters:
+	peripheralBus - Reference clock bus selection. One of the possible value from
+				CLK_BUSES_REFERENCE enum. For devices that do not have multiple
+				clock channels for Reference clock, CLK_BUS_REFERENCE_1 should be
+				the selection.
+
+  Returns:
+    Clock frequency in Hz.
+
+  Example:
+    <code>
+    unsigned long sysClockOutputHz;
+
+    sysClockOutputHz = SYS_CLK_ReferenceClockFrequencyGet ( CLK_BUS_REFERENCE_3 );
+    </code>
+
+  Remarks:
+ */
+
+inline uint32_t SYS_CLK_ReferenceClockFrequencyGet ( CLK_BUSES_REFERENCE referenceBus )
+{
+	return 0;
+}
\ No newline at end of file
diff --git a/firmware/src/system_config/pic32mx695f512h/framework/system/clk/sys_clk_static.h b/firmware/src/system_config/pic32mx695f512h/framework/system/clk/sys_clk_static.h
new file mode 100644
index 0000000..23a0cf5
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/framework/system/clk/sys_clk_static.h
@@ -0,0 +1,65 @@
+/*******************************************************************************
+  SYS CLK Static Interface Declarations for Clock System Service
+
+  Company:
+    Microchip Technology Inc.
+
+  File Name:
+    sys_clk_static.h
+
+  Summary:
+    SYS CLK interface declarations for the static system service.
+
+  Description:
+    The Clock System Service provides a simple interface to manage the oscillators
+    on Microchip microcontrollers. This file defines the interface
+    Declarations for the SYS CLK system service.
+    
+  Remarks:
+    Static interfaces incorporate all system clock configuration settings as
+    determined by the user via the Microchip Harmony Configurator GUI.  It provides 
+    static version of the routines, eliminating the need for an object ID or 
+    object handle.
+    
+    Static single-open interfaces also eliminate the need for the open handle.
+*******************************************************************************/
+
+//DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2014 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+*******************************************************************************/
+//DOM-IGNORE-END
+
+#ifndef _SYS_CLK_STATIC_H
+#define _SYS_CLK_STATIC_H
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: SYS CLK Module Initialization Routine (Static Version)
+// *****************************************************************************
+// *****************************************************************************
+
+#endif // #ifndef _SYS_CLK_STATIC_H
+
+/*******************************************************************************
+ End of File
+*/
diff --git a/firmware/src/system_config/pic32mx695f512h/framework/system/ports/src/sys_ports_static.c b/firmware/src/system_config/pic32mx695f512h/framework/system/ports/src/sys_ports_static.c
new file mode 100644
index 0000000..d84b837
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/framework/system/ports/src/sys_ports_static.c
@@ -0,0 +1,81 @@
+/*******************************************************************************
+  SYS PORTS Static Functions for PORTS System Service
+
+  Company:
+    Microchip Technology Inc.
+
+  File Name:
+    sys_ports_static.c
+
+  Summary:
+    SYS PORTS static function implementations for the Ports System Service.
+
+  Description:
+    The Ports System Service provides a simple interface to manage the ports
+    on Microchip microcontrollers. This file defines the static implementation for the 
+    Ports System Service.
+    
+  Remarks:
+    Static functions incorporate all system ports configuration settings as
+    determined by the user via the Microchip Harmony Configurator GUI.  It provides 
+    static version of the routines, eliminating the need for an object ID or 
+    object handle.
+
+*******************************************************************************/
+
+//DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2013 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+*******************************************************************************/
+//DOM-IGNORE-END
+
+#include "system_config.h"
+#include "peripheral/ports/plib_ports.h"
+#include "peripheral/int/plib_int.h"
+
+
+void SYS_PORTS_Initialize(void)
+{
+    /* AN and CN Pins Initialization */
+    PLIB_PORTS_AnPinsModeSelect(PORTS_ID_0, SYS_PORT_AD1PCFG, PORTS_PIN_MODE_DIGITAL);
+    PLIB_PORTS_CnPinsPullUpEnable(PORTS_ID_0, SYS_PORT_CNPUE);
+    PLIB_PORTS_CnPinsEnable(PORTS_ID_0, SYS_PORT_CNEN);
+    PLIB_PORTS_ChangeNoticeEnable(PORTS_ID_0);
+
+    
+    
+    /* PORT B Initialization */
+    PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_B, SYS_PORT_B_ODC);
+    PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_B,  SYS_PORT_B_LAT);
+	PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_B,  SYS_PORT_B_TRIS ^ 0xFFFF);
+    
+    /* PORT E Initialization */
+    PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_E, SYS_PORT_E_ODC);
+    PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_E,  SYS_PORT_E_LAT);
+	PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_E,  SYS_PORT_E_TRIS ^ 0xFFFF);
+    
+}
+
+
+/*******************************************************************************
+ End of File
+*/
diff --git a/firmware/src/system_config/pic32mx695f512h/gfx_hgc_definitions.c b/firmware/src/system_config/pic32mx695f512h/gfx_hgc_definitions.c
new file mode 100644
index 0000000..e3140af
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/gfx_hgc_definitions.c
@@ -0,0 +1,248 @@
+/*******************************************************************************
+  MPLAB Harmony Graphics Composer Generated Implementation File
+
+  File Name:
+    gfx_hgc_definitions.c
+
+  Summary:
+    Build-time generated implementation from the MPLAB Harmony
+    Graphics Composer.
+
+  Description:
+    Build-time generated implementation from the MPLAB Harmony
+    Graphics Composer.
+
+    Created with MPLAB Harmony Version 1.06
+*******************************************************************************/
+// DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+*******************************************************************************/
+// DOM-IGNORE-END
+
+#include "gfx_hgc_definitions.h"
+
+/*** Generated Asset References ***/
+/*** Generated ASCII Text Labels ***/
+/*** HGC Object Global ***/
+HGC_OBJECTS hgcObj;
+static HGC_STATES hgcState;
+
+/******************************************************************************
+  Function:
+    HGC_SCREEN_STATES GFX_HGC_GetScreenState ( void )
+
+  Remarks:
+    This function returns the screen state
+ */
+HGC_SCREEN_STATES GFX_HGC_GetScreenState ( void )
+{
+    return hgcObj.screenState;
+}
+
+
+/******************************************************************************
+  Function:
+    void GFX_HGC_SetScreenState ( HGC_SCREEN_STATES newState )
+
+  Remarks:
+    This function sets the screen state machine to a new state
+ */
+void GFX_HGC_SetScreenState ( HGC_SCREEN_STATES newState )
+{
+    hgcObj.prevRefreshState = hgcObj.screenState;
+    hgcObj.screenState = newState;
+}
+
+
+/******************************************************************************
+  Function:
+    void GFX_HGC_Setup ( void )
+
+  Summary:
+    This function sets up the GOL message callback and draw callbacks.  
+ */
+void GFX_HGC_Setup ( void )
+{
+}
+
+/******************************************************************************
+  Function:
+    void GFX_HGC_Tasks (SYS_MODULE_OBJ gfxObject);
+
+  Summary:
+    This function is called in SYS_Tasks.  The intent wait until the GFX library
+    is initialized before supplying items to draw
+*/
+void GFX_HGC_Tasks  (SYS_MODULE_OBJ gfxObject)
+{
+    switch ( hgcState )
+    {
+        case HGC_STATE_INIT:
+            if (GFX_Status(gfxObject)==SYS_STATUS_READY)
+            {
+                GFX_HGC_Setup();
+                hgcState = HGC_STATE_RUNNING;
+            }
+            break;
+
+        case HGC_STATE_RUNNING:
+            //Drive screen state machine
+            GFX_HGC_DrawScreenTask();
+            break;
+
+        default:
+            break;
+    }
+}
+
+/******************************************************************************
+  Function: 
+    void GFX_HGC_DrawScreenTask( void )
+
+  Remarks: 
+    Task loop to drive the HGC generated screen state machine for HGC design
+    that has primitives only
+ */
+void GFX_HGC_DrawScreenTask( void )
+{
+    switch (hgcObj.screenState)
+    {
+        case HGC_SCREEN_STATE_INIT:
+            //Draw the primary screen as selected in the Composer
+            GFX_HGC_SetScreenState(HGC_SCREEN_STATE_SETUP_SCREEN_Screen1);
+            break;
+        case HGC_SCREEN_STATE_SETUP_SCREEN_Screen1:
+            GFX_HGC_SetupScreen(Screen1);
+
+            GFX_HGC_SetScreenState(HGC_SCREEN_STATE_PRE_DRAW_PRIMITIVE_SCREEN_Screen1);
+            break;
+        case HGC_SCREEN_STATE_PRE_DRAW_PRIMITIVE_SCREEN_Screen1:
+            GFX_HGC_SetScreenState(HGC_SCREEN_STATE_DRAW_PRIMITIVE_SCREEN_Screen1);
+            break;
+        case HGC_SCREEN_STATE_DRAW_PRIMITIVE_SCREEN_Screen1:
+            GFX_HGC_DrawScreen_Primitives(Screen1);
+            GFX_HGC_SetScreenState(HGC_SCREEN_STATE_POST_DRAW_PRIMITIVE_SCREEN_Screen1);
+            break;
+        case HGC_SCREEN_STATE_POST_DRAW_PRIMITIVE_SCREEN_Screen1:
+            GFX_HGC_SetScreenState(HGC_SCREEN_STATE_DISPLAY_SCREEN_Screen1);
+            break;
+        case HGC_SCREEN_STATE_DISPLAY_SCREEN_Screen1:
+            break;
+        default:
+            break;
+    }
+}
+
+/******************************************************************************
+  Function: 
+    void GFX_HGC_SetupScreen( uint8_t  screenId )
+
+  Remarks: 
+    Clears current screen and starts a fresh screen with its background color
+ */
+void GFX_HGC_SetupScreen(uint8_t screenId)
+{
+    switch (screenId)
+    {
+        case Screen1:
+            GFX_ColorSet(GFX_INDEX_0, GFX_RGBConvert(0x00, 0x00, 0x00));
+            GFX_ScreenClear(GFX_INDEX_0);
+            break;
+        default:
+            break;
+    }
+}
+
+
+/******************************************************************************
+  Function: 
+    bool GFX_HGC_ChangeScreen( uint8_t  screenId )
+
+  Output: 
+    Returns true if a screenId matches an existing screen identifier
+
+  Remarks: 
+    Can be called to initiate GFX Library to draw a new screen
+ */
+bool GFX_HGC_ChangeScreen(uint8_t screenId)
+{
+    switch (screenId)
+    {
+        case Screen1:
+            GFX_HGC_SetScreenState(HGC_SCREEN_STATE_SETUP_SCREEN_Screen1);
+            break;
+        default:
+            return false;
+    }
+
+    return true; // release drawing control to GOL
+}
+
+/******************************************************************************
+  Function: 
+    bool GFX_HGC_DrawScreen_Primitives( uint8_t  screenId )
+
+  Output:
+    Returns true if a screenId matches an existing screen identifier
+
+  Remarks: 
+    HGC-specified GFX Primitives are drawn here, grouped by screen.
+    GFX Primitives are drawn after GFX GOL Objects to make sure GFX GOL Objects
+    do not cover GFX Primitives
+ */
+bool GFX_HGC_DrawScreen_Primitives(uint8_t screenId)
+{
+    switch (screenId)
+    {
+        case Screen1:
+            break;
+        default:
+            return true;
+    }
+
+    return true; // release drawing control to GOL
+}
+
+
+/******************************************************************************
+  Function: 
+    bool GFX_HGC_DrawItem(int itemId)
+
+  Output:
+    Returns true if a itemId matches an existing item identifier
+
+  Remarks: 
+    Every item specified in every screen in HGC is listed in this function
+ */
+bool GFX_HGC_DrawItem(int itemId)
+{
+    switch(itemId)
+    {
+	default:
+		return false; // process by default
+    }
+
+    return true;
+}
+
+
diff --git a/firmware/src/system_config/pic32mx695f512h/gfx_hgc_definitions.h b/firmware/src/system_config/pic32mx695f512h/gfx_hgc_definitions.h
new file mode 100644
index 0000000..268b8f2
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/gfx_hgc_definitions.h
@@ -0,0 +1,219 @@
+/*******************************************************************************
+  MPLAB Harmony Graphics Composer Generated Definitions Header
+
+  File Name:
+    gfx_hgc_definitions.h
+
+  Summary:
+    Build-time generated definitions header based on output by the MPLAB Harmony
+    Graphics Composer.
+
+  Description:
+    Build-time generated definitions header based on output by the MPLAB Harmony
+    Graphics Composer.
+
+    Created with MPLAB Harmony Version 1.06
+*******************************************************************************/
+
+// DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+*******************************************************************************/
+// DOM-IGNORE-END
+
+
+#ifndef _GFX_HGC_DEFINITIONS_H
+#define _GFX_HGC_DEFINITIONS_H
+
+#include "system_config.h"
+#include "system_definitions.h"
+
+// DOM-IGNORE-BEGIN
+#ifdef __cplusplus  // Provide C++ Compatibility
+
+extern "C" {
+
+#endif
+// DOM-IGNORE-END 
+
+typedef enum
+{
+    HGC_STATE_INIT = 0,
+    HGC_STATE_RUNNING
+} HGC_STATES;
+
+typedef enum
+{
+    HGC_SCREEN_STATE_INIT = 0,
+    HGC_SCREEN_STATE_SETUP_SCREEN_Screen1,
+    HGC_SCREEN_STATE_PRE_DRAW_GOL_SCREEN_Screen1,
+    HGC_SCREEN_STATE_DRAW_GOL_SCREEN_Screen1,
+    HGC_SCREEN_STATE_POST_DRAW_GOL_SCREEN_Screen1,
+    HGC_SCREEN_STATE_PRE_DRAW_PRIMITIVE_SCREEN_Screen1,
+    HGC_SCREEN_STATE_DRAW_PRIMITIVE_SCREEN_Screen1,
+    HGC_SCREEN_STATE_POST_DRAW_PRIMITIVE_SCREEN_Screen1,
+    HGC_SCREEN_STATE_DISPLAY_SCREEN_Screen1,
+	
+} HGC_SCREEN_STATES;
+
+/*** Screen IDs ***/
+#define Screen1                 0 
+	
+
+
+// *****************************************************************************
+/* MPLAB Harmony Graphics Composer Objects
+
+  Summary:
+    Structure holding the graphics object handles
+
+  Description:
+    This structure contains the object handles for all graphics objects 
+    generated by the Harmony Graphics Composer
+
+  Remarks:
+*/
+
+typedef struct HGC_OBJECTS
+{
+    HGC_SCREEN_STATES screenState;      // current state of screen state machine
+    HGC_SCREEN_STATES prevRefreshState; // previous state of screen state machine
+
+    /*** GOL Objects References ***/
+} HGC_OBJECTS;
+
+extern HGC_OBJECTS hgcObj;
+
+/******************************************************************************
+  Function:
+    void GFX_HGC_Setup ( void )
+
+  Summary:
+    This function sets up the GOL message callback and draw callbacks.  
+ */
+void GFX_HGC_Setup ( void );
+
+
+/******************************************************************************
+  Function:
+    HGC_SCREEN_STATES GFX_HGC_GetScreenState ( void )
+
+  Remarks:
+    This function returns the screen state
+ */
+HGC_SCREEN_STATES GFX_HGC_GetScreenState ( void );
+
+
+/******************************************************************************
+  Function:
+    void GFX_HGC_SetScreenState ( HGC_SCREEN_STATES newState )
+
+  Remarks:
+    This function sets the screen state machine to a new state
+ */
+void GFX_HGC_SetScreenState ( HGC_SCREEN_STATES newState );
+
+
+/******************************************************************************
+  Function:
+    void GFX_HGC_Tasks (SYS_MODULE_OBJ gfxObject);
+
+  Summary:
+    This function is called in SYS_Tasks.  The intent wait until the GFX library
+    is initialized before supplying items to draw
+*/
+void GFX_HGC_Tasks  (SYS_MODULE_OBJ gfxObject);
+
+
+/******************************************************************************
+  Function: 
+    void GFX_HGC_DrawScreenTask( void )
+
+  Remarks: 
+    Task loop to drive the HGC generated screen state machine for HGC design
+    that has GFX_Primitives only
+ */
+void GFX_HGC_DrawScreenTask( void );
+
+
+/******************************************************************************
+  Function: 
+    bool GFX_HGC_DrawScreen_Primitives( uint8_t  screenId )
+
+  Output:
+    Returns true if a screenId matches an existing screen identifier
+
+  Remarks: 
+    HGC-specified GFX Primitives are drawn here, grouped by screen.
+    GFX Primitives are drawn after GFX GOL Objects to make sure GFX GOL Objects
+    do not cover GFX Primitives
+ */
+bool GFX_HGC_DrawScreen_Primitives(uint8_t screenId);
+
+
+/******************************************************************************
+  Function: 
+    void GFX_HGC_SetupScreen( uint8_t  screenId )
+
+  Remarks: 
+    Clears current screen and starts a fresh screen with its background color
+ */
+void GFX_HGC_SetupScreen(uint8_t screenId);
+
+
+/******************************************************************************
+  Function: 
+    bool GFX_HGC_ChangeScreen( uint8_t  screenId )
+
+  Output: 
+    Returns true if a screenId matches an existing screen identifier
+
+  Remarks: 
+    Can be called to initiate GFX Library to draw a new screen
+ */
+bool GFX_HGC_ChangeScreen(uint8_t screenId);
+
+
+/******************************************************************************
+  Function: 
+    bool GFX_HGC_DrawItem(int itemId)
+
+  Output:
+    Returns true if a itemId matches an existing item identifier
+
+  Remarks: 
+    Every item specified in every screen in HGC is listed in this function
+ */
+bool GFX_HGC_DrawItem(int itemId);
+
+
+
+//DOM-IGNORE-BEGIN
+#ifdef __cplusplus
+}
+#endif
+//DOM-IGNORE-END
+
+#endif // _GFX_HGC_DEFINITIONS_H
+/*******************************************************************************
+ End of File
+*/
diff --git a/firmware/src/system_config/pic32mx695f512h/pic32mx695f512h.mhc b/firmware/src/system_config/pic32mx695f512h/pic32mx695f512h.mhc
new file mode 100644
index 0000000..13017a8
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/pic32mx695f512h.mhc
@@ -0,0 +1,406 @@
+#
+# Configuration generated by Microchip Harmony Configurator (MHC) v1.0.7.9
+#     Project name:    CText
+#     Configuration:   pic32mx695f512h
+#     Device:          PIC32MX695F512H
+#     Harmony version: 1.06
+#
+#
+# from $PROJECT_FIRMWARE_DIRECTORY/$PROJECT_NAME.hconfig
+#
+CONFIG_APP_INSTANCES=1
+#
+# from $HARMONY_VERSION_PATH/utilities/mhc/config/app_name_idx.ftl
+#
+CONFIG_APP_MENU_IDX0=y
+CONFIG_APP_NAME_0="app"
+#
+# from $PROJECT_FIRMWARE_DIRECTORY/$PROJECT_NAME.hconfig
+#
+CONFIG_USE_EXCEPTION_HANDLER=y
+CONFIG_EXCEPTION_USE_SYS_DEBUG=y
+CONFIG_EXCEPTION_BREAKPOINT=y
+#
+# from $HARMONY_VERSION_PATH/framework/bluetooth/config/bluetooth.hconfig
+#
+CONFIG_USE_BLUETOOTH_LIBRARIES=n
+#
+# from $HARMONY_VERSION_PATH/framework/bootloader/config/bootloader.hconfig
+#
+CONFIG_USE_BOOTLOADER=y
+CONFIG_CUSTOM_BOOTLOADER_PROGRAM_SPACE=y
+CONFIG_USE_BOOTLOADER_LIBRARY=n
+#
+# from $HARMONY_VERSION_PATH/framework/crypto/config/crypto.hconfig
+#
+CONFIG_USE_CRYPTO_LIB=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/adc/config/drv_adc.hconfig
+#
+CONFIG_USE_DRV_ADC=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/camera/config/drv_camera.hconfig
+#
+CONFIG_USE_DRV_CAMERA=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/cmp/config/drv_cmp.hconfig
+#
+CONFIG_DRV_CVREF_ENABLE=n
+CONFIG_USE_DRV_CMP=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/encx24j600/config/drv_encx24j600.hconfig
+#
+CONFIG_DRV_ENCX24J600_USE_DRIVER=n
+#
+# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_mac.hconfig
+#
+CONFIG_TCPIP_USE_ETH_MAC=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/lcc/config/drv_gfx_lcc.hconfig
+#
+CONFIG_USE_DRV_GFX_LCC=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/otm2201a/config/drv_gfx_otm2201a.hconfig
+#
+CONFIG_USE_DRV_GFX_OTM2201A=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/ssd1926/config/drv_gfx_ssd1926.hconfig
+#
+CONFIG_USE_DRV_GFX_SSD1926=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/ssd1289/config/drv_gfx_ssd1289.hconfig
+#
+CONFIG_USE_DRV_GFX_SSD1289=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/s1d13517/config/drv_gfx_s1d13517.hconfig
+#
+CONFIG_USE_DRV_GFX_S1D13517=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/gfx/controller/tft002/config/drv_gfx_tft002.hconfig
+#
+CONFIG_USE_DRV_GFX_TFT002=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/gfx/display/config/drv_gfx_display.hconfig
+#
+CONFIG_USE_DRV_GFX_DISPLAY=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/i2c/config/drv_i2c.hconfig
+#
+CONFIG_USE_DRV_I2C=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/ic/config/drv_ic.hconfig
+#
+CONFIG_USE_DRV_IC=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/nvm/config/drv_nvm.hconfig
+#
+CONFIG_USE_DRV_NVM=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/oc/config/drv_oc.hconfig
+#
+CONFIG_USE_DRV_OC=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/pmp/config/drv_pmp.hconfig
+#
+CONFIG_USE_DRV_PMP=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/rtcc/config/drv_rtcc.hconfig
+#
+CONFIG_USE_DRV_RTCC=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/sample/config/drv_sample.hconfig
+#
+CONFIG_USE_DRV_SAMPLE=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/sdcard/config/drv_sdcard.hconfig
+#
+CONFIG_USE_DRV_SDCARD=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/spi/config/drv_spi.hconfig
+#
+CONFIG_DRV_SPI_USE_DRIVER=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/spi_flash/sst25vf016b/config/drv_sst25vf016b.hconfig
+#
+CONFIG_USE_DRV_SST25VF016B=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/spi_flash/sst25vf020b/config/drv_sst25vf020b.hconfig
+#
+CONFIG_USE_DRV_SST25VF020B=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/spi_flash/sst25vf064c/config/drv_sst25vf064c.hconfig
+#
+CONFIG_USE_DRV_SST25VF064C=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/tmr/config/drv_tmr.hconfig
+#
+CONFIG_USE_DRV_TMR=y
+CONFIG_DRV_TMR_DRIVER_MODE="DYNAMIC"
+CONFIG_DRV_TMR_CLIENTS_NUMBER=1
+CONFIG_DRV_TMR_INTERRUPT_MODE=y
+CONFIG_DRV_TMR_INSTANCES_NUMBER=1
+#
+# from $HARMONY_VERSION_PATH/framework/driver/tmr/config/drv_tmr_idx.ftl
+#
+CONFIG_DRV_TMR_INST_0=y
+CONFIG_DRV_TMR_PERIPHERAL_ID_IDX0="TMR_ID_1"
+CONFIG_DRV_TMR_INTERRUPT_PRIORITY_IDX0="INT_PRIORITY_LEVEL1"
+CONFIG_DRV_TMR_INTERRUPT_SUB_PRIORITY_IDX0="INT_SUBPRIORITY_LEVEL0"
+CONFIG_DRV_TMR_CLOCK_SOURCE_IDX0="DRV_TMR_CLKSOURCE_INTERNAL"
+CONFIG_DRV_TMR_PRESCALE_IDX0="TMR_PRESCALE_VALUE_256"
+CONFIG_DRV_TMR_OPERATION_MODE_IDX0="DRV_TMR_OPERATION_MODE_16_BIT"
+CONFIG_DRV_TMR_ASYNC_WRITE_ENABLE_IDX0=n
+CONFIG_DRV_TMR_POWER_STATE_IDX0="SYS_MODULE_POWER_RUN_FULL"
+#
+# from $HARMONY_VERSION_PATH/framework/driver/touch/adc10bit/config/drv_adc10bit.hconfig
+#
+CONFIG_USE_DRV_TOUCH_ADC10BIT=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/touch/ar1020/config/drv_ar1020.hconfig
+#
+CONFIG_USE_DRV_TOUCH_AR1020=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/touch/mtch6301/config/drv_mtch6301.hconfig
+#
+CONFIG_USE_DRV_TOUCH_MTCH6301=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/usart/config/drv_usart.hconfig
+#
+CONFIG_USE_DRV_USART=n
+#
+# from $HARMONY_VERSION_PATH/framework/driver/wifi/config/drv_wifi.hconfig
+#
+CONFIG_USE_DRV_WIFI=n
+#
+# from $HARMONY_VERSION_PATH/framework/gfx/config/gfx.hconfig
+#
+CONFIG_USE_GFX_STACK=n
+#
+# from $HARMONY_VERSION_PATH/framework/math/dsp/config/dsp.hconfig
+#
+CONFIG_USE_DSP=n
+#
+# from $HARMONY_VERSION_PATH/framework/osal/config/osal.hconfig
+#
+CONFIG_USE_OSAL=y
+#
+# from $HARMONY_VERSION_PATH/framework/peripheral/config/peripheral.hconfig
+#
+CONFIG_PERIPHERAL_LIB=y
+#
+# from $HARMONY_VERSION_PATH/framework/system/clk/config/sys_clk.hconfig
+#
+CONFIG_USE_SYS_CLK=y
+CONFIG_SYS_CLK_MODE="STATIC"
+CONFIG_SYS_CLK_PBDIV0_OVERRIDE=n
+CONFIG_SYS_CLK_PBDIV0_MX="DIV_1"
+CONFIG_SYS_CLK_CONFIG_PRIMARY_XTAL="8000000"
+CONFIG_SYS_CLK_CONFIG_SECONDARY_XTAL=""
+CONFIG_SYS_CLK_FREQ="80000000"
+CONFIG_SYS_CLK_PBCLK_FREQ="80000000"
+CONFIG_SYS_CLK_UPLL_BEFORE_DIV2_FREQ="48000000"
+#
+# from $HARMONY_VERSION_PATH/framework/system/command/config/sys_command.hconfig
+#
+CONFIG_USE_SYS_COMMAND=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/common/config/sys_common.hconfig
+#
+CONFIG_USE_SYS_COMMON=y
+CONFIG_SYS_BUFFER=n
+CONFIG_SYS_QUEUE=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/console/config/sys_console.hconfig
+#
+CONFIG_USE_SYS_CONSOLE=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/debug/config/sys_debug.hconfig
+#
+CONFIG_USE_SYS_DEBUG=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/devcon/config/sys_devcon.hconfig
+#
+CONFIG_USE_SYS_DEVCON=y
+CONFIG_SYS_DEVCON_USE_JTAG=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/dma/config/sys_dma.hconfig
+#
+CONFIG_USE_SYS_DMA=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/fs/config/sys_fs.hconfig
+#
+CONFIG_USE_SYS_FS=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/int/config/sys_int.hconfig
+#
+CONFIG_USE_SYS_INT=y
+CONFIG_USE_EXT_INT=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/msg/config/sys_msg.hconfig
+#
+CONFIG_USE_SYS_MSG=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/ports/config/sys_ports.hconfig
+#
+CONFIG_USE_SYS_PORTS=y
+CONFIG_COMPONENT_PACKAGE="TQFP"
+CONFIG_SYS_PORTS_CN=n
+CONFIG_USE_SYS_PORTS_CN_INTERRUPT=n
+CONFIG_SYS_PORT_ADPCFG=0xffdf
+CONFIG_SYS_PORT_CNEN=0x0
+CONFIG_SYS_PORT_CNPU=0x0
+#
+# from $HARMONY_VERSION_PATH/framework/system/ports/config/sys_ports_idx.ftl
+#
+CONFIG_USE_PORT_B=y
+CONFIG_SYS_PORT_B_TRIS=0x3c20
+CONFIG_SYS_PORT_B_LAT=0x0
+CONFIG_SYS_PORT_B_ODC=0x0
+CONFIG_SYS_PORT_C_TRIS=0xf000
+CONFIG_SYS_PORT_C_LAT=0x0
+CONFIG_SYS_PORT_C_ODC=0x0
+CONFIG_SYS_PORT_D_TRIS=0xfff
+CONFIG_SYS_PORT_D_LAT=0x0
+CONFIG_SYS_PORT_D_ODC=0x0
+CONFIG_USE_PORT_E=y
+CONFIG_SYS_PORT_E_TRIS=0x0
+CONFIG_SYS_PORT_E_LAT=0x0
+CONFIG_SYS_PORT_E_ODC=0x0
+CONFIG_SYS_PORT_F_TRIS=0x3b
+CONFIG_SYS_PORT_F_LAT=0x0
+CONFIG_SYS_PORT_F_ODC=0x0
+CONFIG_SYS_PORT_G_TRIS=0x3cc
+CONFIG_SYS_PORT_G_LAT=0x0
+CONFIG_SYS_PORT_G_ODC=0x0
+#
+# from $HARMONY_VERSION_PATH/framework/system/random/config/sys_random.hconfig
+#
+CONFIG_USE_SYS_RANDOM=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/reset/config/sys_reset.hconfig
+#
+CONFIG_USE_SYS_RESET=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/touch/config/sys_touch.hconfig
+#
+CONFIG_USE_SYS_TOUCH=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/tmr/config/sys_tmr.hconfig
+#
+CONFIG_USE_SYS_TMR=y
+CONFIG_SYS_TMR_POWER_STATE="SYS_MODULE_POWER_RUN_FULL"
+CONFIG_SYS_TMR_DRIVER_INDEX="DRV_TMR_INDEX_0"
+CONFIG_SYS_TMR_MAX_CLIENT_OBJECTS=5
+CONFIG_SYS_TMR_FREQUENCY=1000
+CONFIG_SYS_TMR_FREQUENCY_TOLERANCE=10
+CONFIG_SYS_TMR_UNIT_RESOLUTION=10000
+CONFIG_SYS_TMR_CLIENT_TOLERANCE=10
+CONFIG_SYS_TMR_INTERRUPT_NOTIFICATION=n
+#
+# from $HARMONY_VERSION_PATH/framework/system/wdt/config/sys_wdt.hconfig
+#
+CONFIG_USE_SYS_WDT=n
+#
+# from $HARMONY_VERSION_PATH/framework/tcpip/config/tcpip_stack.hconfig
+#
+CONFIG_USE_TCPIP_STACK=n
+#
+# from $HARMONY_VERSION_PATH/framework/usb/config/usb.hconfig
+#
+CONFIG_USE_USB_STACK=y
+CONFIG_DRV_USB_DRIVER_MODE="DYNAMIC"
+CONFIG_DRV_USB_INTERRUPT_MODE=y
+CONFIG_DRV_USB_DEVICE_SUPPORT=n
+CONFIG_DRV_USB_HOST_SUPPORT=y
+CONFIG_DRV_USB_BETA_SW_HOST_SUPPORT=n
+CONFIG_USB_HOST_SPEED_FS_IDX0="USB_SPEED_FULL"
+CONFIG_USB_HOST_DEVICE_NUMBER=1
+CONFIG_USB_HOST_TPL_ENTRY_NUMBER=1
+CONFIG_USB_HOST_MAX_INTERFACES=5
+CONFIG_USB_HOST_USE_HUB=n
+CONFIG_USB_HOST_USE_CDC=n
+CONFIG_USB_HOST_USE_HID=y
+CONFIG_USB_HOST_USE_MOUSE=n
+CONFIG_USB_HOST_USE_KEYBOARD=y
+CONFIG_USB_HOST_HID_NUMBER_OF_INSTANCES=1
+CONFIG_USB_HOST_HID_INTERRUPT_IN_ENDPOINTS_NUMBER=1
+CONFIG_USB_HID_TOTAL_USAGE_DRIVER_INSTANCES=1
+CONFIG_USB_HID_GLOBAL_PUSH_POP_STACK_SIZE=1
+CONFIG_USB_HOST_USE_AUDIO=n
+CONFIG_USB_HOST_USE_MSD=n
+#
+# from $HARMONY_VERSION_PATH/framework/sample/config/sample_module.hconfig
+#
+CONFIG_USE_SAMPLE_MODULE=n
+#
+# from $HARMONY_VERSION_PATH/framework/test/config/test.hconfig
+#
+CONFIG_USE_TEST_HARNESS=n
+#
+# from $HARMONY_VERSION_PATH/framework/decoder/config/decoder.hconfig
+#
+CONFIG_USE_DECODER=n
+#
+# from $HARMONY_VERSION_PATH/framework/net/pres/config/net_pres.hconfig
+#
+CONFIG_NET_PRES_USE=n
+#
+# from $HARMONY_VERSION_PATH/bsp/config/bsp.hconfig
+#
+CONFIG_USE_BSP=n
+#
+# from $HARMONY_VERSION_PATH/third_party/rtos/config/rtos.hconfig
+#
+CONFIG_USE_3RDPARTY_RTOS=n
+#
+# from $HARMONY_VERSION_PATH/third_party/tcpip/config/wolfssl.hconfig
+#
+CONFIG_USE_3RDPARTY_WOLFSSL=n
+#
+# from $HARMONY_VERSION_PATH/third_party/tcpip/iniche/config/embtcp.hconfig
+#
+CONFIG_IN_EMB_TCPIP_USE_TCP=n
+#
+# from $HARMONY_VERSION_PATH/third_party/tcpip/iniche/config/embdual.hconfig
+#
+CONFIG_IN_EMB_DUAL_USE_TCP=n
+#
+# from $HARMONY_VERSION_PATH/third_party/tcpip/iniche/config/stack.hconfig
+#
+CONFIG_IN_TCPIP=n
+#
+# from $HARMONY_VERSION_PATH/config/harmony.hconfig
+#
+CONFIG_DEVICE_CONFIGURATION=y
+#
+# from $HARMONY_VERSION_PATH/utilities/mhc/config/PIC32MX695F512H.hconfig
+#
+CONFIG_USERID=0xffff
+CONFIG_FSRSSEL="PRIORITY_7"
+CONFIG_FMIIEN="ON"
+CONFIG_FETHIO="ON"
+CONFIG_FUSBIDIO="ON"
+CONFIG_FVBUSONIO="ON"
+CONFIG_FPLLIDIV="DIV_2"
+CONFIG_FPLLMUL="MUL_20"
+CONFIG_UPLLIDIV="DIV_2"
+CONFIG_UPLLEN="OFF"
+CONFIG_FPLLODIV="DIV_1"
+CONFIG_FNOSC="FRCPLL"
+CONFIG_FSOSCEN="ON"
+CONFIG_IESO="OFF"
+CONFIG_POSCMOD="OFF"
+CONFIG_OSCIOFNC="OFF"
+CONFIG_FPBDIV="DIV_1"
+CONFIG_FCKSM="CSDCMD"
+CONFIG_WDTPS="PS1048576"
+CONFIG_FWDTEN="OFF"
+CONFIG_DEBUG="OFF"
+CONFIG_ICESEL="ICS_PGx2"
+CONFIG_PWP="OFF"
+CONFIG_BWP="OFF"
+CONFIG_CP="OFF"
+#
+# from $HARMONY_VERSION_PATH/utilities/mhc/config/project.hconfig
+#
+CONFIG_XC32_HEAP="4096"
diff --git a/firmware/src/system_config/pic32mx695f512h/system_config.h b/firmware/src/system_config/pic32mx695f512h/system_config.h
new file mode 100644
index 0000000..0183686
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/system_config.h
@@ -0,0 +1,238 @@
+/*******************************************************************************
+  MPLAB Harmony System Configuration Header
+
+  File Name:
+    system_config.h
+
+  Summary:
+    Build-time configuration header for the system defined by this MPLAB Harmony
+    project.
+
+  Description:
+    An MPLAB Project may have multiple configurations.  This file defines the
+    build-time options for a single configuration.
+
+  Remarks:
+    This configuration header must not define any prototypes or data
+    definitions (or include any files that do).  It only provides macro
+    definitions for build-time configuration options that are not instantiated
+    until used by another MPLAB Harmony module or application.
+    
+    Created with MPLAB Harmony Version 1.06
+*******************************************************************************/
+
+// DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2013-2015 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+*******************************************************************************/
+// DOM-IGNORE-END
+
+#ifndef _SYSTEM_CONFIG_H
+#define _SYSTEM_CONFIG_H
+
+/* This is a temporary workaround for an issue with the peripheral library "Exists"
+   functions that causes superfluous warnings.  It "nulls" out the definition of
+   The PLIB function attribute that causes the warning.  Once that issue has been
+   resolved, this definition should be removed. */
+#define _PLIB_UNSUPPORTED
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Included Files
+// *****************************************************************************
+// *****************************************************************************
+/*  This section Includes other configuration headers necessary to completely
+    define this configuration.
+*/
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: System Service Configuration
+// *****************************************************************************
+// *****************************************************************************
+
+// *****************************************************************************
+/* Common System Service Configuration Options
+*/
+#define SYS_VERSION_STR           "1.06"
+#define SYS_VERSION               10600
+
+// *****************************************************************************
+/* Clock System Service Configuration Options
+*/
+#define SYS_CLK_FREQ                        80000000ul
+#define SYS_CLK_BUS_PERIPHERAL_1            80000000ul
+#define SYS_CLK_UPLL_BEFORE_DIV2_FREQ       48000000ul
+#define SYS_CLK_CONFIG_PRIMARY_XTAL         8000000ul
+#define SYS_CLK_CONFIG_SECONDARY_XTAL       0ul
+   
+/*** Interrupt System Service Configuration ***/
+#define SYS_INT                     true
+
+/*** Ports System Service Configuration ***/
+#define SYS_PORT_AD1PCFG        ~0xffff
+#define SYS_PORT_CNPUE          0x0
+#define SYS_PORT_CNEN           0x0
+
+#define SYS_PORT_B_TRIS         0x3c20
+#define SYS_PORT_B_LAT          0x0
+#define SYS_PORT_B_ODC          0x0
+
+#define SYS_PORT_E_TRIS         0x0
+#define SYS_PORT_E_LAT          0x0
+#define SYS_PORT_E_ODC          0x0
+/*** Timer System Service Configuration ***/
+#define SYS_TMR_POWER_STATE             SYS_MODULE_POWER_RUN_FULL
+#define SYS_TMR_DRIVER_INDEX            DRV_TMR_INDEX_0
+#define SYS_TMR_MAX_CLIENT_OBJECTS      5
+#define SYS_TMR_FREQUENCY               1000
+#define SYS_TMR_FREQUENCY_TOLERANCE     10
+#define SYS_TMR_UNIT_RESOLUTION         10000
+#define SYS_TMR_CLIENT_TOLERANCE        10
+#define SYS_TMR_INTERRUPT_NOTIFICATION  false
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Driver Configuration
+// *****************************************************************************
+// *****************************************************************************
+
+/*** Timer Driver Configuration ***/
+#define DRV_TMR_INSTANCES_NUMBER           1
+#define DRV_TMR_CLIENTS_NUMBER             1
+#define DRV_TMR_INTERRUPT_MODE             true
+
+/*** Timer Driver 0 Configuration ***/
+#define DRV_TMR_PERIPHERAL_ID_IDX0          TMR_ID_1
+#define DRV_TMR_INTERRUPT_SOURCE_IDX0       INT_SOURCE_TIMER_1
+#define DRV_TMR_INTERRUPT_VECTOR_IDX0       INT_VECTOR_T1
+#define DRV_TMR_ISR_VECTOR_IDX0             _TIMER_1_VECTOR
+#define DRV_TMR_INTERRUPT_PRIORITY_IDX0     INT_PRIORITY_LEVEL1
+#define DRV_TMR_INTERRUPT_SUB_PRIORITY_IDX0 INT_SUBPRIORITY_LEVEL0
+#define DRV_TMR_CLOCK_SOURCE_IDX0           DRV_TMR_CLKSOURCE_INTERNAL
+#define DRV_TMR_PRESCALE_IDX0               TMR_PRESCALE_VALUE_256
+#define DRV_TMR_OPERATION_MODE_IDX0         DRV_TMR_OPERATION_MODE_16_BIT
+#define DRV_TMR_ASYNC_WRITE_ENABLE_IDX0     false
+#define DRV_TMR_POWER_STATE_IDX0            SYS_MODULE_POWER_RUN_FULL
+
+ 
+ 
+// *****************************************************************************
+// *****************************************************************************
+// Section: Middleware & Other Library Configuration
+// *****************************************************************************
+// *****************************************************************************
+
+/*** USB Driver Configuration ***/
+
+
+/* Disable Device Support */
+#define DRV_USBFS_DEVICE_SUPPORT      false
+
+/* Enables Device Support */
+#define DRV_USBFS_HOST_SUPPORT      true
+
+/* Maximum USB driver instances */
+#define DRV_USBFS_INSTANCES_NUMBER    1
+
+
+/* Interrupt mode enabled */
+#define DRV_USBFS_INTERRUPT_MODE      true
+
+
+/* Number of Endpoints used */
+#define DRV_USBFS_ENDPOINTS_NUMBER    1
+
+
+
+
+
+
+#define DRV_USBFS_HOST_NAK_LIMIT      2000
+/* Provides Host pipes number */
+#define DRV_USBFS_HOST_PIPES_NUMBER    10
+#define DRV_USBFS_HOST_ATTACH_DEBOUNCE_DURATION 500
+#define DRV_USBFS_HOST_RESET_DURATION 100
+// *****************************************************************************
+// *****************************************************************************
+// Section: USB Device Layer Configuration
+// *****************************************************************************
+// *****************************************************************************
+/* Provides Host pipes number */
+#define USB_HOST_PIPES_NUMBER    10
+/* NAK Limit for Control transfer data stage and Status Stage */
+#define DRV_USB_HOST_NAK_LIMIT		200
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: USB Host Layer Configuration
+// *****************************************************************************
+// **************************************************************************
+ 
+/* Total number of devices to be supported */
+#define USB_HOST_DEVICES_NUMBER         1
+
+/* Target peripheral list entries */
+#define  USB_HOST_TPL_ENTRIES           1 
+
+/* Maximum number of configurations supported per device */
+#define USB_HOST_DEVICE_INTERFACES_NUMBER     5    
+
+#define USB_HOST_CONTROLLERS_NUMBER           1
+
+#define USB_HOST_TRANSFERS_NUMBER             10
+
+/* Number of Host Layer Clients */
+#define USB_HOST_CLIENTS_NUMBER               1   
+
+
+/* Number of HID Client driver instances in the application */
+#define USB_HOST_HID_INSTANCES_NUMBER        1
+
+/* Maximum number of INTERRUPT IN endpoints supported per HID interface */
+#define USB_HOST_HID_INTERRUPT_IN_ENDPOINTS_NUMBER 1
+
+/* Number of total usage driver instances registered with HID client driver */
+#define USB_HOST_HID_USAGE_DRIVER_SUPPORT_NUMBER  1
+
+/* Maximum number PUSH items that can be saved in the Global item queue per field
+ * per HID interface */
+#define USB_HID_GLOBAL_PUSH_POP_STACK_SIZE 1
+
+
+
+
+
+
+
+
+
+
+
+#endif // _SYSTEM_CONFIG_H
+/*******************************************************************************
+ End of File
+*/
+
diff --git a/firmware/src/system_config/pic32mx695f512h/system_definitions.h b/firmware/src/system_config/pic32mx695f512h/system_definitions.h
new file mode 100644
index 0000000..c2d8147
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/system_definitions.h
@@ -0,0 +1,136 @@
+/*******************************************************************************
+  System Definitions
+
+  File Name:
+    system_definitions.h
+
+  Summary:
+    MPLAB Harmony project system definitions.
+
+  Description:
+    This file contains the system-wide prototypes and definitions for an MPLAB
+    Harmony project.
+ *******************************************************************************/
+
+//DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+ *******************************************************************************/
+//DOM-IGNORE-END
+
+#ifndef _SYS_DEFINITIONS_H
+#define _SYS_DEFINITIONS_H
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Included Files
+// *****************************************************************************
+// *****************************************************************************
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include "system/common/sys_common.h"
+#include "system/common/sys_module.h"
+#include "system/clk/sys_clk.h"
+#include "system/clk/sys_clk_static.h"
+#include "system/devcon/sys_devcon.h"
+#include "system/int/sys_int.h"
+#include "system/tmr/sys_tmr.h"
+#include "driver/tmr/drv_tmr.h"
+#include "system/ports/sys_ports.h"
+
+
+#include "driver/usb/usbfs/drv_usbfs.h"
+#include "usb/usb_host.h"
+#include "usb/usb_host_hub.h"
+#include "usb/usb_host_hub_interface.h"
+#include "usb/usb_host_hid.h"
+#include "usb/usb_host_hid_keyboard.h"
+#include "app.h"
+
+
+// DOM-IGNORE-BEGIN
+#ifdef __cplusplus  // Provide C++ Compatibility
+
+extern "C" {
+
+#endif
+// DOM-IGNORE-END 
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Type Definitions
+// *****************************************************************************
+// *****************************************************************************
+
+// *****************************************************************************
+/* System Objects
+
+  Summary:
+    Structure holding the system's object handles
+
+  Description:
+    This structure contains the object handles for all objects in the
+    MPLAB Harmony project's system configuration.
+
+  Remarks:
+    These handles are returned from the "Initialize" functions for each module
+    and must be passed into the "Tasks" function for each module.
+*/
+
+typedef struct
+{
+    SYS_MODULE_OBJ  sysDevcon;
+    SYS_MODULE_OBJ  sysTmr;
+    SYS_MODULE_OBJ  drvTmr0;
+    SYS_MODULE_OBJ  drvUSBObject;
+    
+
+    SYS_MODULE_OBJ  usbHostObject0;
+
+
+} SYSTEM_OBJECTS;
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: extern declarations
+// *****************************************************************************
+// *****************************************************************************
+
+extern SYSTEM_OBJECTS sysObj;
+
+
+
+//DOM-IGNORE-BEGIN
+#ifdef __cplusplus
+}
+#endif
+//DOM-IGNORE-END
+
+#endif /* _SYS_DEFINITIONS_H */
+/*******************************************************************************
+ End of File
+*/
+
diff --git a/firmware/src/system_config/pic32mx695f512h/system_exceptions.c b/firmware/src/system_config/pic32mx695f512h/system_exceptions.c
new file mode 100644
index 0000000..73a2380
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/system_exceptions.c
@@ -0,0 +1,143 @@
+/*******************************************************************************
+  MPLAB Harmony Exceptions Source File
+
+  File Name:
+    system_exceptions.c
+
+  Summary:
+    This file contains a function which overrides the deafult _weak_ exception 
+    handler provided by the XC32 compiler.
+
+  Description:
+    This file redefines the default _weak_  exception handler with a more debug
+    friendly one. If an unexpected exception occurs the code will stop in a
+    while(1) loop.  The debugger can be halted and two variables _excep_code and
+    _except_addr can be examined to determine the cause and address where the
+    exception occured.
+ *******************************************************************************/
+
+// DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2013-2015 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+ *******************************************************************************/
+// DOM-IGNORE-END
+
+
+#include <xc.h>                 /* Defines special funciton registers, CP0 regs  */
+#include "system_config.h"
+#include "system_definitions.h"
+#include "system/debug/sys_debug.h"
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Global Data Definitions
+// *****************************************************************************
+// *****************************************************************************
+
+/*******************************************************************************
+  Exception Reason Data
+  
+  <editor-fold defaultstate="expanded" desc="Exception Reason Data">
+  
+  Remarks:
+    These global static items are used instead of local variables in the 
+    _general_exception_handler function because the stack may not be available
+    if an exception has occured.
+*/
+
+/* Code identifying the cause of the exception (CP0 Cause register). */
+static unsigned int _excep_code;
+
+/* Address of instruction that caused the exception. */
+static unsigned int _excep_addr;
+
+/* Pointer to the string describing the cause of the exception. */
+static char *_cause_str;
+
+/* Array identifying the cause (indexed by _exception_code). */
+static char *cause[] = 
+{
+    "Interrupt",
+    "Undefined",
+    "Undefined",
+    "Undefined",
+    "Load/fetch address error",
+    "Store address error",
+    "Instruction bus error",
+    "Data bus error",
+    "Syscall",
+    "Breakpoint",
+    "Reserved instruction",
+    "Coprocessor unusable",
+    "Arithmetic overflow",
+    "Trap",
+    "Reserved",
+    "Reserved",
+    "Reserved",
+    "Reserved",
+    "Reserved"
+};
+
+// </editor-fold>
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Exception Handling
+// *****************************************************************************
+// *****************************************************************************
+
+/*******************************************************************************
+  Function:
+    void _general_exception_handler ( void )
+
+  Summary:
+    Overrides the XC32 _weak_ _generic_exception_handler.
+    
+  Description:
+    This function overrides the XC32 default _weak_ _generic_exception_handler.
+
+  Remarks:
+    Refer to the XC32 User's Guide for additional information.
+ */
+
+void _general_exception_handler ( void )
+{
+    /* Mask off Mask of the ExcCode Field from the Cause Register
+    Refer to the MIPs Software User's manual */
+    _excep_code = (_CP0_GET_CAUSE() & 0x0000007C) >> 2;
+    _excep_addr = _CP0_GET_EPC();
+    _cause_str  = cause[_excep_code];
+
+    SYS_DEBUG_PRINT(SYS_ERROR_ERROR, "\nGeneral Exception %s (cause=%d, addr=%x).\n", 
+                    _cause_str, _excep_code, _excep_addr);
+
+    while (1)
+    {
+        SYS_DEBUG_BreakPoint();
+    }
+}
+
+/*******************************************************************************
+ End of File
+*/
diff --git a/firmware/src/system_config/pic32mx695f512h/system_init.c b/firmware/src/system_config/pic32mx695f512h/system_init.c
new file mode 100644
index 0000000..e709d69
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/system_init.c
@@ -0,0 +1,336 @@
+/*******************************************************************************
+  System Initialization File
+
+  File Name:
+    system_init.c
+
+  Summary:
+    This file contains source code necessary to initialize the system.
+
+  Description:
+    This file contains source code necessary to initialize the system.  It
+    implements the "SYS_Initialize" function, defines the configuration bits, 
+    and allocates any necessary global system resources, such as the 
+    sysObj structure that contains the object handles to all the MPLAB Harmony 
+    module objects in the system.
+ *******************************************************************************/
+
+// DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2013-2015 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+ *******************************************************************************/
+// DOM-IGNORE-END
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Included Files
+// *****************************************************************************
+// *****************************************************************************
+
+#include "system_config.h"
+#include "system_definitions.h"
+
+
+// ****************************************************************************
+// ****************************************************************************
+// Section: Configuration Bits
+// ****************************************************************************
+// ****************************************************************************
+// <editor-fold defaultstate="collapsed" desc="Configuration Bits">
+
+/*** DEVCFG0 ***/
+
+#pragma config DEBUG =      OFF
+#pragma config ICESEL =     ICS_PGx2
+#pragma config PWP =        OFF
+#pragma config BWP =        OFF
+#pragma config CP =         OFF
+
+/*** DEVCFG1 ***/
+
+#pragma config FNOSC =      FRCPLL
+#pragma config FSOSCEN =    ON
+#pragma config IESO =       OFF
+#pragma config POSCMOD =    OFF
+#pragma config OSCIOFNC =   OFF
+#pragma config FPBDIV =     DIV_1
+#pragma config FCKSM =      CSDCMD
+#pragma config WDTPS =      PS1048576
+#pragma config FWDTEN =     OFF
+
+/*** DEVCFG2 ***/
+
+#pragma config FPLLIDIV =   DIV_2
+#pragma config FPLLMUL =    MUL_20
+#pragma config FPLLODIV =   DIV_1
+#pragma config UPLLIDIV =   DIV_2
+#pragma config UPLLEN =     OFF
+
+/*** DEVCFG3 ***/
+
+#pragma config USERID =     0xffff
+#pragma config FSRSSEL =    PRIORITY_7
+#pragma config FMIIEN =     ON
+#pragma config FETHIO =     ON
+#pragma config FUSBIDIO =   ON
+#pragma config FVBUSONIO =  ON
+// </editor-fold>
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Library/Stack Initialization Data
+// *****************************************************************************
+// *****************************************************************************
+
+//<editor-fold defaultstate="collapsed" desc="USB Stack Initialization Data">
+
+// </editor-fold>
+
+//<editor-fold defaultstate="collapsed" desc="USB Host Initialization Data">
+ 
+
+
+/****************************************************
+ * Endpoint Table needed by the controller driver .
+ ****************************************************/
+
+
+uint8_t __attribute__((aligned(512))) endpointTable[32]; 
+
+
+DRV_USBFS_INIT drvUSBFSInit = 
+{
+    .endpointTable = endpointTable,
+    .interruptSource = INT_SOURCE_USB_1,
+    .moduleInit = {SYS_MODULE_POWER_RUN_FULL},
+    .operationMode = DRV_USBFS_OPMODE_HOST,
+    .operationSpeed = USB_SPEED_FULL,
+    .portIndication = NULL,
+    .portOverCurrentDetect = BSP_USBVBUSSwitchOverCurrentDetect,
+    .portPowerEnable = BSP_USBVBUSPowerEnable,
+    .rootHubAvailableCurrent = 500,
+    .stopInIdle = false,
+    .suspendInSleep = false,
+    .usbID = USB_ID_1
+};
+
+
+
+
+USB_HOST_HID_USAGE_DRIVER_INTERFACE usageDriverInterface =
+{
+  .initialize = NULL,
+  .deinitialize = NULL,
+  .usageDriverEventHandler = _USB_HOST_HID_KEYBOARD_EventHandler,
+  .usageDriverTask = _USB_HOST_HID_KEYBOARD_Task
+};
+
+USB_HOST_HID_USAGE_DRIVER_TABLE_ENTRY usageDriverTableEntry[1] =
+{
+    {
+        .usage = USB_HID_GENERIC_DESKTOP_KEYBOARD,
+        .initializeData = NULL,
+        .interface = &usageDriverInterface
+    }
+};
+
+
+USB_HOST_HID_INIT hidInitData =
+{
+    .nUsageDriver = 1,
+    .usageDriverTable = usageDriverTableEntry
+};
+const USB_HOST_TPL_ENTRY USBTPList[ 1 ] =
+{
+	
+
+
+    TPL_INTERFACE_CLASS_SUBCLASS_PROTOCOL(0x03, 0x01, 0x01, &hidInitData,  USB_HOST_HID_INTERFACE) ,
+
+
+
+
+};
+
+const USB_HOST_HCD hcdTable = 
+{
+    .drvIndex = DRV_USBFS_INDEX_0,
+    .hcdInterface = DRV_USBFS_HOST_INTERFACE
+};
+
+
+const USB_HOST_INIT usbHostInitData = 
+{
+    .nTPLEntries = 1 ,
+    .tplList = (USB_HOST_TPL_ENTRY *)USBTPList,
+    .hostControllerDrivers = (USB_HOST_HCD *)&hcdTable
+    
+};
+
+
+
+
+
+
+// </editor-fold>
+
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Driver Initialization Data
+// *****************************************************************************
+// *****************************************************************************
+
+//<editor-fold defaultstate="collapsed" desc="DRV_Timer Initialization Data">
+
+/*** TMR Driver Initialization Data ***/
+
+const DRV_TMR_INIT drvTmr0InitData =
+{
+    .moduleInit.sys.powerState = DRV_TMR_POWER_STATE_IDX0,
+    .tmrId = DRV_TMR_PERIPHERAL_ID_IDX0,
+    .clockSource = DRV_TMR_CLOCK_SOURCE_IDX0, 
+    .prescale = DRV_TMR_PRESCALE_IDX0,
+    .mode = DRV_TMR_OPERATION_MODE_IDX0,
+    .interruptSource = DRV_TMR_INTERRUPT_SOURCE_IDX0,
+    .asyncWriteEnable = false,
+};
+// </editor-fold>
+//<editor-fold defaultstate="collapsed" desc="SYS_TMR Initialization Data">
+/*** TMR Service Initialization Data ***/
+const SYS_TMR_INIT sysTmrInitData =
+{
+    .moduleInit = {SYS_MODULE_POWER_RUN_FULL},
+    .drvIndex = DRV_TMR_INDEX_0,
+    .tmrFreq = 1000, 
+};
+
+// </editor-fold>
+//<editor-fold defaultstate="collapsed" desc="DRV_USB Initialization Data">
+// </editor-fold>
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: System Data
+// *****************************************************************************
+// *****************************************************************************
+
+/* Structure to hold the object handles for the modules in the system. */
+SYSTEM_OBJECTS sysObj;
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Module Initialization Data
+// *****************************************************************************
+// *****************************************************************************
+
+/*******************************************************************************
+  Device Control System Service Initialization Data
+  
+  <editor-fold defaultstate="collapsed" 
+  desc="Device Control System Service Initialization Data">
+*/
+
+const SYS_DEVCON_INIT sysDevconInit =
+{
+    .moduleInit = {0},
+};
+
+// </editor-fold>
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Static Initialization Functions
+// *****************************************************************************
+// *****************************************************************************
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: System Initialization
+// *****************************************************************************
+// *****************************************************************************
+
+/*******************************************************************************
+  Function:
+    void SYS_Initialize ( SYS_INIT_DATA *data )
+
+  Summary:
+    Initializes the board, services, drivers, application and other modules.
+
+  Remarks:
+    See prototype in system/common/sys_module.h.
+ */
+
+void SYS_Initialize ( void* data )
+{
+    /* Core Processor Initialization */
+    SYS_CLK_Initialize( NULL );
+    sysObj.sysDevcon = SYS_DEVCON_Initialize(SYS_DEVCON_INDEX_0, (SYS_MODULE_INIT*)&sysDevconInit);
+    SYS_DEVCON_PerformanceConfig(SYS_CLK_SystemFrequencyGet());
+    SYS_DEVCON_JTAGDisable();
+    SYS_PORTS_Initialize();
+
+    /* Initialize Drivers */
+
+    sysObj.drvTmr0 = DRV_TMR_Initialize(DRV_TMR_INDEX_0, (SYS_MODULE_INIT *)&drvTmr0InitData);
+
+    SYS_INT_VectorPrioritySet(INT_VECTOR_T1, INT_PRIORITY_LEVEL1);
+    SYS_INT_VectorSubprioritySet(INT_VECTOR_T1, INT_SUBPRIORITY_LEVEL0);
+ 
+ 
+ 
+    /* Initialize System Services */
+    SYS_INT_Initialize();  
+
+    /*** TMR Service Initialization Code ***/
+    sysObj.sysTmr  = SYS_TMR_Initialize(SYS_TMR_INDEX_0, (const SYS_MODULE_INIT  * const)&sysTmrInitData);
+
+    /* Initialize Middleware */
+
+
+     sysObj.usbHostObject0 = USB_HOST_Initialize (( SYS_MODULE_INIT *)& usbHostInitData );
+    sysObj.drvUSBObject = DRV_USBFS_Initialize(DRV_USBFS_INDEX_0, (SYS_MODULE_INIT *)&drvUSBFSInit);
+	
+    
+	SYS_INT_VectorPrioritySet(INT_VECTOR_USB1, INT_PRIORITY_LEVEL4);
+    SYS_INT_VectorSubprioritySet(INT_VECTOR_USB1, INT_SUBPRIORITY_LEVEL0);
+
+
+
+    /* Enable Global Interrupts */
+    SYS_INT_Enable();
+
+    /* Initialize the Application */
+    APP_Initialize();
+}
+
+
+/*******************************************************************************
+ End of File
+*/
+
diff --git a/firmware/src/system_config/pic32mx695f512h/system_interrupt.c b/firmware/src/system_config/pic32mx695f512h/system_interrupt.c
new file mode 100644
index 0000000..4d35043
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/system_interrupt.c
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ System Interrupts File
+
+  File Name:
+    system_int.c
+
+  Summary:
+    Raw ISR definitions.
+
+  Description:
+    This file contains a definitions of the raw ISRs required to support the
+    interrupt sub-system.
+
+  Summary:
+    This file contains source code for the interrupt vector functions in the
+    system.
+
+  Description:
+    This file contains source code for the interrupt vector functions in the
+    system.  It implements the system and part specific vector "stub" functions
+    from which the individual "Tasks" functions are called for any modules
+    executing interrupt-driven in the MPLAB Harmony system.
+
+  Remarks:
+    This file requires access to the systemObjects global data structure that
+    contains the object handles to all MPLAB Harmony module objects executing
+    interrupt-driven in the system.  These handles are passed into the individual
+    module "Tasks" functions to identify the instance of the module to maintain.
+ *******************************************************************************/
+
+// DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2011-2014 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+ *******************************************************************************/
+// DOM-IGNORE-END
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Included Files
+// *****************************************************************************
+// *****************************************************************************
+
+#include <xc.h>
+#include <sys/attribs.h>
+#include "app.h"
+#include "system_definitions.h"
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: System Interrupt Vector Functions
+// *****************************************************************************
+// *****************************************************************************
+void __ISR(_TIMER_1_VECTOR, ipl1AUTO) _IntHandlerDrvTmrInstance0(void)
+{
+
+    DRV_TMR_Tasks_ISR(sysObj.drvTmr0);
+
+}
+ void __ISR( _USB_1_VECTOR , IPL4AUTO)_IntHandler_USB_stub ( void )
+{
+    DRV_USBFS_Tasks_ISR(sysObj.drvUSBObject);
+}
+
+
+ 
+/*******************************************************************************
+ End of File
+*/
+
diff --git a/firmware/src/system_config/pic32mx695f512h/system_tasks.c b/firmware/src/system_config/pic32mx695f512h/system_tasks.c
new file mode 100644
index 0000000..c1d4b28
--- /dev/null
+++ b/firmware/src/system_config/pic32mx695f512h/system_tasks.c
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ System Tasks File
+
+  File Name:
+    system_tasks.c
+
+  Summary:
+    This file contains source code necessary to maintain system's polled state
+    machines.
+
+  Description:
+    This file contains source code necessary to maintain system's polled state
+    machines.  It implements the "SYS_Tasks" function that calls the individual
+    "Tasks" functions for all polled MPLAB Harmony modules in the system.
+
+  Remarks:
+    This file requires access to the systemObjects global data structure that
+    contains the object handles to all MPLAB Harmony module objects executing
+    polled in the system.  These handles are passed into the individual module
+    "Tasks" functions to identify the instance of the module to maintain.
+ *******************************************************************************/
+
+// DOM-IGNORE-BEGIN
+/*******************************************************************************
+Copyright (c) 2013-2015 released Microchip Technology Inc.  All rights reserved.
+
+Microchip licenses to you the right to use, modify, copy and distribute
+Software only when embedded on a Microchip microcontroller or digital signal
+controller that is integrated into your product or third party product
+(pursuant to the sublicense terms in the accompanying license agreement).
+
+You should refer to the license agreement accompanying this Software for
+additional information regarding your rights and obligations.
+
+SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
+CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
+OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
+INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
+CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
+SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
+(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
+ *******************************************************************************/
+// DOM-IGNORE-END
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: Included Files
+// *****************************************************************************
+// *****************************************************************************
+
+#include "system_config.h"
+#include "system_definitions.h"
+
+
+// *****************************************************************************
+// *****************************************************************************
+// Section: System "Tasks" Routine
+// *****************************************************************************
+// *****************************************************************************
+
+/*******************************************************************************
+  Function:
+    void SYS_Tasks ( void )
+
+  Remarks:
+    See prototype in system/common/sys_module.h.
+*/
+
+void SYS_Tasks ( void )
+{
+    /* Maintain system services */
+    SYS_DEVCON_Tasks(sysObj.sysDevcon);
+    SYS_TMR_Tasks(sysObj.sysTmr);
+
+    /* Maintain Device Drivers */
+        DRV_TMR_Tasks(sysObj.drvTmr0);
+
+    /* Maintain Middleware & Other Libraries */
+
+ 
+        /* USBFS Driver Task Routine */ 
+         DRV_USBFS_Tasks(sysObj.drvUSBObject);
+		
+         
+ 
+        /* USB Host layer task routine.*/
+        USB_HOST_Tasks(sysObj.usbHostObject0);
+
+ 
+
+
+    /* Maintain the application's state machine. */
+    APP_Tasks();
+}
+
+
+/*******************************************************************************
+ End of File
+ */
+
-- 
cgit v1.2.3