@@ -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" ) |
@@ -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 |
@@ -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}" | |||
) |
@@ -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() |
@@ -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> |
@@ -34,7 +34,7 @@ | |||
// ARM | |||
#if defined(_mk20dx128_) || defined(_mk20dx256_) | |||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||
#include <Lib/mk20dx.h> | |||
@@ -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> |
@@ -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> |
@@ -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 @@ 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) ; | |||
} |
@@ -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 |
@@ -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 | |||
} |
@@ -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 |