]> git.donarmstrong.com Git - kiibohd-controller.git/commitdiff
Initial work for McHCK mk20dx128vlf5 port.
authorJacob Alexander <haata@kiibohd.com>
Sun, 15 Jun 2014 18:09:08 +0000 (11:09 -0700)
committerJacob Alexander <haata@kiibohd.com>
Sat, 28 Jun 2014 20:55:25 +0000 (13:55 -0700)
12 files changed:
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

index 304fde5800ae19f9c1f04082950014e7c8b788e8..4ec941c0e1377a23867bff0a20f821f1fd77a082 100644 (file)
@@ -20,8 +20,9 @@ set( CHIP
 #      "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 @@ include( Lib/CMake/initialize.cmake )
 #| 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" )
index c8e5ce6476585b10a4178f8ad7b1cb76a4cec246..a0d15bc8c42a7a16cbfb59fe2e791f223fe52485 100644 (file)
@@ -25,7 +25,7 @@ set( _CMAKE_TOOLCHAIN_PREFIX arm-none-eabi- )
 
 #| 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 @@ set( MCU "${CHIP}" ) # For loading script compatibility
 
 #| 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 @@ endif ()
 #| 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( STATUS "Compiler Source Files:" )
 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( TUNING "-mthumb -nostdlib -fdata-sections -ffunction-sections -fshort-wchar
 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 @@ set( LINKER_FLAGS "-mcpu=${CPU} -Wl,-Map=${TARGET}.map,--cref -Wl,--gc-sections
 
 
 #| 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
index 59eedde6d5d16e5c8e61578e923dad374797a2d1..b73b3b694dfab66d08728afa979cbcb96507a767 100644 (file)
@@ -286,8 +286,16 @@ set_target_properties( ${TARGET_ELF} PROPERTIES
 )
 
 
+#| 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 @@ add_custom_command( TARGET ${TARGET_ELF} POST_BUILD
 
 #| 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}"
 )
index 127e3440d2c9541fbaf43a45dafa1328edb58621..9348c3641f7c8d89ab69757570bf814087082223 100644 (file)
@@ -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()
index cce75b193300148463d11055ae2c3282b9bddd6d..e5e9832fb98f285575bea295e7abac86fa0d7216 100644 (file)
@@ -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>
index 507b4d25153bc4a12cf42da1fa65d1effa8aa428..193e101e45e62fe5745137201effa88f6a15b4fc 100644 (file)
@@ -34,7 +34,7 @@
 
 
 // ARM
-#if defined(_mk20dx128_) || defined(_mk20dx256_)
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_)
 
 #include <Lib/mk20dx.h>
 
index d495e0c2dd7b436622fc4bc34f9e59b435ed0208..8eaf08314505b1a454f1f2ad138ff88379c81164 100644 (file)
@@ -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>
index f8de05447562576a6506e542f511848ee3fec5c2..feecde9ba4446284870ad8c08e05b64050ace866 100644 (file)
@@ -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>
index c6f8750b1a120d7a92f9eda0b9af97529cb77f05..f38ee57ea921ae5ec5a1d63f12f5b2ba5883a765 100644 (file)
@@ -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
  * 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 @@ void (* const gVectors[])(void) =
        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 @@ void startup_late_hook(void)               __attribute__ ((weak, alias("startup_unused_hook")
 __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 @@ void ResetHandler(void)
        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 @@ void ResetHandler(void)
        }
 */
        startup_late_hook();
+#endif
        main();
        while (1) ;
 }
index 6c4fb874db2b1a754f90a5cb44fc7e5905c4aa85..685161a17b7bbd5030231a00edde69e9591e1e51 100644 (file)
@@ -1795,7 +1795,7 @@ typedef struct {
 #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
index 03c0015995c3b5d27fc5de8f2b162f41ae2e06d0..addb91873e30388e8c56630722bf97d31beafa6f 100644 (file)
@@ -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 @@ inline void Output_firmwareReload()
 {
 #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 @@ inline int Output_getchar()
 #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 @@ inline int Output_putstr( char* str )
 {
 #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 @@ inline void Output_softReset()
 {
 #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
 }
diff --git a/main.c b/main.c
index fec612cd1f4a70187d0ecf79454cdd75a8fdde08..08dc08ec5f26f92ef623ff81c8afd7cf2be7ef06 100644 (file)
--- a/main.c
+++ b/main.c
@@ -94,7 +94,7 @@ inline void pinSetup(void)
        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 @@ inline void usbTimerSetup(void)
        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 @@ int main(void)
 // 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 @@ void pit0_isr(void)
                sendKeypresses = 1;
        }
 
-#if defined(_mk20dx128_) // ARM
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM
        // Clear the interrupt flag
        PIT_TFLG0 = 1;
 #endif