Mercurial > louis > kiibohd-controller
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