changeset 169:7962a42dbda0

Initial work for McHCK mk20dx128vlf5 port.
author Jacob Alexander <haata@kiibohd.com>
date Sun, 15 Jun 2014 11:09:08 -0700
parents 9634b9824391
children 85d74e5e1a95
files CMakeLists.txt Lib/CMake/arm.cmake Lib/CMake/modules.cmake Lib/Interrupts.h Lib/MacroLib.h Lib/MainLib.h Lib/OutputLib.h Lib/ScanLib.h Lib/mk20dx.c Lib/mk20dx.h Output/pjrcUSB/output_com.c main.c
diffstat 12 files changed, 89 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Sat Jun 28 13:48:49 2014 -0700
+++ b/CMakeLists.txt	Sun Jun 15 11:09:08 2014 -0700
@@ -20,8 +20,9 @@
 #	"at90usb162"       # Teensy   1.0 (avr)
 #	"atmega32u4"       # Teensy   2.0 (avr)
 #	"at90usb646"       # Teensy++ 1.0 (avr)
-	"at90usb1286"      # Teensy++ 2.0 (avr)
+#	"at90usb1286"      # Teensy++ 2.0 (avr)
 #	"mk20dx128"        # Teensy   3.0 (arm)
+	"mk20dx128vlf5"    # McHCK    mk20dx128vlf5
 #	"mk20dx256"        # Teensy   3.1 (arm)
 )
 
@@ -46,7 +47,7 @@
 #| Please look at the {Scan,Macro,Output,Debug} for information on the modules and how to create new ones
 
 ##| Deals with acquiring the keypress information and turning it into a key index
-set(   ScanModule "DPH" )
+set(   ScanModule "MDPure" )
 
 ##| Provides the mapping functions for DefaultMap and handles any macro processing before sending to the OutputModule
 set(  MacroModule "PartialMap" )
--- a/Lib/CMake/arm.cmake	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/CMake/arm.cmake	Sun Jun 15 11:09:08 2014 -0700
@@ -25,7 +25,7 @@
 
 #| Chip Name (Linker)
 #|
-#| "mk20dx128"        # Teensy   3.0
+#| "mk20dx128"        # Teensy   3.0 and McHCK mk20dx128
 #| "mk20dx256"        # Teensy   3.1
 
 message( STATUS "Chip Selected:" )
@@ -35,7 +35,7 @@
 
 #| Chip Size Database
 #| Teensy 3.0
-if ( "${CHIP}" MATCHES "mk20dx128" )
+if ( "${CHIP}" MATCHES "mk20dx128" OR "${CHIP}" MATCHES "mk20dx128vlf5" )
 	set( SIZE_RAM    16384 )
 	set( SIZE_FLASH 131072 )
 
@@ -65,7 +65,7 @@
 #| You _MUST_ set this to match the board you are using
 #| type "make clean" after changing this, so all files will be rebuilt
 #|
-#| "cortex-m4"        # Teensy   3.0, 3.1
+#| "cortex-m4"        # Teensy   3.0, 3.1, McHCK
 set( CPU "cortex-m4" )
 
 message( STATUS "CPU Selected:" )
@@ -83,9 +83,14 @@
 message( "${COMPILER_SRCS}" )
 
 
-#| USB Defines
-set( VENDOR_ID  "0x16C0" )
-set( PRODUCT_ID "0x0487" )
+#| USB Defines, this is how the loader programs detect which type of chip base is used
+if ( "${CHIP}" MATCHES "mk20dx128" OR "${CHIP}" MATCHES "mk20dx256" )
+	set( VENDOR_ID  "0x16C0" )
+	set( PRODUCT_ID "0x0487" )
+elseif ( "${CHIP}" MATCHES "mk20dx128vlf5" )
+	set( VENDOR_ID  "0x2323" )
+	set( PRODUCT_ID "0x0001" )
+endif ()
 
 
 #| Compiler flag to set the C Standard level.
@@ -113,11 +118,6 @@
 set( OPT "s" )
 
 
-#| Output Format
-#| srec, ihex, binary
-set( FORMAT "ihex" )
-
-
 #| Processor frequency.
 #|   Normally the first thing your program should do is set the clock prescaler,
 #|   so your program will run at the correct speed.  You should also set this
@@ -140,7 +140,11 @@
 
 
 #| Hex Flags (XXX, CMake seems to have issues if you quote the arguments for the custom commands...)
-set( HEX_FLAGS -O ${FORMAT} -R .eeprom )
+set( HEX_FLAGS -O ihex -R .eeprom )
+
+
+#| Binary Flags
+set( BIN_FLAGS -O binary )
 
 
 #| Lss Flags
--- a/Lib/CMake/modules.cmake	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/CMake/modules.cmake	Sun Jun 15 11:09:08 2014 -0700
@@ -286,8 +286,16 @@
 )
 
 
+#| Convert the .ELF into a .bin to load onto the McHCK
+set( TARGET_BIN ${TARGET}.dfu.bin )
+add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
+	COMMAND ${CMAKE_OBJCOPY} ${BIN_FLAGS} ${TARGET_ELF} ${TARGET_BIN}
+	COMMENT "Creating binary file to load:  ${TARGET_BIN}"
+)
+
+
 #| Convert the .ELF into a .HEX to load onto the Teensy
-set( TARGET_HEX ${TARGET}.hex )
+set( TARGET_HEX ${TARGET}.teensy.hex )
 add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
 	COMMAND ${CMAKE_OBJCOPY} ${HEX_FLAGS} ${TARGET_ELF} ${TARGET_HEX}
 	COMMENT "Creating iHex file to load:    ${TARGET_HEX}"
@@ -323,8 +331,8 @@
 
 #| After Changes Size Information
 add_custom_target( SizeAfter ALL
-	COMMAND ${CMAKE_SOURCE_DIR}/Lib/CMake/sizeCalculator ${CMAKE_SIZE} ${FORMAT} ${TARGET_ELF} ${SIZE_RAM}   " SRAM"
-	COMMAND ${CMAKE_SOURCE_DIR}/Lib/CMake/sizeCalculator ${CMAKE_SIZE} ${FORMAT} ${TARGET_HEX} ${SIZE_FLASH} "Flash"
+	COMMAND ${CMAKE_SOURCE_DIR}/Lib/CMake/sizeCalculator ${CMAKE_SIZE} ihex ${TARGET_ELF} ${SIZE_RAM}   " SRAM"
+	COMMAND ${CMAKE_SOURCE_DIR}/Lib/CMake/sizeCalculator ${CMAKE_SIZE} ihex ${TARGET_HEX} ${SIZE_FLASH} "Flash"
 	DEPENDS ${TARGET_ELF}
 	COMMENT "Chip usage for ${CHIP}"
 )
--- a/Lib/Interrupts.h	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/Interrupts.h	Sun Jun 15 11:09:08 2014 -0700
@@ -29,7 +29,7 @@
 #define __INTERRUPTS_H
 
 // ARM
-#if defined(_mk20dx128_) || defined(_mk20dx256_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 
 #include <Lib/mk20dx.h>
 
@@ -45,7 +45,7 @@
 // ----- Defines -----
 
 // ARM
-#if defined(_mk20dx128_) || defined(_mk20dx256_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 
 // Map the Interrupt Enable/Disable to the AVR names
 #define cli() __disable_irq()
--- a/Lib/MacroLib.h	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/MacroLib.h	Sun Jun 15 11:09:08 2014 -0700
@@ -34,7 +34,7 @@
 
 
 // ARM
-#if defined(_mk20dx128_) || defined(_mk20dx256_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 
 #include <Lib/mk20dx.h>
 #include <Lib/delay.h>
--- a/Lib/MainLib.h	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/MainLib.h	Sun Jun 15 11:09:08 2014 -0700
@@ -34,7 +34,7 @@
 
 
 // ARM
-#if defined(_mk20dx128_) || defined(_mk20dx256_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 
 #include <Lib/mk20dx.h>
 
--- a/Lib/OutputLib.h	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/OutputLib.h	Sun Jun 15 11:09:08 2014 -0700
@@ -30,7 +30,7 @@
 // ----- Includes -----
 
 // ARM
-#if defined(_mk20dx128_) || defined(_mk20dx256_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 
 #include <Lib/mk20dx.h>
 #include <Lib/delay.h>
--- a/Lib/ScanLib.h	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/ScanLib.h	Sun Jun 15 11:09:08 2014 -0700
@@ -34,7 +34,7 @@
 
 
 // ARM
-#if defined(_mk20dx128_) || defined(_mk20dx256_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 
 #include <Lib/mk20dx.h>
 #include <Lib/delay.h>
--- a/Lib/mk20dx.c	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/mk20dx.c	Sun Jun 15 11:09:08 2014 -0700
@@ -1,6 +1,7 @@
 /* Teensyduino Core Library
  * http://www.pjrc.com/teensy/
  * Copyright (c) 2013 PJRC.COM, LLC.
+ * Modifications by Jacob Alexander 2014
  *
  * Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
@@ -10,10 +11,10 @@
  * permit persons to whom the Software is furnished to do so, subject to
  * the following conditions:
  *
- * 1. The above copyright notice and this permission notice shall be 
+ * 1. The above copyright notice and this permission notice shall be
  * included in all copies or substantial portions of the Software.
  *
- * 2. If the Software is incorporated into a build system that allows 
+ * 2. If the Software is incorporated into a build system that allows
  * selection among a list of target devices, then similar target
  * devices manufactured by PJRC.COM must be included in the list of
  * target devices and selectable in the same manner.
@@ -183,7 +184,7 @@
 	fault_isr,					// 13 --
 	pendablesrvreq_isr,				// 14 ARM: Pendable req serv(PendableSrvReq)
 	systick_isr,					// 15 ARM: System tick timer (SysTick)
-#if defined(_mk20dx128_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_)
 	dma_ch0_isr,					// 16 DMA channel 0 transfer complete
 	dma_ch1_isr,					// 17 DMA channel 1 transfer complete
 	dma_ch2_isr,					// 18 DMA channel 2 transfer complete
@@ -358,6 +359,43 @@
 __attribute__ ((section(".startup")))
 void ResetHandler(void)
 {
+#if defined(_mk20dx128vlf5_)
+	/* Disable Watchdog */
+	WDOG_UNLOCK = WDOG_UNLOCK_SEQ1;
+	WDOG_UNLOCK = WDOG_UNLOCK_SEQ2;
+	WDOG_STCTRLH = WDOG_STCTRLH_ALLOWUPDATE;
+
+        /* FLL at 48MHz */
+	MCG_C4 = MCG_C4_DMX32 | MCG_C4_DRST_DRS(1);
+	/*
+        MCG.c4.raw = ((struct MCG_C4_t){
+                        .drst_drs = MCG_DRST_DRS_MID,
+                        .dmx32 = 1
+                }).raw;
+	*/
+	SIM_SOPT2 = SIM_SOPT2_PLLFLLSEL;
+
+	// release I/O pins hold, if we woke up from VLLS mode
+	if (PMC_REGSC & PMC_REGSC_ACKISO) PMC_REGSC |= PMC_REGSC_ACKISO;
+
+	uint32_t *src = &_etext;
+	uint32_t *dest = &_sdata;
+	unsigned int i;
+
+	while (dest < &_edata) *dest++ = *src++;
+	dest = &_sbss;
+	while (dest < &_ebss) *dest++ = 0;
+	SCB_VTOR = 0;	// use vector table in flash
+
+	// default all interrupts to medium priority level
+	for (i=0; i < NVIC_NUM_INTERRUPTS; i++) NVIC_SET_PRIORITY(i, 128);
+
+	__enable_irq();
+	__libc_init_array();
+
+        //memcpy(&_sdata, &_sidata, (uintptr_t)&_edata - (uintptr_t)&_sdata);
+        //memset(&_sbss, 0, (uintptr_t)&_ebss - (uintptr_t)&_sbss);
+#else
 	uint32_t *src = &_etext;
 	uint32_t *dest = &_sdata;
 	unsigned int i;
@@ -368,7 +406,7 @@
 	startup_early_hook();
 
 	// enable clocks to always-used peripherals
-#if defined(_mk20dx128_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_)
 	SIM_SCGC5 = 0x00043F82;		// clocks active to all GPIO
 	SIM_SCGC6 = SIM_SCGC6_RTC | SIM_SCGC6_FTM0 | SIM_SCGC6_FTM1 | SIM_SCGC6_ADC0 | SIM_SCGC6_FTFL;
 #elif defined(_mk20dx256_)
@@ -458,6 +496,7 @@
 	}
 */
 	startup_late_hook();
+#endif
 	main();
 	while (1) ;
 }
--- a/Lib/mk20dx.h	Sat Jun 28 13:48:49 2014 -0700
+++ b/Lib/mk20dx.h	Sun Jun 15 11:09:08 2014 -0700
@@ -1795,7 +1795,7 @@
 #define NVIC_SET_PRIORITY(irqnum, priority)  (*((volatile uint8_t *)0xE000E400 + (irqnum)) = (uint8_t)(priority))
 #define NVIC_GET_PRIORITY(irqnum) (*((uint8_t *)0xE000E400 + (irqnum)))
 
-#if defined(_mk20dx128_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_)
 #define IRQ_DMA_CH0		0
 #define IRQ_DMA_CH1		1
 #define IRQ_DMA_CH2		2
--- a/Output/pjrcUSB/output_com.c	Sat Jun 28 13:48:49 2014 -0700
+++ b/Output/pjrcUSB/output_com.c	Sun Jun 15 11:09:08 2014 -0700
@@ -32,7 +32,7 @@
 // USB Includes
 #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
 #include "avr/usb_keyboard_serial.h"
-#elif defined(_mk20dx128_) || defined(_mk20dx256_)
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 #include "arm/usb_dev.h"
 #include "arm/usb_keyboard.h"
 #include "arm/usb_serial.h"
@@ -140,7 +140,7 @@
 {
 #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
 	usb_debug_reload();
-#elif defined(_mk20dx128_) || defined(_mk20dx256_)
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 	usb_device_reload();
 #endif
 }
@@ -159,7 +159,7 @@
 #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
 	// XXX Make sure to check output_availablechar() first! Information is lost with the cast (error codes)
 	return (int)usb_serial_getchar();
-#elif defined(_mk20dx128_) || defined(_mk20dx256_)
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 	return usb_serial_getchar();
 #endif
 }
@@ -177,7 +177,7 @@
 {
 #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR
 	uint16_t count = 0;
-#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM
 	uint32_t count = 0;
 #endif
 	// Count characters until NULL character, then send the amount counted
@@ -193,7 +193,7 @@
 {
 #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
 	usb_debug_software_reset();
-#elif defined(_mk20dx128_) || defined(_mk20dx256_)
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 	SOFTWARE_RESET();
 #endif
 }
--- a/main.c	Sat Jun 28 13:48:49 2014 -0700
+++ b/main.c	Sun Jun 15 11:09:08 2014 -0700
@@ -94,7 +94,7 @@
 	PORTF = 0x00;
 
 // ARM
-#elif defined(_mk20dx128_)
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM
 	// TODO - Should be cleared, but not that necessary due to the pin layout
 #endif
 }
@@ -115,7 +115,7 @@
 	TIMSK0 = (1 << TOIE0);
 
 // ARM
-#elif defined(_mk20dx128_)
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM
 	// 48 MHz clock by default
 
 	// System Clock Gating Register Disable
@@ -184,7 +184,7 @@
 // USB Keyboard Data Send Counter Interrupt
 #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR
 ISR( TIMER0_OVF_vect )
-#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM
 void pit0_isr(void)
 #endif
 {
@@ -194,7 +194,7 @@
 		sendKeypresses = 1;
 	}
 
-#if defined(_mk20dx128_) // ARM
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM
 	// Clear the interrupt flag
 	PIT_TFLG0 = 1;
 #endif