changeset 170:85d74e5e1a95

More work on mk20dx128vlf5 port. - Basic compilation and loading is working - LED can be turned on/off - USB not yet working
author Jacob Alexander <haata@kiibohd.com>
date Thu, 26 Jun 2014 00:54:39 -0700
parents 7962a42dbda0
children aeac00164f2e
files Debug/led/led.c Debug/print/print.c Lib/CMake/arm.cmake Lib/CMake/avr.cmake Lib/mk20dx.c Lib/mk20dx128.ld Lib/mk20dx128vlf5.ld Output/pjrcUSB/arm/usb_desc.c Output/pjrcUSB/arm/usb_desc.h Output/pjrcUSB/arm/usb_dev.c Output/pjrcUSB/arm/usb_mem.h Output/pjrcUSB/arm/usb_serial.c Output/pjrcUSB/arm/usb_serial.h
diffstat 13 files changed, 190 insertions(+), 189 deletions(-) [+]
line wrap: on
line diff
--- a/Debug/led/led.c	Sun Jun 15 11:09:08 2014 -0700
+++ b/Debug/led/led.c	Thu Jun 26 00:54:39 2014 -0700
@@ -1,15 +1,15 @@
 /* Copyright (C) 2011-2014 by Jacob Alexander
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights
  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  * copies of the Software, and to permit persons to whom the Software is
  * furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -47,9 +47,18 @@
 	// Enable pin
 	GPIOC_PDDR |= (1<<5);
 
-	// Setup pin - Pin 11 -> C5 - See Lib/pin_map.teensy3 for more details on pins
+	// Setup pin - Pin 13 -> C5 - See Lib/pin_map.teensy3 for more details on pins
 	PORTC_PCR5 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1);
 
+// MCHCK
+#elif defined(_mk20dx128vlf5_)
+
+	// Enable pin
+	GPIOB_PDDR |= (1<<16);
+
+	// Setup pin - B16 - See Lib/pin_map.mchck for more details on pins
+	PORTB_PCR16 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1);
+
 #endif
 }
 
@@ -80,6 +89,18 @@
 		GPIOC_PCOR |= (1<<5);
 	}
 
+// MCHCK
+#elif defined(_mk20dx128vlf5_)
+
+	// Error LED On (B16)
+	if ( on ) {
+		GPIOB_PSOR |= (1<<16);
+	}
+	// Error LED Off
+	else {
+		GPIOB_PCOR |= (1<<16);
+	}
+
 #endif
 }
 
--- a/Debug/print/print.c	Sun Jun 15 11:09:08 2014 -0700
+++ b/Debug/print/print.c	Thu Jun 26 00:54:39 2014 -0700
@@ -64,7 +64,7 @@
 	{
 		Output_putchar( c );
 	}
-#elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM
 	Output_putstr( (char*)s );
 #endif
 }
--- a/Lib/CMake/arm.cmake	Sun Jun 15 11:09:08 2014 -0700
+++ b/Lib/CMake/arm.cmake	Thu Jun 26 00:54:39 2014 -0700
@@ -136,7 +136,7 @@
 
 
 #| Linker Flags
-set( LINKER_FLAGS "-mcpu=${CPU} -Wl,-Map=${TARGET}.map,--cref -Wl,--gc-sections -mthumb -Wl,--no-wchar-size-warning -T${CMAKE_CURRENT_SOURCE_DIR}/Lib/${CHIP}.ld" )
+set( LINKER_FLAGS "-mcpu=${CPU} -Wl,-Map=link.map,--cref -Wl,--gc-sections -mthumb -Wl,--no-wchar-size-warning -T${CMAKE_CURRENT_SOURCE_DIR}/Lib/${CHIP}.ld" )
 
 
 #| Hex Flags (XXX, CMake seems to have issues if you quote the arguments for the custom commands...)
--- a/Lib/CMake/avr.cmake	Sun Jun 15 11:09:08 2014 -0700
+++ b/Lib/CMake/avr.cmake	Thu Jun 26 00:54:39 2014 -0700
@@ -132,7 +132,7 @@
 
 
 #| Linker Flags
-set( LINKER_FLAGS "-mmcu=${MCU} -Wl,-Map=${TARGET}.map,--cref -Wl,--relax -Wl,--gc-sections" )
+set( LINKER_FLAGS "-mmcu=${MCU} -Wl,-Map=link.map,--cref -Wl,--relax -Wl,--gc-sections" )
 
 
 #| Hex Flags (XXX, CMake seems to have issues if you quote the arguments for the custom commands...)
--- a/Lib/mk20dx.c	Sun Jun 15 11:09:08 2014 -0700
+++ b/Lib/mk20dx.c	Thu Jun 26 00:54:39 2014 -0700
@@ -39,11 +39,8 @@
 extern unsigned long _sbss;
 extern unsigned long _ebss;
 extern unsigned long _estack;
-//extern void __init_array_start(void);
-//extern void __init_array_end(void);
 extern int main (void);
 void ResetHandler(void);
-void _init_Teensyduino_internal_(void);
 void __libc_init_array(void);
 
 
@@ -330,9 +327,8 @@
 #endif
 };
 
-//void usb_isr(void)
-//{
-//}
+
+#if defined(_mk20dx128_) || defined(_mk20dx256_)
 
 __attribute__ ((section(".flashconfig"), used))
 const uint8_t flashconfigbytes[16] = {
@@ -340,6 +336,8 @@
 	0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF
 };
 
+#endif
+
 
 // Automatically initialize the RTC.  When the build defines the compile
 // time, and the user has added a crystal, the RTC will automatically
@@ -350,61 +348,18 @@
 extern void rtc_set(unsigned long t);
 
 
-
-static void startup_unused_hook(void) {}
-void startup_early_hook(void)		__attribute__ ((weak, alias("startup_unused_hook")));
-void startup_late_hook(void)		__attribute__ ((weak, alias("startup_unused_hook")));
-
-
 __attribute__ ((section(".startup")))
 void ResetHandler(void)
 {
-#if defined(_mk20dx128vlf5_)
+	uint32_t *src = &_etext;
+	uint32_t *dest = &_sdata;
+	unsigned int i;
+
 	/* 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;
-
-	WDOG_UNLOCK = WDOG_UNLOCK_SEQ1;
-	WDOG_UNLOCK = WDOG_UNLOCK_SEQ2;
-	WDOG_STCTRLH = WDOG_STCTRLH_ALLOWUPDATE;
-	startup_early_hook();
-
 	// enable clocks to always-used peripherals
 #if defined(_mk20dx128_) || defined(_mk20dx128vlf5_)
 	SIM_SCGC5 = 0x00043F82;		// clocks active to all GPIO
@@ -433,6 +388,35 @@
 	// default all interrupts to medium priority level
 	for (i=0; i < NVIC_NUM_INTERRUPTS; i++) NVIC_SET_PRIORITY(i, 128);
 
+#if defined(_mk20dx128vlf5_)
+        /* FLL at 48MHz */
+	MCG_C4 = MCG_C4_DMX32 | MCG_C4_DRST_DRS(1);
+
+#if F_CPU == 96000000
+	// config divisors: 96 MHz core, 48 MHz bus, 24 MHz flash
+	SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(1) |	 SIM_CLKDIV1_OUTDIV4(3);
+#elif F_CPU == 48000000
+	// config divisors: 48 MHz core, 48 MHz bus, 24 MHz flash
+	SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(1) | SIM_CLKDIV1_OUTDIV2(1) |	 SIM_CLKDIV1_OUTDIV4(3);
+#elif F_CPU == 24000000
+	// config divisors: 24 MHz core, 24 MHz bus, 24 MHz flash
+	SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(3) | SIM_CLKDIV1_OUTDIV2(3) |	 SIM_CLKDIV1_OUTDIV4(3);
+#else
+#error "Error, F_CPU must be 96000000, 48000000, or 24000000"
+#endif
+
+	// switch to PLL as clock source, FLL input = 16 MHz / 512
+	MCG_C1 = MCG_C1_CLKS(0) | MCG_C1_FRDIV(4);
+
+	// configure USB for 48 MHz clock
+	SIM_CLKDIV2 = SIM_CLKDIV2_USBDIV(1); // USB = 96 MHz PLL / 2
+
+	SIM_SOPT2 = SIM_SOPT2_PLLFLLSEL;
+
+	// initialize the SysTick counter
+	SYST_RVR = (F_CPU / 1000) - 1;
+	SYST_CSR = SYST_CSR_CLKSOURCE | SYST_CSR_TICKINT | SYST_CSR_ENABLE;
+#else
 	// start in FEI mode
 	// enable capacitors for crystal
 	OSC0_CR = OSC_SC8P | OSC_SC2P;
@@ -482,32 +466,14 @@
 	SYST_RVR = (F_CPU / 1000) - 1;
 	SYST_CSR = SYST_CSR_CLKSOURCE | SYST_CSR_TICKINT | SYST_CSR_ENABLE;
 
-	//init_pins();
+#endif
 	__enable_irq();
-
-	//_init_Teensyduino_internal_(); XXX HaaTa - Why is this here? Perhaps fixed in a new version of the API?
-	//if (RTC_SR & RTC_SR_TIF) rtc_set(TIME_T); XXX HaaTa - We don't care about the rtc
-
 	__libc_init_array();
 
-/*
-	for (ptr = &__init_array_start; ptr < &__init_array_end; ptr++) {
-		(*ptr)();
-	}
-*/
-	startup_late_hook();
-#endif
 	main();
 	while (1) ;
 }
 
-// TODO: is this needed for c++ and where does it come from?
-/*
-void _init(void)
-{
-}
-*/
-
 char *__brkval = (char *)&_ebss;
 
 void * _sbrk(int incr)
@@ -521,70 +487,6 @@
 	return prev;
 }
 
-__attribute__((weak)) 
-int _read(int file, char *ptr, int len)
-{
-	return 0;
-}
-
-/*  moved to Print.cpp, to support Print::printf()
-__attribute__((weak)) 
-int _write(int file, char *ptr, int len)
-{
-	return 0;
-}
-*/
-
-__attribute__((weak)) 
-int _close(int fd)
-{
-	return -1;
-}
-
-#include <sys/stat.h>
-
-__attribute__((weak)) 
-int _fstat(int fd, struct stat *st)
-{
-	st->st_mode = S_IFCHR;
-	return 0;
-}
-
-__attribute__((weak)) 
-int _isatty(int fd)
-{
-	return 1;
-}
-
-__attribute__((weak)) 
-int _lseek(int fd, long long offset, int whence)
-{
-	return -1;
-}
-
-__attribute__((weak)) 
-void _exit(int status)
-{
-	while (1);
-}
-
-__attribute__((weak)) 
-void __cxa_pure_virtual()
-{
-	while (1);
-}
-
-__attribute__((weak)) 
-int __cxa_guard_acquire (int *g) 
-{
-	return 1;
-}
-
-__attribute__((weak)) 
-void __cxa_guard_release(int *g)
-{
-}
-
 int nvic_execution_priority(void)
 {
 	int priority=256;
--- a/Lib/mk20dx128.ld	Sun Jun 15 11:09:08 2014 -0700
+++ b/Lib/mk20dx128.ld	Thu Jun 26 00:54:39 2014 -0700
@@ -10,10 +10,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.
@@ -106,4 +106,3 @@
 	_estack = ORIGIN(RAM) + LENGTH(RAM);
 }
 
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/mk20dx128vlf5.ld	Thu Jun 26 00:54:39 2014 -0700
@@ -0,0 +1,80 @@
+/* -*- mode: ld-script; -*- */
+/*
+ * Linker script for MK20DX128VLF5
+ */
+MEMORY
+{
+	FLASH (rx) : ORIGIN = 3K, LENGTH = 128K-3K
+	RAM  (rwx) : ORIGIN = 0x20000000 - 16K / 2, LENGTH = 16K
+}
+
+/* Section Definitions */
+SECTIONS
+{
+	.text :
+	{
+		. = 0;
+		KEEP(* (.vectors))
+		*(.startup*)
+		*(.text*)
+		*(.rodata*)
+		. = ALIGN(4);
+		KEEP(*(.init))
+		. = ALIGN(4);
+		__preinit_array_start = .;
+		KEEP (*(.preinit_array))
+		__preinit_array_end = .;
+		__init_array_start = .;
+		KEEP (*(SORT(.init_array.*)))
+		KEEP (*(.init_array))
+		__init_array_end = .;
+	} > FLASH = 0xFF
+
+	.ARM.exidx :
+	{
+		__exidx_start = .;
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+		__exidx_end = .;
+	} > FLASH
+	_etext = .;
+
+	.usbdescriptortable (NOLOAD) : {
+		. = ALIGN(512);
+		*(.usbdescriptortable*)
+	} > RAM
+
+	.dmabuffers (NOLOAD) : {
+		. = ALIGN(4);
+		*(.dmabuffers*)
+	} > RAM
+
+	.usbbuffers (NOLOAD) : {
+		. = ALIGN(4);
+		*(.usbbuffers*)
+	} > RAM
+
+	.data : AT (_etext) {
+		. = ALIGN(4);
+		_sdata = .;
+		*(.data*)
+		. = ALIGN(4);
+		_edata = .;
+	} > RAM
+
+	.noinit (NOLOAD) : {
+		*(.noinit*)
+	} > RAM
+
+	.bss : {
+		. = ALIGN(4);
+		_sbss = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		_ebss = .;
+		__bss_end = .;
+	} > RAM
+
+	_estack = ORIGIN(RAM) + LENGTH(RAM);
+}
+
--- a/Output/pjrcUSB/arm/usb_desc.c	Sun Jun 15 11:09:08 2014 -0700
+++ b/Output/pjrcUSB/arm/usb_desc.c	Thu Jun 26 00:54:39 2014 -0700
@@ -424,16 +424,16 @@
 // 0x19 = Recieve only
 // 0x15 = Transmit only
 // 0x1D = Transmit & Recieve
-// 
-const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] = 
+//
+const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] =
 {
-	0x00, 0x15, 0x19, 0x15, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x15, 0x19, 0x15, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 #endif
 
 
-const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] = 
+const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] =
 {
 #if (defined(ENDPOINT1_CONFIG) && NUM_ENDPOINTS >= 1)
 	ENDPOINT1_CONFIG,
--- a/Output/pjrcUSB/arm/usb_desc.h	Sun Jun 15 11:09:08 2014 -0700
+++ b/Output/pjrcUSB/arm/usb_desc.h	Thu Jun 26 00:54:39 2014 -0700
@@ -83,38 +83,38 @@
 
 
 
-#define DEVICE_CLASS		0xEF
-#define DEVICE_SUBCLASS	0x02
-#define DEVICE_PROTOCOL	0x01
-#define EP0_SIZE		64
-#define NUM_ENDPOINTS		6
-#define NUM_USB_BUFFERS	30
-#define NUM_INTERFACE		4
+#define DEVICE_CLASS            0xEF
+#define DEVICE_SUBCLASS         0x02
+#define DEVICE_PROTOCOL         0x01
+#define EP0_SIZE                64
+#define NUM_ENDPOINTS           6
+#define NUM_USB_BUFFERS         30
+#define NUM_INTERFACE           4
 
-#define CDC_IAD_DESCRIPTOR	1
-#define CDC_STATUS_INTERFACE	0
-#define CDC_DATA_INTERFACE	1	// Serial
-#define CDC_ACM_ENDPOINT	2
-#define CDC_RX_ENDPOINT       3
-#define CDC_TX_ENDPOINT       4
-#define CDC_ACM_SIZE          16
-#define CDC_RX_SIZE           64
-#define CDC_TX_SIZE           64
+#define CDC_IAD_DESCRIPTOR      1
+#define CDC_STATUS_INTERFACE    0
+#define CDC_DATA_INTERFACE      1 // Serial
+#define CDC_ACM_ENDPOINT        2
+#define CDC_RX_ENDPOINT         3
+#define CDC_TX_ENDPOINT         4
+#define CDC_ACM_SIZE            16
+#define CDC_RX_SIZE             64
+#define CDC_TX_SIZE             64
 
-#define KEYBOARD_INTERFACE    2	// Keyboard
-#define KEYBOARD_ENDPOINT     1
-#define KEYBOARD_SIZE         8
-#define KEYBOARD_INTERVAL     1
+#define KEYBOARD_INTERFACE      2 // Keyboard
+#define KEYBOARD_ENDPOINT       1
+#define KEYBOARD_SIZE           8
+#define KEYBOARD_INTERVAL       1
 
-#define MOUSE_INTERFACE       3	// Mouse
-#define MOUSE_ENDPOINT        5
-#define MOUSE_SIZE            8
-#define MOUSE_INTERVAL        2
+#define MOUSE_INTERFACE         3 // Mouse
+#define MOUSE_ENDPOINT          5
+#define MOUSE_SIZE              8
+#define MOUSE_INTERVAL          2
 
-#define JOYSTICK_INTERFACE    4	// Joystick
-#define JOYSTICK_ENDPOINT     6
-#define JOYSTICK_SIZE         16
-#define JOYSTICK_INTERVAL     1
+#define JOYSTICK_INTERFACE      4 // Joystick
+#define JOYSTICK_ENDPOINT       6
+#define JOYSTICK_SIZE           16
+#define JOYSTICK_INTERVAL       1
 
 #define KEYBOARD_DESC_OFFSET	(9+8 + 9+5+5+4+5+7+9+7+7 + 9)
 #define MOUSE_DESC_OFFSET	(9+8 + 9+5+5+4+5+7+9+7+7 + 9+9+7 + 9)
--- a/Output/pjrcUSB/arm/usb_dev.c	Sun Jun 15 11:09:08 2014 -0700
+++ b/Output/pjrcUSB/arm/usb_dev.c	Thu Jun 26 00:54:39 2014 -0700
@@ -845,7 +845,7 @@
 		table[index(0, RX, ODD)].addr = ep0_rx1_buf;
 		table[index(0, TX, EVEN)].desc = 0;
 		table[index(0, TX, ODD)].desc = 0;
-		
+
 		// activate endpoint 0
 		USB0_ENDPT0 = USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK;
 
--- a/Output/pjrcUSB/arm/usb_mem.h	Sun Jun 15 11:09:08 2014 -0700
+++ b/Output/pjrcUSB/arm/usb_mem.h	Thu Jun 26 00:54:39 2014 -0700
@@ -10,10 +10,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.
@@ -43,7 +43,5 @@
 usb_packet_t * usb_malloc(void);
 void usb_free(usb_packet_t *p);
 
-
+#endif
 
-
-#endif
--- a/Output/pjrcUSB/arm/usb_serial.c	Sun Jun 15 11:09:08 2014 -0700
+++ b/Output/pjrcUSB/arm/usb_serial.c	Thu Jun 26 00:54:39 2014 -0700
@@ -1,6 +1,7 @@
 /* Teensyduino Core Library
  * http://www.pjrc.com/teensy/
  * Copyright (c) 2013 PJRC.COM, LLC.
+ * Modified by Jacob Alexander 2013-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.
--- a/Output/pjrcUSB/arm/usb_serial.h	Sun Jun 15 11:09:08 2014 -0700
+++ b/Output/pjrcUSB/arm/usb_serial.h	Thu Jun 26 00:54:39 2014 -0700
@@ -10,10 +10,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.