# "at90usb162" # Teensy 1.0 (avr) | # "at90usb162" # Teensy 1.0 (avr) | ||||
# "atmega32u4" # Teensy 2.0 (avr) | # "atmega32u4" # Teensy 2.0 (avr) | ||||
# "at90usb646" # Teensy++ 1.0 (avr) | # "at90usb646" # Teensy++ 1.0 (avr) | ||||
"at90usb1286" # Teensy++ 2.0 (avr) | |||||
# "at90usb1286" # Teensy++ 2.0 (avr) | |||||
# "mk20dx128" # Teensy 3.0 (arm) | # "mk20dx128" # Teensy 3.0 (arm) | ||||
"mk20dx128vlf5" # McHCK mk20dx128vlf5 | |||||
# "mk20dx256" # Teensy 3.1 (arm) | # "mk20dx256" # Teensy 3.1 (arm) | ||||
) | ) | ||||
#| Please look at the {Scan,Macro,Output,Debug} for information on the modules and how to create new ones | #| 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 | ##| 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 | ##| Provides the mapping functions for DefaultMap and handles any macro processing before sending to the OutputModule | ||||
set( MacroModule "PartialMap" ) | set( MacroModule "PartialMap" ) |
#| Chip Name (Linker) | #| Chip Name (Linker) | ||||
#| | #| | ||||
#| "mk20dx128" # Teensy 3.0 | |||||
#| "mk20dx128" # Teensy 3.0 and McHCK mk20dx128 | |||||
#| "mk20dx256" # Teensy 3.1 | #| "mk20dx256" # Teensy 3.1 | ||||
message( STATUS "Chip Selected:" ) | message( STATUS "Chip Selected:" ) | ||||
#| Chip Size Database | #| Chip Size Database | ||||
#| Teensy 3.0 | #| Teensy 3.0 | ||||
if ( "${CHIP}" MATCHES "mk20dx128" ) | |||||
if ( "${CHIP}" MATCHES "mk20dx128" OR "${CHIP}" MATCHES "mk20dx128vlf5" ) | |||||
set( SIZE_RAM 16384 ) | set( SIZE_RAM 16384 ) | ||||
set( SIZE_FLASH 131072 ) | set( SIZE_FLASH 131072 ) | ||||
#| You _MUST_ set this to match the board you are using | #| You _MUST_ set this to match the board you are using | ||||
#| type "make clean" after changing this, so all files will be rebuilt | #| 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" ) | set( CPU "cortex-m4" ) | ||||
message( STATUS "CPU Selected:" ) | message( STATUS "CPU Selected:" ) | ||||
message( "${COMPILER_SRCS}" ) | 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. | #| Compiler flag to set the C Standard level. | ||||
set( OPT "s" ) | set( OPT "s" ) | ||||
#| Output Format | |||||
#| srec, ihex, binary | |||||
set( FORMAT "ihex" ) | |||||
#| Processor frequency. | #| Processor frequency. | ||||
#| Normally the first thing your program should do is set the clock prescaler, | #| 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 | #| so your program will run at the correct speed. You should also set this | ||||
#| Hex Flags (XXX, CMake seems to have issues if you quote the arguments for the custom commands...) | #| 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 | #| Lss Flags |
) | ) | ||||
#| 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 | #| 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 | add_custom_command( TARGET ${TARGET_ELF} POST_BUILD | ||||
COMMAND ${CMAKE_OBJCOPY} ${HEX_FLAGS} ${TARGET_ELF} ${TARGET_HEX} | COMMAND ${CMAKE_OBJCOPY} ${HEX_FLAGS} ${TARGET_ELF} ${TARGET_HEX} | ||||
COMMENT "Creating iHex file to load: ${TARGET_HEX}" | COMMENT "Creating iHex file to load: ${TARGET_HEX}" | ||||
#| After Changes Size Information | #| After Changes Size Information | ||||
add_custom_target( SizeAfter ALL | 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} | DEPENDS ${TARGET_ELF} | ||||
COMMENT "Chip usage for ${CHIP}" | COMMENT "Chip usage for ${CHIP}" | ||||
) | ) |
#define __INTERRUPTS_H | #define __INTERRUPTS_H | ||||
// ARM | // ARM | ||||
#if defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
#include <Lib/mk20dx.h> | #include <Lib/mk20dx.h> | ||||
// ----- Defines ----- | // ----- Defines ----- | ||||
// ARM | // ARM | ||||
#if defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
// Map the Interrupt Enable/Disable to the AVR names | // Map the Interrupt Enable/Disable to the AVR names | ||||
#define cli() __disable_irq() | #define cli() __disable_irq() |
// ARM | // ARM | ||||
#if defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
#include <Lib/mk20dx.h> | #include <Lib/mk20dx.h> | ||||
#include <Lib/delay.h> | #include <Lib/delay.h> |
// ARM | // ARM | ||||
#if defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
#include <Lib/mk20dx.h> | #include <Lib/mk20dx.h> | ||||
// ----- Includes ----- | // ----- Includes ----- | ||||
// ARM | // ARM | ||||
#if defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
#include <Lib/mk20dx.h> | #include <Lib/mk20dx.h> | ||||
#include <Lib/delay.h> | #include <Lib/delay.h> |
// ARM | // ARM | ||||
#if defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
#include <Lib/mk20dx.h> | #include <Lib/mk20dx.h> | ||||
#include <Lib/delay.h> | #include <Lib/delay.h> |
/* Teensyduino Core Library | /* Teensyduino Core Library | ||||
* http://www.pjrc.com/teensy/ | * http://www.pjrc.com/teensy/ | ||||
* Copyright (c) 2013 PJRC.COM, LLC. | * Copyright (c) 2013 PJRC.COM, LLC. | ||||
* Modifications by Jacob Alexander 2014 | |||||
* | * | ||||
* Permission is hereby granted, free of charge, to any person obtaining | * Permission is hereby granted, free of charge, to any person obtaining | ||||
* a copy of this software and associated documentation files (the | * a copy of this software and associated documentation files (the | ||||
* permit persons to whom the Software is furnished to do so, subject to | * permit persons to whom the Software is furnished to do so, subject to | ||||
* the following conditions: | * 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. | * 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 | * selection among a list of target devices, then similar target | ||||
* devices manufactured by PJRC.COM must be included in the list of | * devices manufactured by PJRC.COM must be included in the list of | ||||
* target devices and selectable in the same manner. | * target devices and selectable in the same manner. | ||||
fault_isr, // 13 -- | fault_isr, // 13 -- | ||||
pendablesrvreq_isr, // 14 ARM: Pendable req serv(PendableSrvReq) | pendablesrvreq_isr, // 14 ARM: Pendable req serv(PendableSrvReq) | ||||
systick_isr, // 15 ARM: System tick timer (SysTick) | 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_ch0_isr, // 16 DMA channel 0 transfer complete | ||||
dma_ch1_isr, // 17 DMA channel 1 transfer complete | dma_ch1_isr, // 17 DMA channel 1 transfer complete | ||||
dma_ch2_isr, // 18 DMA channel 2 transfer complete | dma_ch2_isr, // 18 DMA channel 2 transfer complete | ||||
__attribute__ ((section(".startup"))) | __attribute__ ((section(".startup"))) | ||||
void ResetHandler(void) | 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 *src = &_etext; | ||||
uint32_t *dest = &_sdata; | uint32_t *dest = &_sdata; | ||||
unsigned int i; | unsigned int i; | ||||
startup_early_hook(); | startup_early_hook(); | ||||
// enable clocks to always-used peripherals | // enable clocks to always-used peripherals | ||||
#if defined(_mk20dx128_) | |||||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) | |||||
SIM_SCGC5 = 0x00043F82; // clocks active to all GPIO | 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; | SIM_SCGC6 = SIM_SCGC6_RTC | SIM_SCGC6_FTM0 | SIM_SCGC6_FTM1 | SIM_SCGC6_ADC0 | SIM_SCGC6_FTFL; | ||||
#elif defined(_mk20dx256_) | #elif defined(_mk20dx256_) | ||||
} | } | ||||
*/ | */ | ||||
startup_late_hook(); | startup_late_hook(); | ||||
#endif | |||||
main(); | main(); | ||||
while (1) ; | while (1) ; | ||||
} | } |
#define NVIC_SET_PRIORITY(irqnum, priority) (*((volatile uint8_t *)0xE000E400 + (irqnum)) = (uint8_t)(priority)) | #define NVIC_SET_PRIORITY(irqnum, priority) (*((volatile uint8_t *)0xE000E400 + (irqnum)) = (uint8_t)(priority)) | ||||
#define NVIC_GET_PRIORITY(irqnum) (*((uint8_t *)0xE000E400 + (irqnum))) | #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_CH0 0 | ||||
#define IRQ_DMA_CH1 1 | #define IRQ_DMA_CH1 1 | ||||
#define IRQ_DMA_CH2 2 | #define IRQ_DMA_CH2 2 |
// USB Includes | // USB Includes | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | ||||
#include "avr/usb_keyboard_serial.h" | #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_dev.h" | ||||
#include "arm/usb_keyboard.h" | #include "arm/usb_keyboard.h" | ||||
#include "arm/usb_serial.h" | #include "arm/usb_serial.h" | ||||
{ | { | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | ||||
usb_debug_reload(); | usb_debug_reload(); | ||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
usb_device_reload(); | usb_device_reload(); | ||||
#endif | #endif | ||||
} | } | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | #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) | // XXX Make sure to check output_availablechar() first! Information is lost with the cast (error codes) | ||||
return (int)usb_serial_getchar(); | return (int)usb_serial_getchar(); | ||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
return usb_serial_getchar(); | return usb_serial_getchar(); | ||||
#endif | #endif | ||||
} | } | ||||
{ | { | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR | #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR | ||||
uint16_t count = 0; | uint16_t count = 0; | ||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM | |||||
uint32_t count = 0; | uint32_t count = 0; | ||||
#endif | #endif | ||||
// Count characters until NULL character, then send the amount counted | // Count characters until NULL character, then send the amount counted | ||||
{ | { | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) | ||||
usb_debug_software_reset(); | usb_debug_software_reset(); | ||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) | |||||
SOFTWARE_RESET(); | SOFTWARE_RESET(); | ||||
#endif | #endif | ||||
} | } |
PORTF = 0x00; | PORTF = 0x00; | ||||
// ARM | // 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 | // TODO - Should be cleared, but not that necessary due to the pin layout | ||||
#endif | #endif | ||||
} | } | ||||
TIMSK0 = (1 << TOIE0); | TIMSK0 = (1 << TOIE0); | ||||
// ARM | // ARM | ||||
#elif defined(_mk20dx128_) | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM | |||||
// 48 MHz clock by default | // 48 MHz clock by default | ||||
// System Clock Gating Register Disable | // System Clock Gating Register Disable | ||||
// USB Keyboard Data Send Counter Interrupt | // USB Keyboard Data Send Counter Interrupt | ||||
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR | #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR | ||||
ISR( TIMER0_OVF_vect ) | ISR( TIMER0_OVF_vect ) | ||||
#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM | |||||
#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM | |||||
void pit0_isr(void) | void pit0_isr(void) | ||||
#endif | #endif | ||||
{ | { | ||||
sendKeypresses = 1; | sendKeypresses = 1; | ||||
} | } | ||||
#if defined(_mk20dx128_) // ARM | |||||
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM | |||||
// Clear the interrupt flag | // Clear the interrupt flag | ||||
PIT_TFLG0 = 1; | PIT_TFLG0 = 1; | ||||
#endif | #endif |