Reorganize and extend Kinetis hardware access macros

This adds support for the K22 MCUs on fet12v2. It also adds support for
some additional pieces of hardware the code will use. It also makes the
new (hermetic) compiler happy with all of it.

Change-Id: I4b9b26d71fd57d11e16737ef7a6480643dbd0ca5
diff --git a/motors/big/medium_salsa.cc b/motors/big/medium_salsa.cc
index 80263cb..7e01869 100644
--- a/motors/big/medium_salsa.cc
+++ b/motors/big/medium_salsa.cc
@@ -244,7 +244,7 @@
   PORTB_PCR18 = PORT_PCR_DSE | PORT_PCR_MUX(2);
   PORTB_PCR19 = PORT_PCR_DSE | PORT_PCR_MUX(2);
 
-  DMA_CR = DMA_CR_EMLM;
+  DMA.CR = M_DMA_EMLM;
   usb_serial_init();
   usb_descriptor_set_product_id(0x0490);
   usb_init();
diff --git a/motors/core/kinetis.h b/motors/core/kinetis.h
index c03e6ea..3382416 100644
--- a/motors/core/kinetis.h
+++ b/motors/core/kinetis.h
@@ -1,3 +1,4 @@
+// Originally derived from (since extensively modified):
 /* Teensyduino Core Library
  * http://www.pjrc.com/teensy/
  * Copyright (c) 2017 PJRC.COM, LLC.
@@ -32,6 +33,65 @@
 #define _kinetis_h_
 
 #include <stdint.h>
+#include <stddef.h>
+
+#ifndef __cplusplus
+#define static_assert(...)
+#endif
+
+// List of all possible HAS_* macros which the processor-specific sections may
+// define (please keep up to date):
+// HAS_KINETISK_UART0
+// HAS_KINETISK_UART1
+// HAS_KINETISK_UART2
+// HAS_KINETISK_UART3
+// HAS_KINETISK_UART4
+// HAS_KINETISK_UART5
+// HAS_KINETISK_LPUART0
+// HAS_KINETIS_I2C0
+// HAS_KINETIS_I2C0_STOPF
+// HAS_KINETIS_I2C1
+// HAS_KINETIS_I2C1_STOPF
+// HAS_KINETIS_I2C2
+// HAS_KINETIS_I2C2_STOPF
+// HAS_KINETIS_I2C3
+// HAS_KINETIS_I2C3_STOPF
+// HAS_KINETIS_SPI1
+// HAS_KINETIS_SPI2
+// HAS_KINETIS_LLWU_16CH
+// HAS_KINETIS_LLWU_32CH
+// HAS_KINETIS_MPU
+// HAS_KINETIS_ADC0
+// HAS_KINETIS_ADC1
+// HAS_KINETIS_TSI
+// HAS_KINETIS_TSI_LITE
+// HAS_KINETIS_FLASH_FTFL
+// HAS_KINETIS_FLASH_FTFE
+// HAS_KINETIS_SDHC
+// HAS_KINETIS_HSRUN
+// HAS_KINETIS_SMC_STOPCTRL
+// HAS_KINETIS_CAU
+// HAS_KINETIS_RNG
+// HAS_KINETIS_DAC0
+// HAS_KINETIS_DAC1
+// HAS_KINETIS_ENET
+// HAS_KINETIS_USBHS
+// HAS_KINETIS_USBPHY
+// HAS_KINETIS_CAN0
+// HAS_KINETIS_CAN1
+// HAS_KINETIS_I2C3
+// TODO(Brian): Come up with a more principled way to express all of this.
+// Maybe some families keep everything in the same position for ISRs and/or
+// DMAMUX sources or something? Between families, they definitely shuffle
+// around.
+// TODO(Brian): Re-order bitfield constants vs register addresses to make it
+// easier to find all the bitfields vs all the register instances.
+// TODO(Brian): Use structs to access all the peripherals, and arrays for things
+// like DMA.
+// TODO(Brian): Name bitfield insert/extract macros consistently.
+// TODO(Brian): Use UINT32_C throughout.
+// TODO(Brian): Document all the things that are available at different
+// addresses on the other AIPS-lite bridge too.
 
 // Teensy 3.0
 #if defined(__MK20DX128__)
@@ -84,6 +144,7 @@
 };
 #define NVIC_NUM_INTERRUPTS	46
 #define DMA_NUM_CHANNELS	4
+#define PDB_NUM_PULSE_OUT 4  // TODO(Brian): Verify
 
 #define DMAMUX_SOURCE_UART0_RX		2
 #define DMAMUX_SOURCE_UART0_TX		3
@@ -131,7 +192,6 @@
 
 #define KINETISK
 #define HAS_KINETISK_UART0
-#define HAS_KINETISK_UART0_FIFO
 #define HAS_KINETISK_UART1
 #define HAS_KINETISK_UART2
 #define HAS_KINETIS_I2C0
@@ -139,7 +199,13 @@
 #define HAS_KINETIS_ADC0
 #define HAS_KINETIS_TSI
 #define HAS_KINETIS_FLASH_FTFL
-
+#define HAS_KINETIS_CAU  // TODO(Brian): Verify
+#define HAS_KINETIS_RNG  // TODO(Brian): Verify
+#define HAS_KINETIS_DAC0  // TODO(Brian): Verify
+#define HAS_KINETIS_DAC1  // TODO(Brian): Verify
+#define HAS_KINETIS_CAN0  // TODO(Brian): Verify
+#define HAS_KINETIS_CAN1  // TODO(Brian): Verify
+#define HAS_KINETIS_I2C3  // TODO(Brian): Verify
 
 // Teensy 3.1 & 3.2
 #elif defined(__MK20DX256__)
@@ -216,6 +282,7 @@
 };
 #define NVIC_NUM_INTERRUPTS	95
 #define DMA_NUM_CHANNELS	16
+#define PDB_NUM_PULSE_OUT 4  // TODO(Brian): Verify
 
 #define DMAMUX_SOURCE_UART0_RX		2
 #define DMAMUX_SOURCE_UART0_TX		3
@@ -270,9 +337,7 @@
 
 #define KINETISK
 #define HAS_KINETISK_UART0
-#define HAS_KINETISK_UART0_FIFO
 #define HAS_KINETISK_UART1
-#define HAS_KINETISK_UART1_FIFO
 #define HAS_KINETISK_UART2
 #define HAS_KINETIS_I2C0
 #define HAS_KINETIS_I2C1
@@ -281,98 +346,13 @@
 #define HAS_KINETIS_ADC1
 #define HAS_KINETIS_TSI
 #define HAS_KINETIS_FLASH_FTFL
-
-// Teensy-LC
-#elif defined(__MKL26Z64__)
-enum IRQ_NUMBER_t {
-	IRQ_DMA_CH0 =		0,
-	IRQ_DMA_CH1 =		1,
-	IRQ_DMA_CH2 =		2,
-	IRQ_DMA_CH3 =		3,
-        IRQ_FTFA =              5,
-        IRQ_LOW_VOLTAGE =       6,
-        IRQ_LLWU =              7,
-        IRQ_I2C0 =              8,
-        IRQ_I2C1 =              9,
-        IRQ_SPI0 =              10,
-        IRQ_SPI1 =              11,
-        IRQ_UART0_STATUS =      12,
-        IRQ_UART1_STATUS =      13,
-        IRQ_UART2_STATUS =      14,
-        IRQ_ADC0 =              15,
-        IRQ_CMP0 =              16,
-        IRQ_FTM0 =              17,
-        IRQ_FTM1 =              18,
-        IRQ_FTM2 =              19,
-        IRQ_RTC_ALARM =         20,
-        IRQ_RTC_SECOND =        21,
-        IRQ_PIT =               22,
-        IRQ_I2S0 =              23,
-        IRQ_USBOTG =            24,
-        IRQ_DAC0 =              25,
-        IRQ_TSI =               26,
-        IRQ_MCG =               27,
-        IRQ_LPTMR =             28,
-	IRQ_SOFTWARE =		29,  // TODO: verify this works
-        IRQ_PORTA =             30,
-        IRQ_PORTCD =            31
-};
-#define NVIC_NUM_INTERRUPTS     32
-#define DMA_NUM_CHANNELS        4
-
-#define DMAMUX_SOURCE_UART0_RX		2
-#define DMAMUX_SOURCE_UART0_TX		3
-#define DMAMUX_SOURCE_UART1_RX		4
-#define DMAMUX_SOURCE_UART1_TX		5
-#define DMAMUX_SOURCE_UART2_RX		6
-#define DMAMUX_SOURCE_UART2_TX		7
-#define DMAMUX_SOURCE_I2S0_RX		14
-#define DMAMUX_SOURCE_I2S0_TX		15
-#define DMAMUX_SOURCE_SPI0_RX		16
-#define DMAMUX_SOURCE_SPI0_TX		17
-#define DMAMUX_SOURCE_SPI1_RX		18
-#define DMAMUX_SOURCE_SPI1_TX		19
-#define DMAMUX_SOURCE_I2C0		22
-#define DMAMUX_SOURCE_I2C1		23
-#define DMAMUX_SOURCE_TPM0_CH0		24
-#define DMAMUX_SOURCE_TPM0_CH1		25
-#define DMAMUX_SOURCE_TPM0_CH2		26
-#define DMAMUX_SOURCE_TPM0_CH3		27
-#define DMAMUX_SOURCE_TPM0_CH4		28
-#define DMAMUX_SOURCE_TPM0_CH5		29
-#define DMAMUX_SOURCE_TPM1_CH0		32
-#define DMAMUX_SOURCE_TPM1_CH1		33
-#define DMAMUX_SOURCE_TPM2_CH0		34
-#define DMAMUX_SOURCE_TPM2_CH1		35
-#define DMAMUX_SOURCE_ADC0		40
-#define DMAMUX_SOURCE_CMP0		42
-#define DMAMUX_SOURCE_DAC0		45
-#define DMAMUX_SOURCE_PORTA		49
-#define DMAMUX_SOURCE_PORTC		51
-#define DMAMUX_SOURCE_PORTD		52
-#define DMAMUX_SOURCE_FTM0_OV		54
-#define DMAMUX_SOURCE_FTM1_OV		55
-#define DMAMUX_SOURCE_FTM2_OV		56
-#define DMAMUX_SOURCE_TSI		57
-#define DMAMUX_SOURCE_ALWAYS0		60
-#define DMAMUX_SOURCE_ALWAYS1		61
-#define DMAMUX_SOURCE_ALWAYS2		62
-#define DMAMUX_SOURCE_ALWAYS3		63
-#define DMAMUX_NUM_SOURCE_ALWAYS	4
-
-#define KINETISL
-#define HAS_KINETISL_UART0
-#define HAS_KINETISL_UART1
-#define HAS_KINETISL_UART2
-#define HAS_KINETIS_I2C0
-#define HAS_KINETIS_I2C0_STOPF
-#define HAS_KINETIS_I2C1
-#define HAS_KINETIS_I2C1_STOPF
-#define HAS_KINETIS_LLWU_16CH
-#define HAS_KINETIS_ADC0
-#define HAS_KINETIS_TSI_LITE
-#define HAS_KINETIS_FLASH_FTFA
-
+#define HAS_KINETIS_CAU  // TODO(Brian): Verify
+#define HAS_KINETIS_RNG  // TODO(Brian): Verify
+#define HAS_KINETIS_DAC0  // TODO(Brian): Verify
+#define HAS_KINETIS_DAC1  // TODO(Brian): Verify
+#define HAS_KINETIS_CAN0  // TODO(Brian): Verify
+#define HAS_KINETIS_CAN1  // TODO(Brian): Verify
+#define HAS_KINETIS_I2C3  // TODO(Brian): Verify
 
 #elif defined(__MK64FX512__)
 enum IRQ_NUMBER_t {
@@ -463,8 +443,8 @@
 };
 #define NVIC_NUM_INTERRUPTS	86
 #define DMA_NUM_CHANNELS	16
+#define PDB_NUM_PULSE_OUT 3
 
-#define DMAMUX_SOURCE_TSI		1
 #define DMAMUX_SOURCE_UART0_RX		2
 #define DMAMUX_SOURCE_UART0_TX		3
 #define DMAMUX_SOURCE_UART1_RX		4
@@ -482,8 +462,7 @@
 #define DMAMUX_SOURCE_SPI1		16
 #define DMAMUX_SOURCE_SPI2		17
 #define DMAMUX_SOURCE_I2C0		18
-#define DMAMUX_SOURCE_I2C1		19
-#define DMAMUX_SOURCE_I2C2		19
+#define DMAMUX_SOURCE_I2C1_I2C2		19
 #define DMAMUX_SOURCE_FTM0_CH0		20
 #define DMAMUX_SOURCE_FTM0_CH1		21
 #define DMAMUX_SOURCE_FTM0_CH2		22
@@ -532,9 +511,7 @@
 
 #define KINETISK
 #define HAS_KINETISK_UART0
-#define HAS_KINETISK_UART0_FIFO
 #define HAS_KINETISK_UART1
-#define HAS_KINETISK_UART1_FIFO
 #define HAS_KINETISK_UART2
 #define HAS_KINETISK_UART3
 #define HAS_KINETISK_UART4
@@ -545,13 +522,37 @@
 #define HAS_KINETIS_I2C1_STOPF
 #define HAS_KINETIS_I2C2
 #define HAS_KINETIS_I2C2_STOPF
+#define HAS_KINETIS_SPI1
+#define HAS_KINETIS_SPI2
 #define HAS_KINETIS_LLWU_16CH
 #define HAS_KINETIS_MPU
 #define HAS_KINETIS_ADC0
 #define HAS_KINETIS_ADC1
 #define HAS_KINETIS_FLASH_FTFE
 #define HAS_KINETIS_SDHC
+#define HAS_KINETIS_CAU
+#define HAS_KINETIS_RNG
+#define HAS_KINETIS_DAC0
+#define HAS_KINETIS_DAC1
+#define HAS_KINETIS_ENET
+#define HAS_KINETIS_CAN0
 
+#define PDB_IN_EXTERNAL_TRIGGER 0
+#define PDB_IN_CMP0 1
+#define PDB_IN_CMP1 2
+#define PDB_IN_CMP2 3
+#define PDB_IN_PIT0 4
+#define PDB_IN_PIT1 5
+#define PDB_IN_PIT2 6
+#define PDB_IN_PIT3 7
+#define PDB_IN_FTM0 8
+#define PDB_IN_FTM1 9
+#define PDB_IN_FTM2 10
+#define PDB_IN_FTM3 11
+#define PDB_IN_RTC_ALARM 12
+#define PDB_IN_RTC_SECONDS 13
+#define PDB_IN_LPTMR 14
+#define PDB_IN_SOFTWARE 15
 
 #elif defined(__MK66FX1M0__)
 // https://forum.pjrc.com/threads/24633-Any-Chance-of-a-Teensy-3-1?p=78655&viewfull=1#post78655
@@ -655,6 +656,7 @@
 };
 #define NVIC_NUM_INTERRUPTS	100
 #define DMA_NUM_CHANNELS	32
+#define PDB_NUM_PULSE_OUT 4  // TODO(Brian): Verify
 
 #define DMAMUX_SOURCE_TSI		1
 #define DMAMUX_SOURCE_UART0_RX		2
@@ -674,8 +676,7 @@
 #define DMAMUX_SOURCE_SPI1_TX		17
 #define DMAMUX_SOURCE_I2C0		18
 #define DMAMUX_SOURCE_I2C3		18
-#define DMAMUX_SOURCE_I2C1		19
-#define DMAMUX_SOURCE_I2C2		19
+#define DMAMUX_SOURCE_I2C1_I2C2		19
 #define DMAMUX_SOURCE_FTM0_CH0		20
 #define DMAMUX_SOURCE_FTM0_CH1		21
 #define DMAMUX_SOURCE_FTM0_CH2		22
@@ -733,9 +734,7 @@
 
 #define KINETISK
 #define HAS_KINETISK_UART0
-#define HAS_KINETISK_UART0_FIFO
 #define HAS_KINETISK_UART1
-#define HAS_KINETISK_UART1_FIFO
 #define HAS_KINETISK_UART2
 #define HAS_KINETISK_UART3
 #define HAS_KINETISK_UART4
@@ -748,6 +747,8 @@
 #define HAS_KINETIS_I2C2_STOPF
 #define HAS_KINETIS_I2C3
 #define HAS_KINETIS_I2C3_STOPF
+#define HAS_KINETIS_SPI1
+#define HAS_KINETIS_SPI2
 #define HAS_KINETIS_LLWU_32CH
 #define HAS_KINETIS_MPU
 #define HAS_KINETIS_ADC0
@@ -756,16 +757,196 @@
 #define HAS_KINETIS_FLASH_FTFE
 #define HAS_KINETIS_SDHC
 #define HAS_KINETIS_HSRUN
+#define HAS_KINETIS_SMC_STOPCTRL
+#define HAS_KINETIS_CAU  // TODO(Brian): Verify
+#define HAS_KINETIS_RNG  // TODO(Brian): Verify
+#define HAS_KINETIS_DAC0  // TODO(Brian): Verify
+#define HAS_KINETIS_DAC1  // TODO(Brian): Verify
+#define HAS_KINETIS_ENET
+#define HAS_KINETIS_USBHS
+#define HAS_KINETIS_USBPHY
+#define HAS_KINETIS_CAN0  // TODO(Brian): Verify
+#define HAS_KINETIS_CAN1  // TODO(Brian): Verify
+#define HAS_KINETIS_I2C3  // TODO(Brian): Verify
 
+#elif defined(__MK22FX512__)
 
+enum IRQ_NUMBER_t {
+	IRQ_DMA_CH0 =		0,
+	IRQ_DMA_CH1 =		1,
+	IRQ_DMA_CH2 =		2,
+	IRQ_DMA_CH3 =		3,
+	IRQ_DMA_CH4 =		4,
+	IRQ_DMA_CH5 =		5,
+	IRQ_DMA_CH6 =		6,
+	IRQ_DMA_CH7 =		7,
+	IRQ_DMA_CH8 =		8,
+	IRQ_DMA_CH9 =		9,
+	IRQ_DMA_CH10 =		10,
+	IRQ_DMA_CH11 =		11,
+	IRQ_DMA_CH12 =		12,
+	IRQ_DMA_CH13 =		13,
+	IRQ_DMA_CH14 =		14,
+	IRQ_DMA_CH15 =		15,
+	IRQ_DMA_ERROR =		16,
+	IRQ_MCM =		17,
+	IRQ_FTFL_COMPLETE =	18,
+	IRQ_FTFL_COLLISION =	19,
+	IRQ_LOW_VOLTAGE =	20,
+	IRQ_LLWU =		21,
+	IRQ_WDOG =		22,
+	IRQ_I2C0 =		24,
+	IRQ_I2C1 =		25,
+	IRQ_SPI0 =		26,
+	IRQ_SPI1 =		27,
+	IRQ_I2S0_TX =		28,
+	IRQ_I2S0_RX =		29,
+	IRQ_UART0_STATUS =	31,
+	IRQ_UART0_ERROR =	32,
+	IRQ_UART1_STATUS =	33,
+	IRQ_UART1_ERROR =	34,
+	IRQ_UART2_STATUS =	35,
+	IRQ_UART2_ERROR =	36,
+	IRQ_UART3_STATUS =	37,
+	IRQ_UART3_ERROR =	38,
+	IRQ_ADC0 =		39,
+	IRQ_CMP0 =		40,
+	IRQ_CMP1 =		41,
+	IRQ_FTM0 =		42,
+	IRQ_FTM1 =		43,
+	IRQ_FTM2 =		44,
+	IRQ_CMT =		45,
+	IRQ_RTC_ALARM =		46,
+	IRQ_RTC_SECOND =	47,
+	IRQ_PIT_CH0 =		48,
+	IRQ_PIT_CH1 =		49,
+	IRQ_PIT_CH2 =		50,
+	IRQ_PIT_CH3 =		51,
+	IRQ_PDB =		52,
+	IRQ_USBOTG =		53,
+	IRQ_DAC0 =		56,
+	IRQ_MCG =		57,
+	IRQ_LPTMR =		58,
+	IRQ_PORTA =		59,
+	IRQ_PORTB =		60,
+	IRQ_PORTC =		61,
+	IRQ_PORTD =		62,
+	IRQ_PORTE =		63,
+	IRQ_SOFTWARE =		64,
+	IRQ_CMP2 =		70,
+	IRQ_FTM3 =		71,
+	IRQ_ADC1 =		73,
+	IRQ_I2C2 =		74,
+	IRQ_CAN0_MESSAGE =	75,
+	IRQ_CAN0_BUS_OFF =	76,
+	IRQ_CAN0_ERROR =	77,
+	IRQ_CAN0_TX_WARN =	78,
+	IRQ_CAN0_RX_WARN =	79,
+	IRQ_CAN0_WAKEUP =	80,
+};
+#define NVIC_NUM_INTERRUPTS	82
+#define DMA_NUM_CHANNELS	16
+#define PDB_NUM_PULSE_OUT 3
 
-#endif // end of board-specific definitions
+#define DMAMUX_SOURCE_UART0_RX		2
+#define DMAMUX_SOURCE_UART0_TX		3
+#define DMAMUX_SOURCE_UART1_RX		4
+#define DMAMUX_SOURCE_UART1_TX		5
+#define DMAMUX_SOURCE_UART2_RX		6
+#define DMAMUX_SOURCE_UART2_TX		7
+#define DMAMUX_SOURCE_I2S0_RX		12
+#define DMAMUX_SOURCE_I2S0_TX		13
+#define DMAMUX_SOURCE_SPI0_RX		14
+#define DMAMUX_SOURCE_SPI0_TX		15
+#define DMAMUX_SOURCE_I2C0		18
+#define DMAMUX_SOURCE_I2C1_I2C2		19
+#define DMAMUX_SOURCE_FTM0_CH0		20
+#define DMAMUX_SOURCE_FTM0_CH1		21
+#define DMAMUX_SOURCE_FTM0_CH2		22
+#define DMAMUX_SOURCE_FTM0_CH3		23
+#define DMAMUX_SOURCE_FTM0_CH4		24
+#define DMAMUX_SOURCE_FTM0_CH5		25
+#define DMAMUX_SOURCE_FTM0_CH6		26
+#define DMAMUX_SOURCE_FTM0_CH7		27
+#define DMAMUX_SOURCE_FTM1_CH0		28
+#define DMAMUX_SOURCE_FTM1_CH1		29
+#define DMAMUX_SOURCE_FTM2_CH0		30
+#define DMAMUX_SOURCE_FTM2_CH1		31
+#define DMAMUX_SOURCE_FTM3_CH0		32
+#define DMAMUX_SOURCE_FTM3_CH1		33
+#define DMAMUX_SOURCE_FTM3_CH2		34
+#define DMAMUX_SOURCE_FTM3_CH3		35
+#define DMAMUX_SOURCE_FTM3_CH4		36
+#define DMAMUX_SOURCE_FTM3_CH5		37
+#define DMAMUX_SOURCE_FTM3_CH6		38
+#define DMAMUX_SOURCE_FTM3_CH7		39
+#define DMAMUX_SOURCE_ADC0		40
+#define DMAMUX_SOURCE_ADC1		41
+#define DMAMUX_SOURCE_CMP0		42
+#define DMAMUX_SOURCE_CMP1		43
+#define DMAMUX_SOURCE_CMP2		44
+#define DMAMUX_SOURCE_DAC0		45
+#define DMAMUX_SOURCE_CMT		47
+#define DMAMUX_SOURCE_PDB		48
+#define DMAMUX_SOURCE_PORTA		49
+#define DMAMUX_SOURCE_PORTB		50
+#define DMAMUX_SOURCE_PORTC		51
+#define DMAMUX_SOURCE_PORTD		52
+#define DMAMUX_SOURCE_PORTE		53
+#define DMAMUX_SOURCE_ALWAYS0		54
+#define DMAMUX_SOURCE_ALWAYS1		55
+#define DMAMUX_SOURCE_ALWAYS2		56
+#define DMAMUX_SOURCE_ALWAYS3		57
+#define DMAMUX_SOURCE_ALWAYS4		58
+#define DMAMUX_SOURCE_ALWAYS5		59
+#define DMAMUX_SOURCE_ALWAYS6		60
+#define DMAMUX_SOURCE_ALWAYS7		61
+#define DMAMUX_SOURCE_ALWAYS8		62
+#define DMAMUX_SOURCE_ALWAYS9		63
+#define DMAMUX_NUM_SOURCE_ALWAYS	10
 
+#define KINETISK
+#define HAS_KINETISK_UART0
+#define HAS_KINETISK_UART1
+#define HAS_KINETISK_UART2
+#define HAS_KINETIS_I2C0
+#define HAS_KINETIS_I2C0_STOPF
+#define HAS_KINETIS_I2C1
+#define HAS_KINETIS_I2C1_STOPF
+#define HAS_KINETIS_I2C2
+#define HAS_KINETIS_I2C2_STOPF
+#define HAS_KINETIS_LLWU_16CH
+#define HAS_KINETIS_MPU
+#define HAS_KINETIS_ADC0
+#define HAS_KINETIS_ADC1
+#define HAS_KINETIS_FLASH_FTFE
+#define HAS_KINETIS_DAC0
+#define HAS_KINETIS_CAN0
 
-#ifndef NULL
-#define NULL (0)
+#define PDB_IN_EXTERNAL_TRIGGER 0
+#define PDB_IN_CMP0 1
+#define PDB_IN_CMP1 2
+#define PDB_IN_CMP2 3
+#define PDB_IN_PIT0 4
+#define PDB_IN_PIT1 5
+#define PDB_IN_PIT2 6
+#define PDB_IN_PIT3 7
+#define PDB_IN_FTM0 8
+#define PDB_IN_FTM1 9
+#define PDB_IN_FTM2 10
+#define PDB_IN_FTM3 11
+#define PDB_IN_RTC_ALARM 12
+#define PDB_IN_RTC_SECONDS 13
+#define PDB_IN_LPTMR 14
+#define PDB_IN_SOFTWARE 15
+
+#else
+
+#error
+
 #endif
 
+
 // Port control and interrupts (PORT)
 
 #define PORTA_PCR0		(*(volatile uint32_t *)0x40049000) // Pin Control Register n
@@ -1101,10 +1282,6 @@
 #define SIM_SCGC4_I2C0			((uint32_t)0x00000040)		// I2C0 Clock Gate Control
 #define SIM_SCGC4_CMT			((uint32_t)0x00000004)		// CMT Clock Gate Control
 #define SIM_SCGC4_EWM			((uint32_t)0x00000002)		// EWM Clock Gate Control
-#ifdef KINETISL
-#define SIM_SCGC4_SPI1			((uint32_t)0x00800000)		//
-#define SIM_SCGC4_SPI0			((uint32_t)0x00400000)		//
-#endif
 #define SIM_SCGC5		(*(volatile uint32_t *)0x40048038) // System Clock Gating Control Register 5
 #define SIM_SCGC5_PORTE			((uint32_t)0x00002000)		// Port E Clock Gate Control
 #define SIM_SCGC5_PORTD			((uint32_t)0x00001000)		// Port D Clock Gate Control
@@ -1114,12 +1291,6 @@
 #define SIM_SCGC5_TSI			((uint32_t)0x00000020)		// Touch Sense Input TSI Clock Gate Control
 #define SIM_SCGC5_LPTIMER		((uint32_t)0x00000001)		// Low Power Timer Access Control
 #define SIM_SCGC6		(*(volatile uint32_t *)0x4004803C) // System Clock Gating Control Register 6
-#if defined(KINETISL)
-#define SIM_SCGC6_DAC0			((uint32_t)0x80000000)		// DAC on Kinetis-L
-#define SIM_SCGC6_TPM2			((uint32_t)0x04000000)		// FTM2 Clock Gate Control
-#define SIM_SCGC6_TPM1			((uint32_t)0x02000000)		// FTM1 Clock Gate Control
-#define SIM_SCGC6_TPM0			((uint32_t)0x01000000)		// FTM0 Clock Gate Control
-#elif defined(KINETISK)
 //#define SIM_SCGC6_DAC0		((uint32_t)0x80000000)		// DAC0 Clock on APIS0 (base addr 4003F000)
 //#define SIM_SCGC6_FTM2		((uint32_t)0x04000000)		// FTM2 Clock on APIS0 (base addr 4003A000)
 #define SIM_SCGC6_PDB			((uint32_t)0x00400000)		// PDB Clock Gate Control
@@ -1129,7 +1300,6 @@
 #define SIM_SCGC6_RNGA			((uint32_t)0x00000200)		// RNGA Clock on APIS0 (base addr 40029000)
 #define SIM_SCGC6_FLEXCAN0		((uint32_t)0x00000010)		// FlexCAN0 Clock Gate Control
 #define SIM_SCGC6_CRC			((uint32_t)0x00040000)		// CRC Clock Gate Control
-#endif
 #define SIM_SCGC6_RTC			((uint32_t)0x20000000)		// RTC Access
 #define SIM_SCGC6_ADC0			((uint32_t)0x08000000)		// ADC0 Clock Gate Control
 #define SIM_SCGC6_FTM1			((uint32_t)0x02000000)		// FTM1 Clock Gate Control
@@ -1137,16 +1307,12 @@
 #define SIM_SCGC6_PIT			((uint32_t)0x00800000)		// PIT Clock Gate Control
 #define SIM_SCGC6_I2S			((uint32_t)0x00008000)		// I2S Clock Gate Control
 #define SIM_SCGC6_DMAMUX		((uint32_t)0x00000002)		// DMA Mux Clock Gate Control
-#define SIM_SCGC6_FTFL			((uint32_t)0x00000001)		// Flash Memory Clock Gate Control
+#define SIM_SCGC6_FTF			((uint32_t)0x00000001)		// Flash Memory Clock Gate Control
 #define SIM_SCGC7		(*(volatile uint32_t *)0x40048040) // System Clock Gating Control Register 7
-#if defined(KINETISK)
 #define SIM_SCGC7_SDRAMC		((uint32_t)0x00000008)		// SDRAM Clock Gate Control
 #define SIM_SCGC7_MPU			((uint32_t)0x00000004)		// MPU Clock Gate Control
 #define SIM_SCGC7_DMA			((uint32_t)0x00000002)		// DMA Clock Gate Control
 #define SIM_SCGC7_FLEXBUS		((uint32_t)0x00000001)		// FLEXBUS Clock Gate Control
-#elif defined(KINETISL)
-#define SIM_SCGC7_DMA			((uint32_t)0x00000100)		// DMA Clock Gate Control
-#endif
 #define SIM_CLKDIV1		(*(volatile uint32_t *)0x40048044) // System Clock Divider Register 1
 #define SIM_CLKDIV1_OUTDIV1(n)		((uint32_t)(((n) & 0x0F) << 28)) // divide value for the core/system clock
 #define SIM_CLKDIV1_OUTDIV2(n)		((uint32_t)(((n) & 0x0F) << 24)) // divide value for the peripheral clock
@@ -1172,10 +1338,6 @@
 #define SIM_CLKDIV4		(*(volatile uint32_t *)0x40048068) // System Clock Divider Register 4 (Trace)
 #define SIM_CLKDIV4_TRACEDIV(n)		((uint32_t)(((n) & 0x07) << 1))
 #define SIM_CLKDIV4_TRACEFRAC		((uint32_t)0x01)
-#if defined(KINETISL)
-#define SIM_COPC                (*(volatile uint32_t *)0x40048100) // COP Control Register (SIM_COPC)
-#define SIM_SRVCOP              (*(volatile uint32_t *)0x40048104) // Service COP Register (SIM_SRVCOP)
-#endif
 
 // Reset Control Module (RCM)
 
@@ -1216,7 +1378,7 @@
 #define SMC_VLLSCTRL_PORPO		((uint8_t)0x20)			// POR Power Option
 #define SMC_VLLSCTRL_VLLSM(n)		((uint8_t)((n) & 0x07))		// VLLS Mode Control
 
-#if defined(__MK66FX1M0__)
+#if defined(HAS_KINETIS_SMC_STOPCTRL)
 #define SMC_STOPCTRL			SMC_VLLSCTRL // Stop Control Register (compatible to SMC_VLLSCTRL)
 #define SMC_STOPCTRL_PSTOPO(n)	((uint8_t)(((n) & 0x03) << 6)) 		// Partial Stop Option
 #define SMC_STOPCTRL_PORPO		SMC_VLLSCTRL_PORPO		// POR Power Option
@@ -1426,7 +1588,6 @@
 
 // Miscellaneous Control Module (MCM)
 
-#if defined(KINETISK)
 #define MCM_PLASC		(*(volatile uint16_t *)0xE0080008) // Crossbar Switch (AXBS) Slave Configuration
 #define MCM_PLAMC		(*(volatile uint16_t *)0xE008000A) // Crossbar Switch (AXBS) Master Configuration
 #define MCM_PLACR		(*(volatile uint32_t *)0xE008000C) // Crossbar Switch (AXBS) Control Register (MK20DX128)
@@ -1445,20 +1606,6 @@
 #define MCM_FDR			(*(volatile uint32_t *)0xE0080028) // Fault data register
 #define MCM_PID			(*(volatile uint32_t *)0xE0080030) // Process ID register
 #define MCM_CPO			(*(volatile uint32_t *)0xE0080040) // Compute Operation Control Register
-#elif defined(KINETISL)
-#define MCM_PLASC               (*(volatile uint16_t *)0xF0003008) // Crossbar Switch (AXBS) Slave Configuration
-#define MCM_PLAMC               (*(volatile uint16_t *)0xF000300A) // Crossbar Switch (AXBS) Master Configuration
-#define MCM_PLACR               (*(volatile uint32_t *)0xF000300C) // Platform Control Register
-#define MCM_PLACR_ESFC			((uint32_t)0x00010000)		// Enable Stalling Flash Controller
-#define MCM_PLACR_DFCS			((uint32_t)0x00008000)		// Disable Flash Controller Speculation
-#define MCM_PLACR_EFDS			((uint32_t)0x00004000)		// Enable Flash Data Speculation
-#define MCM_PLACR_DFCC			((uint32_t)0x00002000)		// Disable Flash Controller Cache
-#define MCM_PLACR_DFCIC			((uint32_t)0x00001000)		// Disable Flash Controller Instruction Caching
-#define MCM_PLACR_DFCDA			((uint32_t)0x00000800)		// Disable Flash Controller Data Caching
-#define MCM_PLACR_CFCC			((uint32_t)0x00000400)		// Clear Flash Controller Cache
-#define MCM_PLACR_ARB			((uint32_t)0x00000200)		// Arbitration select
-#define MCM_CPO                 (*(volatile uint32_t *)0xF0003040) // Compute Operation Control Register
-#endif
 
 // Crossbar Switch (AXBS) - not programmable on MK20DX128 & Kinetis-L
 
@@ -1610,879 +1757,131 @@
 
 // Direct Memory Access Multiplexer (DMAMUX)
 
-#if DMA_NUM_CHANNELS >= 4
-#define DMAMUX0_CHCFG0		(*(volatile uint8_t  *)0x40021000) // Channel Configuration register
-#define DMAMUX0_CHCFG1		(*(volatile uint8_t  *)0x40021001) // Channel Configuration register
-#define DMAMUX0_CHCFG2		(*(volatile uint8_t  *)0x40021002) // Channel Configuration register
-#define DMAMUX0_CHCFG3		(*(volatile uint8_t  *)0x40021003) // Channel Configuration register
-#endif
-#if DMA_NUM_CHANNELS >= 16
-#define DMAMUX0_CHCFG4		(*(volatile uint8_t  *)0x40021004) // Channel Configuration register
-#define DMAMUX0_CHCFG5		(*(volatile uint8_t  *)0x40021005) // Channel Configuration register
-#define DMAMUX0_CHCFG6		(*(volatile uint8_t  *)0x40021006) // Channel Configuration register
-#define DMAMUX0_CHCFG7		(*(volatile uint8_t  *)0x40021007) // Channel Configuration register
-#define DMAMUX0_CHCFG8		(*(volatile uint8_t  *)0x40021008) // Channel Configuration register
-#define DMAMUX0_CHCFG9		(*(volatile uint8_t  *)0x40021009) // Channel Configuration register
-#define DMAMUX0_CHCFG10		(*(volatile uint8_t  *)0x4002100A) // Channel Configuration register
-#define DMAMUX0_CHCFG11		(*(volatile uint8_t  *)0x4002100B) // Channel Configuration register
-#define DMAMUX0_CHCFG12		(*(volatile uint8_t  *)0x4002100C) // Channel Configuration register
-#define DMAMUX0_CHCFG13		(*(volatile uint8_t  *)0x4002100D) // Channel Configuration register
-#define DMAMUX0_CHCFG14		(*(volatile uint8_t  *)0x4002100E) // Channel Configuration register
-#define DMAMUX0_CHCFG15		(*(volatile uint8_t  *)0x4002100F) // Channel Configuration register
-#endif
-#if DMA_NUM_CHANNELS >= 32
-#define DMAMUX0_CHCFG16		(*(volatile uint8_t  *)0x40021010) // Channel Configuration register
-#define DMAMUX0_CHCFG17		(*(volatile uint8_t  *)0x40021011) // Channel Configuration register
-#define DMAMUX0_CHCFG18		(*(volatile uint8_t  *)0x40021012) // Channel Configuration register
-#define DMAMUX0_CHCFG19		(*(volatile uint8_t  *)0x40021013) // Channel Configuration register
-#define DMAMUX0_CHCFG20		(*(volatile uint8_t  *)0x40021014) // Channel Configuration register
-#define DMAMUX0_CHCFG21		(*(volatile uint8_t  *)0x40021015) // Channel Configuration register
-#define DMAMUX0_CHCFG22		(*(volatile uint8_t  *)0x40021016) // Channel Configuration register
-#define DMAMUX0_CHCFG23		(*(volatile uint8_t  *)0x40021017) // Channel Configuration register
-#define DMAMUX0_CHCFG24		(*(volatile uint8_t  *)0x40021018) // Channel Configuration register
-#define DMAMUX0_CHCFG25		(*(volatile uint8_t  *)0x40021019) // Channel Configuration register
-#define DMAMUX0_CHCFG26		(*(volatile uint8_t  *)0x4002101A) // Channel Configuration register
-#define DMAMUX0_CHCFG27		(*(volatile uint8_t  *)0x4002101B) // Channel Configuration register
-#define DMAMUX0_CHCFG28		(*(volatile uint8_t  *)0x4002101C) // Channel Configuration register
-#define DMAMUX0_CHCFG29		(*(volatile uint8_t  *)0x4002101D) // Channel Configuration register
-#define DMAMUX0_CHCFG30		(*(volatile uint8_t  *)0x4002101E) // Channel Configuration register
-#define DMAMUX0_CHCFG31		(*(volatile uint8_t  *)0x4002101F) // Channel Configuration register
-#endif
-#define DMAMUX_DISABLE			0
-#define DMAMUX_TRIG			64
-#define DMAMUX_ENABLE			128
+typedef struct {
+  volatile uint8_t CHCFG[DMA_NUM_CHANNELS];  // Channel Configuration register
+} KINETIS_DMAMUX_t __attribute__((aligned(0x1000)));
+#define DMAMUX0 (*(KINETIS_DMAMUX_t *)0x40021000)
+#define M_DMAMUX_ENBL UINT8_C(1 << 7)
+#define M_DMAMUX_TRIG UINT8_C(1 << 6)
+#define V_DMAMUX_SOURCE(n) ((uint8_t)((n)&0x3F))
 
 // Direct Memory Access Controller (eDMA)
 
-#if defined(KINETISK)
-#define DMA_CR			(*(volatile uint32_t *)0x40008000) // Control Register
-#define DMA_CR_CX			((uint32_t)(1<<17))	// Cancel Transfer
-#define DMA_CR_ECX			((uint32_t)(1<<16))	// Error Cancel Transfer
-#define DMA_CR_EMLM			((uint32_t)0x80)	// Enable Minor Loop Mapping
-#define DMA_CR_CLM			((uint32_t)0x40)	// Continuous Link Mode
-#define DMA_CR_HALT			((uint32_t)0x20)	// Halt DMA Operations
-#define DMA_CR_HOE			((uint32_t)0x10)	// Halt On Error
-#define DMA_CR_ERCA			((uint32_t)0x04)	// Enable Round Robin Channel Arbitration
-#define DMA_CR_EDBG			((uint32_t)0x02)	// Enable Debug
-#define DMA_ES			(*(volatile uint32_t *)0x40008004) // Error Status Register
-#define DMA_ERQ			(*(volatile uint32_t *)0x4000800C) // Enable Request Register
-#define DMA_EEI			(*(volatile uint32_t *)0x40008014) // Enable Error Interrupt Register
-#define DMA_CEEI		(*(volatile uint8_t  *)0x40008018) // Clear Enable Error Interrupt Register
-#define DMA_CEEI_CEEI(n)		((uint8_t)(n & 15)<<0)	// Clear Enable Error Interrupt
-#define DMA_CEEI_CAEE			((uint8_t)1<<6)		// Clear All Enable Error Interrupts
-#define DMA_CEEI_NOP			((uint8_t)1<<7)		// NOP
-#define DMA_SEEI		(*(volatile uint8_t  *)0x40008019) // Set Enable Error Interrupt Register
-#define DMA_SEEI_SEEI(n)		((uint8_t)(n & 15)<<0)	// Set Enable Error Interrupt
-#define DMA_SEEI_SAEE			((uint8_t)1<<6)		// Set All Enable Error Interrupts
-#define DMA_SEEI_NOP			((uint8_t)1<<7)		// NOP
-#define DMA_CERQ		(*(volatile uint8_t  *)0x4000801A) // Clear Enable Request Register
-#define DMA_CERQ_CERQ(n)		((uint8_t)(n & 15)<<0)	// Clear Enable Request
-#define DMA_CERQ_CAER			((uint8_t)1<<6)		// Clear All Enable Requests
-#define DMA_CERQ_NOP			((uint8_t)1<<7)		// NOP
-#define DMA_SERQ		(*(volatile uint8_t  *)0x4000801B) // Set Enable Request Register
-#define DMA_SERQ_SERQ(n)		((uint8_t)(n & 15)<<0)	// Set Enable Request
-#define DMA_SERQ_SAER			((uint8_t)1<<6)		// Set All Enable Requests
-#define DMA_SERQ_NOP			((uint8_t)1<<7)		// NOP
-#define DMA_CDNE		(*(volatile uint8_t  *)0x4000801C) // Clear DONE Status Bit Register
-#define DMA_CDNE_CDNE(n)		((uint8_t)(n & 15)<<0)	// Clear Done Bit
-#define DMA_CDNE_CADN			((uint8_t)1<<6)		// Clear All Done Bits
-#define DMA_CDNE_NOP			((uint8_t)1<<7)		// NOP
-#define DMA_SSRT		(*(volatile uint8_t  *)0x4000801D) // Set START Bit Register
-#define DMA_SSRT_SSRT(n)		((uint8_t)(n & 15)<<0)	// Set Start Bit
-#define DMA_SSRT_SAST			((uint8_t)1<<6)		// Set All Start Bits
-#define DMA_SSRT_NOP			((uint8_t)1<<7)		// NOP
-#define DMA_CERR		(*(volatile uint8_t  *)0x4000801E) // Clear Error Register
-#define DMA_CERR_CERR(n)		((uint8_t)(n & 15)<<0)	// Clear Error Indicator
-#define DMA_CERR_CAEI			((uint8_t)1<<6)		// Clear All Error Indicators
-#define DMA_CERR_NOP			((uint8_t)1<<7)		// NOP
-#define DMA_CINT		(*(volatile uint8_t  *)0x4000801F) // Clear Interrupt Request Register
-#define DMA_CINT_CINT(n)		((uint8_t)(n & 15)<<0)	// Clear Interrupt Request
-#define DMA_CINT_CAIR			((uint8_t)1<<6)		// Clear All Interrupt Requests
-#define DMA_CINT_NOP			((uint8_t)1<<7)		// NOP
-#define DMA_INT			(*(volatile uint32_t *)0x40008024) // Interrupt Request Register
-#define DMA_ERR			(*(volatile uint32_t *)0x4000802C) // Error Register
-#define DMA_HRS			(*(volatile uint32_t *)0x40008034) // Hardware Request Status Register
-
-#if DMA_NUM_CHANNELS >= 4
-#define DMA_ERQ_ERQ0			((uint32_t)1<<0)	// Enable DMA Request 0
-#define DMA_ERQ_ERQ1			((uint32_t)1<<1)	// Enable DMA Request 1
-#define DMA_ERQ_ERQ2			((uint32_t)1<<2)	// Enable DMA Request 2
-#define DMA_ERQ_ERQ3			((uint32_t)1<<3)	// Enable DMA Request 3
-#define DMA_INT_INT0			((uint32_t)1<<0)	// Interrupt Request 0
-#define DMA_INT_INT1			((uint32_t)1<<1)	// Interrupt Request 1
-#define DMA_INT_INT2			((uint32_t)1<<2)	// Interrupt Request 2
-#define DMA_INT_INT3			((uint32_t)1<<3)	// Interrupt Request 3
-#define DMA_ERR_ERR0			((uint32_t)1<<0)	// Error in Channel 0
-#define DMA_ERR_ERR1			((uint32_t)1<<1)	// Error in Channel 1
-#define DMA_ERR_ERR2			((uint32_t)1<<2)	// Error in Channel 2
-#define DMA_ERR_ERR3			((uint32_t)1<<3)	// Error in Channel 3
-#define DMA_HRS_HRS0			((uint32_t)1<<0)	// Hardware Request Status Channel 0
-#define DMA_HRS_HRS1			((uint32_t)1<<1)	// Hardware Request Status Channel 1
-#define DMA_HRS_HRS2			((uint32_t)1<<2)	// Hardware Request Status Channel 2
-#define DMA_HRS_HRS3			((uint32_t)1<<3)	// Hardware Request Status Channel 3
-#endif
-#if DMA_NUM_CHANNELS >= 16
-#define DMA_ERQ_ERQ4			((uint32_t)1<<4)	// Enable DMA Request 4
-#define DMA_ERQ_ERQ5			((uint32_t)1<<5)	// Enable DMA Request 5
-#define DMA_ERQ_ERQ6			((uint32_t)1<<6)	// Enable DMA Request 6
-#define DMA_ERQ_ERQ7			((uint32_t)1<<7)	// Enable DMA Request 7
-#define DMA_ERQ_ERQ8			((uint32_t)1<<8)	// Enable DMA Request 8
-#define DMA_ERQ_ERQ9			((uint32_t)1<<9)	// Enable DMA Request 9
-#define DMA_ERQ_ERQ10			((uint32_t)1<<10)	// Enable DMA Request 10
-#define DMA_ERQ_ERQ11			((uint32_t)1<<11)	// Enable DMA Request 11
-#define DMA_ERQ_ERQ12			((uint32_t)1<<12)	// Enable DMA Request 12
-#define DMA_ERQ_ERQ13			((uint32_t)1<<13)	// Enable DMA Request 13
-#define DMA_ERQ_ERQ14			((uint32_t)1<<14)	// Enable DMA Request 14
-#define DMA_ERQ_ERQ15			((uint32_t)1<<15)	// Enable DMA Request 15
-#define DMA_INT_INT4			((uint32_t)1<<4)	// Interrupt Request 4
-#define DMA_INT_INT5			((uint32_t)1<<5)	// Interrupt Request 5
-#define DMA_INT_INT6			((uint32_t)1<<6)	// Interrupt Request 6
-#define DMA_INT_INT7			((uint32_t)1<<7)	// Interrupt Request 7
-#define DMA_INT_INT8			((uint32_t)1<<8)	// Interrupt Request 8
-#define DMA_INT_INT9			((uint32_t)1<<9)	// Interrupt Request 9
-#define DMA_INT_INT10			((uint32_t)1<<10)	// Interrupt Request 10
-#define DMA_INT_INT11			((uint32_t)1<<11)	// Interrupt Request 11
-#define DMA_INT_INT12			((uint32_t)1<<12)	// Interrupt Request 12
-#define DMA_INT_INT13			((uint32_t)1<<13)	// Interrupt Request 13
-#define DMA_INT_INT14			((uint32_t)1<<14)	// Interrupt Request 14
-#define DMA_INT_INT15			((uint32_t)1<<15)	// Interrupt Request 15
-#define DMA_ERR_ERR4			((uint32_t)1<<4)	// Error in Channel 4
-#define DMA_ERR_ERR5			((uint32_t)1<<5)	// Error in Channel 5
-#define DMA_ERR_ERR6			((uint32_t)1<<6)	// Error in Channel 6
-#define DMA_ERR_ERR7			((uint32_t)1<<7)	// Error in Channel 7
-#define DMA_ERR_ERR8			((uint32_t)1<<8)	// Error in Channel 8
-#define DMA_ERR_ERR9			((uint32_t)1<<9)	// Error in Channel 9
-#define DMA_ERR_ERR10			((uint32_t)1<<10)	// Error in Channel 10
-#define DMA_ERR_ERR11			((uint32_t)1<<11)	// Error in Channel 11
-#define DMA_ERR_ERR12			((uint32_t)1<<12)	// Error in Channel 12
-#define DMA_ERR_ERR13			((uint32_t)1<<13)	// Error in Channel 13
-#define DMA_ERR_ERR14			((uint32_t)1<<14)	// Error in Channel 14
-#define DMA_ERR_ERR15			((uint32_t)1<<15)	// Error in Channel 15
-#define DMA_HRS_HRS4			((uint32_t)1<<4)	// Hardware Request Status Channel 4
-#define DMA_HRS_HRS5			((uint32_t)1<<5)	// Hardware Request Status Channel 5
-#define DMA_HRS_HRS6			((uint32_t)1<<6)	// Hardware Request Status Channel 6
-#define DMA_HRS_HRS7			((uint32_t)1<<7)	// Hardware Request Status Channel 7
-#define DMA_HRS_HRS8			((uint32_t)1<<8)	// Hardware Request Status Channel 8
-#define DMA_HRS_HRS9			((uint32_t)1<<9)	// Hardware Request Status Channel 9
-#define DMA_HRS_HRS10			((uint32_t)1<<10)	// Hardware Request Status Channel 10
-#define DMA_HRS_HRS11			((uint32_t)1<<11)	// Hardware Request Status Channel 11
-#define DMA_HRS_HRS12			((uint32_t)1<<12)	// Hardware Request Status Channel 12
-#define DMA_HRS_HRS13			((uint32_t)1<<13)	// Hardware Request Status Channel 13
-#define DMA_HRS_HRS14			((uint32_t)1<<14)	// Hardware Request Status Channel 14
-#define DMA_HRS_HRS15			((uint32_t)1<<15)	// Hardware Request Status Channel 15
-#endif
+#define M_DMA_CX UINT32_C(1 << 17)   // Cancel Transfer
+#define M_DMA_ECX UINT32_C(1 << 16)  // Error Cancel Transfer
 #if DMA_NUM_CHANNELS >= 32
-#define DMA_ERQ_ERQ16			((uint32_t)1<<16)	// Enable DMA Request 16
-#define DMA_ERQ_ERQ17			((uint32_t)1<<17)	// Enable DMA Request 17
-#define DMA_ERQ_ERQ18			((uint32_t)1<<18)	// Enable DMA Request 18
-#define DMA_ERQ_ERQ19			((uint32_t)1<<19)	// Enable DMA Request 19
-#define DMA_ERQ_ERQ20			((uint32_t)1<<20)	// Enable DMA Request 20
-#define DMA_ERQ_ERQ21			((uint32_t)1<<21)	// Enable DMA Request 21
-#define DMA_ERQ_ERQ22			((uint32_t)1<<22)	// Enable DMA Request 22
-#define DMA_ERQ_ERQ23			((uint32_t)1<<23)	// Enable DMA Request 23
-#define DMA_ERQ_ERQ24			((uint32_t)1<<24)	// Enable DMA Request 24
-#define DMA_ERQ_ERQ25			((uint32_t)1<<25)	// Enable DMA Request 25
-#define DMA_ERQ_ERQ26			((uint32_t)1<<26)	// Enable DMA Request 26
-#define DMA_ERQ_ERQ27			((uint32_t)1<<27)	// Enable DMA Request 27
-#define DMA_ERQ_ERQ28			((uint32_t)1<<28)	// Enable DMA Request 28
-#define DMA_ERQ_ERQ29			((uint32_t)1<<29)	// Enable DMA Request 29
-#define DMA_ERQ_ERQ30			((uint32_t)1<<30)	// Enable DMA Request 30
-#define DMA_ERQ_ERQ31			((uint32_t)1<<31)	// Enable DMA Request 31
-#define DMA_INT_INT16			((uint32_t)1<<16)	// Interrupt Request 16
-#define DMA_INT_INT17			((uint32_t)1<<17)	// Interrupt Request 17
-#define DMA_INT_INT18			((uint32_t)1<<18)	// Interrupt Request 18
-#define DMA_INT_INT19			((uint32_t)1<<19)	// Interrupt Request 19
-#define DMA_INT_INT20			((uint32_t)1<<20)	// Interrupt Request 20
-#define DMA_INT_INT21			((uint32_t)1<<21)	// Interrupt Request 21
-#define DMA_INT_INT22			((uint32_t)1<<22)	// Interrupt Request 22
-#define DMA_INT_INT23			((uint32_t)1<<23)	// Interrupt Request 23
-#define DMA_INT_INT24			((uint32_t)1<<24)	// Interrupt Request 24
-#define DMA_INT_INT25			((uint32_t)1<<25)	// Interrupt Request 25
-#define DMA_INT_INT26			((uint32_t)1<<26)	// Interrupt Request 26
-#define DMA_INT_INT27			((uint32_t)1<<27)	// Interrupt Request 27
-#define DMA_INT_INT28			((uint32_t)1<<28)	// Interrupt Request 28
-#define DMA_INT_INT29			((uint32_t)1<<29)	// Interrupt Request 29
-#define DMA_INT_INT30			((uint32_t)1<<30)	// Interrupt Request 30
-#define DMA_INT_INT31			((uint32_t)1<<31)	// Interrupt Request 31
-#define DMA_ERR_ERR16			((uint32_t)1<<16)	// Error in Channel 16
-#define DMA_ERR_ERR17			((uint32_t)1<<17)	// Error in Channel 17
-#define DMA_ERR_ERR18			((uint32_t)1<<18)	// Error in Channel 18
-#define DMA_ERR_ERR19			((uint32_t)1<<19)	// Error in Channel 19
-#define DMA_ERR_ERR20			((uint32_t)1<<20)	// Error in Channel 20
-#define DMA_ERR_ERR21			((uint32_t)1<<21)	// Error in Channel 21
-#define DMA_ERR_ERR22			((uint32_t)1<<22)	// Error in Channel 22
-#define DMA_ERR_ERR23			((uint32_t)1<<23)	// Error in Channel 23
-#define DMA_ERR_ERR24			((uint32_t)1<<24)	// Error in Channel 24
-#define DMA_ERR_ERR25			((uint32_t)1<<25)	// Error in Channel 25
-#define DMA_ERR_ERR26			((uint32_t)1<<26)	// Error in Channel 26
-#define DMA_ERR_ERR27			((uint32_t)1<<27)	// Error in Channel 27
-#define DMA_ERR_ERR28			((uint32_t)1<<28)	// Error in Channel 28
-#define DMA_ERR_ERR29			((uint32_t)1<<29)	// Error in Channel 29
-#define DMA_ERR_ERR30			((uint32_t)1<<30)	// Error in Channel 30
-#define DMA_ERR_ERR31			((uint32_t)1<<31)	// Error in Channel 31
-#define DMA_HRS_HRS16			((uint32_t)1<<16)	// Hardware Request Status Channel 16
-#define DMA_HRS_HRS17			((uint32_t)1<<17)	// Hardware Request Status Channel 17
-#define DMA_HRS_HRS18			((uint32_t)1<<18)	// Hardware Request Status Channel 18
-#define DMA_HRS_HRS19			((uint32_t)1<<19)	// Hardware Request Status Channel 19
-#define DMA_HRS_HRS20			((uint32_t)1<<20)	// Hardware Request Status Channel 20
-#define DMA_HRS_HRS21			((uint32_t)1<<21)	// Hardware Request Status Channel 21
-#define DMA_HRS_HRS22			((uint32_t)1<<22)	// Hardware Request Status Channel 22
-#define DMA_HRS_HRS23			((uint32_t)1<<23)	// Hardware Request Status Channel 23
-#define DMA_HRS_HRS24			((uint32_t)1<<24)	// Hardware Request Status Channel 24
-#define DMA_HRS_HRS25			((uint32_t)1<<25)	// Hardware Request Status Channel 25
-#define DMA_HRS_HRS26			((uint32_t)1<<26)	// Hardware Request Status Channel 26
-#define DMA_HRS_HRS27			((uint32_t)1<<27)	// Hardware Request Status Channel 27
-#define DMA_HRS_HRS28			((uint32_t)1<<28)	// Hardware Request Status Channel 28
-#define DMA_HRS_HRS29			((uint32_t)1<<29)	// Hardware Request Status Channel 29
-#define DMA_HRS_HRS30			((uint32_t)1<<30)	// Hardware Request Status Channel 30
-#define DMA_HRS_HRS31			((uint32_t)1<<31)	// Hardware Request Status Channel 31
+#define M_DMA_GRP1PRI UINT32_C(0x400)
+#define M_DMA_GRP0PRI UINT32_C(0x100)
+#define M_DMA_ERGA UINT32_C(0x08)  // Enable Round Robin Group Arbitration
 #endif
+#define M_DMA_EMLM UINT32_C(0x80)  // Enable Minor Loop Mapping
+#define M_DMA_CLM UINT32_C(0x40)   // Continuous Link Mode
+#define M_DMA_HALT UINT32_C(0x20)  // Halt DMA Operations
+#define M_DMA_HOE UINT32_C(0x10)   // Halt On Error
+#define M_DMA_ERCA UINT32_C(0x04)  // Enable Round Robin Channel Arbitration
+#define M_DMA_EDBG UINT32_C(0x02)  // Enable Debug
+#define V_DMA_CHPRI(n) \
+  ((((uint8_t)(n)) & 15) << 0)     // Channel Arbitration Priority
+#define M_DMA_DPA UINT8_C(1 << 6)  // Disable PreEmpt Ability
+#define M_DMA_ECP UINT8_C(1 << 7)  // Enable PreEmption
+#define V_DMA_CEEI(n) \
+  ((((uint8_t)(n)) & 15) << 0)      // Clear Enable Error Interrupt
+#define M_DMA_CAEE UINT8_C(1 << 6)  // Clear All Enable Error Interrupts
+#define M_DMA_NOP UINT8_C(1 << 7)   // NOP
+#define V_DMA_SEEI(n) \
+  ((((uint8_t)(n)) & 15) << 0)      // Set Enable Error Interrupt
+#define M_DMA_SAEE UINT8_C(1 << 6)  // Set All Enable Error Interrupts
+#define V_DMA_CERQ(n) ((((uint8_t)(n)) & 15) << 0)  // Clear Enable Request
+#define M_DMA_CAER UINT8_C(1 << 6)                  // Clear All Enable Requests
+#define V_DMA_SERQ(n) ((((uint8_t)((n))&15) << 0)  // Set Enable Request
+#define M_DMA_SAER UINT8_C(1 << 6)                // Set All Enable Requests
+#define V_DMA_CDNE(n) ((((uint8_t)((n))&15) << 0)  // Clear Done Bit
+#define M_DMA_CADN UINT8_C(1 << 6)                // Clear All Done Bits
+#define V_DMA_SSRT(n) ((((uint8_t)((n))&15) << 0)  // Set Start Bit
+#define M_DMA_SAST UINT8_C(1 << 6)                // Set All Start Bits
+#define V_DMA_CERR(n) ((((uint8_t)((n))&15) << 0)  // Clear Error Indicator
+#define M_DMA_CAEI UINT8_C(1 << 6)                // Clear All Error Indicators
+#define V_DMA_CINT(n) ((((uint8_t)((n))&15) << 0)  // Clear Interrupt Request
+#define M_DMA_CAIR UINT8_C(1 << 6)  // Clear All Interrupt Requests
 
-#if DMA_NUM_CHANNELS >= 4
-#define DMA_DCHPRI3		(*(volatile uint8_t  *)0x40008100) // Channel n Priority Register
-#define DMA_DCHPRI2		(*(volatile uint8_t  *)0x40008101) // Channel n Priority Register
-#define DMA_DCHPRI1		(*(volatile uint8_t  *)0x40008102) // Channel n Priority Register
-#define DMA_DCHPRI0		(*(volatile uint8_t  *)0x40008103) // Channel n Priority Register
-#endif
-#define DMA_DCHPRI_CHPRI(n)		((uint8_t)(n & 15)<<0)	// Channel Arbitration Priority
-#define DMA_DCHPRI_DPA			((uint8_t)1<<6)		// Disable PreEmpt Ability
-#define DMA_DCHPRI_ECP			((uint8_t)1<<7)		// Enable PreEmption
-#if DMA_NUM_CHANNELS >= 16
-#define DMA_DCHPRI7		(*(volatile uint8_t  *)0x40008104) // Channel n Priority Register
-#define DMA_DCHPRI6		(*(volatile uint8_t  *)0x40008105) // Channel n Priority Register
-#define DMA_DCHPRI5		(*(volatile uint8_t  *)0x40008106) // Channel n Priority Register
-#define DMA_DCHPRI4		(*(volatile uint8_t  *)0x40008107) // Channel n Priority Register
-#define DMA_DCHPRI11		(*(volatile uint8_t  *)0x40008108) // Channel n Priority Register
-#define DMA_DCHPRI10		(*(volatile uint8_t  *)0x40008109) // Channel n Priority Register
-#define DMA_DCHPRI9		(*(volatile uint8_t  *)0x4000810A) // Channel n Priority Register
-#define DMA_DCHPRI8		(*(volatile uint8_t  *)0x4000810B) // Channel n Priority Register
-#define DMA_DCHPRI15		(*(volatile uint8_t  *)0x4000810C) // Channel n Priority Register
-#define DMA_DCHPRI14		(*(volatile uint8_t  *)0x4000810D) // Channel n Priority Register
-#define DMA_DCHPRI13		(*(volatile uint8_t  *)0x4000810E) // Channel n Priority Register
-#define DMA_DCHPRI12		(*(volatile uint8_t  *)0x4000810F) // Channel n Priority Register
-#endif
-#if DMA_NUM_CHANNELS >= 32
-#define DMA_DCHPRI19		(*(volatile uint8_t  *)0x40008110) // Channel n Priority Register
-#define DMA_DCHPRI18		(*(volatile uint8_t  *)0x40008111) // Channel n Priority Register
-#define DMA_DCHPRI17		(*(volatile uint8_t  *)0x40008112) // Channel n Priority Register
-#define DMA_DCHPRI16		(*(volatile uint8_t  *)0x40008113) // Channel n Priority Register
-#define DMA_DCHPRI23		(*(volatile uint8_t  *)0x40008114) // Channel n Priority Register
-#define DMA_DCHPRI22		(*(volatile uint8_t  *)0x40008115) // Channel n Priority Register
-#define DMA_DCHPRI21		(*(volatile uint8_t  *)0x40008116) // Channel n Priority Register
-#define DMA_DCHPRI20		(*(volatile uint8_t  *)0x40008117) // Channel n Priority Register
-#define DMA_DCHPRI27		(*(volatile uint8_t  *)0x40008118) // Channel n Priority Register
-#define DMA_DCHPRI26		(*(volatile uint8_t  *)0x40008119) // Channel n Priority Register
-#define DMA_DCHPRI25		(*(volatile uint8_t  *)0x4000811A) // Channel n Priority Register
-#define DMA_DCHPRI24		(*(volatile uint8_t  *)0x4000811B) // Channel n Priority Register
-#define DMA_DCHPRI31		(*(volatile uint8_t  *)0x4000811C) // Channel n Priority Register
-#define DMA_DCHPRI30		(*(volatile uint8_t  *)0x4000811D) // Channel n Priority Register
-#define DMA_DCHPRI29		(*(volatile uint8_t  *)0x4000811E) // Channel n Priority Register
-#define DMA_DCHPRI28		(*(volatile uint8_t  *)0x4000811F) // Channel n Priority Register
-#define DMA_CR_GRP0PRI			((uint32_t)0x100)
-#define DMA_CR_GRP1PRI			((uint32_t)0x400)
-#endif
+#define V_TCD_SMOD(n) ((((uint16_t)(n)) & 0x1F) << 11)
+#define V_TCD_SSIZE(n) ((((uint16_t)(n)) & 0x7) << 8)
+#define V_TCD_DMOD(n) ((((uint16_t)(n)) & 0x1F) << 3)
+#define V_TCD_DSIZE(n) ((((uint16_t)(n)) & 0x7) << 0)
+#define TCD_SIZE_8BIT 0
+#define TCD_SIZE_16BIT 1
+#define TCD_SIZE_32BIT 2
+#define TCD_SIZE_16BYTE 4
+#define TCD_SIZE_32BYTE \
+  5  // caution: this might not be supported in newer chips? TODO
+#define V_TCD_BWC(n) ((((uint16_t)(n)) & 0x3) << 14)
+#define V_TCD_MAJORLINKCH(n) ((((uint16_t)(n)) & 0xF) << 8)
+#define M_TCD_DONE 0x0080
+#define M_TCD_ACTIVE 0x0040
+#define M_TCD_MAJORELINK 0x0020
+#define M_TCD_ESG 0x0010
+#define M_TCD_DREQ 0x0008
+#define M_TCD_INTHALF 0x0004
+#define M_TCD_INTMAJOR 0x0002
+#define M_TCD_START 0x0001
+#define M_TCD_ELINK \
+  ((uint16_t)1 << 15)  // Enable channel linking on minor-loop complete
+#define V_TCD_LINKCH(n) ((((uint16_t)(n)) & 0xF) << 9)
+#define M_TCD_SMLOE (UINT32_C(1) << 31)  // Source Minor Loop Offset Enable
+#define M_TCD_DMLOE (UINT32_C(1) << 30)  // Destination Minor Loop Offset Enable
+#define V_TCD_MLOFF(n) ((((uint32_t)(n)) & 0xFFFFF) << 10)  // Minor loop offset
 
-#define DMA_TCD_ATTR_SMOD(n)		(((n) & 0x1F) << 11)
-#define DMA_TCD_ATTR_SSIZE(n)		(((n) & 0x7) << 8)
-#define DMA_TCD_ATTR_DMOD(n)		(((n) & 0x1F) << 3)
-#define DMA_TCD_ATTR_DSIZE(n)		(((n) & 0x7) << 0)
-#define DMA_TCD_ATTR_SIZE_8BIT		0
-#define DMA_TCD_ATTR_SIZE_16BIT		1
-#define DMA_TCD_ATTR_SIZE_32BIT		2
-#define DMA_TCD_ATTR_SIZE_16BYTE	4
-#define DMA_TCD_ATTR_SIZE_32BYTE	5 // caution: this might not be supported in newer chips?
-#define DMA_TCD_CSR_BWC(n)		(((n) & 0x3) << 14)
-#define DMA_TCD_CSR_BWC_MASK		0xC000
-#define DMA_TCD_CSR_MAJORLINKCH(n)	(((n) & 0xF) << 8)
-#define DMA_TCD_CSR_MAJORLINKCH_MASK	0x0F00
-#define DMA_TCD_CSR_DONE		0x0080
-#define DMA_TCD_CSR_ACTIVE		0x0040
-#define DMA_TCD_CSR_MAJORELINK		0x0020
-#define DMA_TCD_CSR_ESG			0x0010
-#define DMA_TCD_CSR_DREQ		0x0008
-#define DMA_TCD_CSR_INTHALF		0x0004
-#define DMA_TCD_CSR_INTMAJOR		0x0002
-#define DMA_TCD_CSR_START		0x0001
-#define DMA_TCD_CITER_MASK		((uint16_t)0x7FFF)	   // Loop count mask
-#define DMA_TCD_CITER_ELINK		((uint16_t)1<<15)	   // Enable channel linking on minor-loop complete
-#define DMA_TCD_BITER_MASK		((uint16_t)0x7FFF)	   // Loop count mask
-#define DMA_TCD_BITER_ELINK		((uint16_t)1<<15)	   // Enable channel linking on minor-loop complete
-#define DMA_TCD_BITER_ELINKYES_ELINK		0x8000
-#define DMA_TCD_BITER_ELINKYES_LINKCH(n)	(((n) & 0xF) << 9)
-#define DMA_TCD_BITER_ELINKYES_LINKCH_MASK	0x1E00
-#define DMA_TCD_BITER_ELINKYES_BITER(n)		(((n) & 0x1FF) << 0)
-#define DMA_TCD_BITER_ELINKYES_BITER_MASK	0x01FF
-#define DMA_TCD_CITER_ELINKYES_ELINK		0x8000
-#define DMA_TCD_CITER_ELINKYES_LINKCH(n)	(((n) & 0xF) << 9)
-#define DMA_TCD_CITER_ELINKYES_LINKCH_MASK	0x1E00
-#define DMA_TCD_CITER_ELINKYES_CITER(n)		(((n) & 0x1FF) << 0)
-#define DMA_TCD_CITER_ELINKYES_CITER_MASK	0x01FF
-#define DMA_TCD_NBYTES_SMLOE		    ((uint32_t)1<<31)		    // Source Minor Loop Offset Enable
-#define DMA_TCD_NBYTES_DMLOE		    ((uint32_t)1<<30)		    // Destination Minor Loop Offset Enable
-#define DMA_TCD_NBYTES_MLOFFNO_NBYTES(n)    ((uint32_t)((n) & 0x3FFFFFFF))  // NBytes transfer count when minor loop disabled
-#define DMA_TCD_NBYTES_MLOFFYES_NBYTES(n)   ((uint32_t)((n) & 0x3FF))	    // NBytes transfer count when minor loop enabled
-#define DMA_TCD_NBYTES_MLOFFYES_MLOFF(n)    ((uint32_t)((n) & 0xFFFFF)<<10) // Minor loop offset
+typedef struct {
+  volatile void *volatile SADDR;  // TCD Source Address
+  volatile int16_t SOFF;         // TCD Signed Source Address Offset
+  volatile uint16_t ATTR;         // TCD Transfer Attributes
+  volatile uint32_t NBYTES;       // TCD Minor Byte Count
+  volatile uint32_t SLAST;        // TCD Last Source Address Adjustment
+  volatile void *volatile DADDR;  // TCD Destination Address
+  volatile int16_t DOFF;         // TCD Signed Destination Address Offset
+  volatile uint16_t CITER;     // TCD Current Minor Loop Link, Major Loop Count
+  volatile uint32_t DLASTSGA;  // TCD Last Destination Address
+                               // Adjustment/Scatter Gather Address
+  volatile uint16_t CSR;       // TCD Control and Status
+  volatile uint16_t BITER;  // TCD Beginning Minor Loop Link, Major Loop Count,
+                            // Channel Linking Enabled
+} KINETIS_TCD_t __attribute__((aligned(0x20)));
+static_assert(sizeof(KINETIS_TCD_t) == 0x20, "padding is wrong");
+typedef struct {
+  volatile uint32_t CR;  // Control Register
+  volatile uint32_t ES;  // Error Status Register
+  volatile uint32_t unused1;
+  volatile uint32_t ERQ;  // Enable Request Register
+  volatile uint32_t unused2;
+  volatile uint32_t EEI;  // Enable Error Interrupt Register
+  volatile uint8_t CEEI;  // Clear Enable Error Interrupt Register
+  volatile uint8_t SEEI;  // Set Enable Error Interrupt Register
+  volatile uint8_t CERQ;  // Clear Enable Request Register
+  volatile uint8_t SERQ;  // Set Enable Request Register
+  volatile uint8_t CDNE;  // Clear DONE Status Bit Register
+  volatile uint8_t SSRT;  // Set START Bit Register
+  volatile uint8_t CERR;  // Clear Error Register
+  volatile uint8_t CINT;  // Clear Interrupt Request Register
+  volatile uint32_t unused3;
+  volatile uint32_t INT;  // Interrupt Request Register
+  volatile uint32_t unused4;
+  volatile uint32_t ERR;  // Error Register
+  volatile uint32_t unused5;
+  volatile uint32_t HRS;  // Hardware Request Status Register
 
-#if DMA_NUM_CHANNELS >= 4
-#define DMA_TCD0_SADDR		(*(volatile const void * volatile *)0x40009000) // TCD Source Address
-#define DMA_TCD0_SOFF		(*(volatile int16_t *)0x40009004)  // TCD Signed Source Address Offset
-#define DMA_TCD0_ATTR		(*(volatile uint16_t *)0x40009006) // TCD Transfer Attributes
-#define DMA_TCD0_NBYTES_MLNO	(*(volatile uint32_t *)0x40009008) // TCD Minor Byte Count (Minor Loop Disabled)
-#define DMA_TCD0_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009008) // TCD Signed Minor Loop Offset (Minor Loop Enabled and Offset Disabled)
-#define DMA_TCD0_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009008) // TCD Signed Minor Loop Offset (Minor Loop and Offset Enabled)
-#define DMA_TCD0_SLAST		(*(volatile int32_t *)0x4000900C)  // TCD Last Source Address Adjustment
-#define DMA_TCD0_DADDR		(*(volatile void * volatile *)0x40009010) // TCD Destination Address
-#define DMA_TCD0_DOFF		(*(volatile int16_t *)0x40009014)  // TCD Signed Destination Address Offset
-#define DMA_TCD0_CITER_ELINKYES (*(volatile uint16_t *)0x40009016) // TCD Current Minor Loop Link, Major Loop Count, Channel Linking Enabled
-#define DMA_TCD0_CITER_ELINKNO	(*(volatile uint16_t *)0x40009016) // ??
-#define DMA_TCD0_DLASTSGA	(*(volatile int32_t *)0x40009018)  // TCD Last Destination Address Adjustment/Scatter Gather Address
-#define DMA_TCD0_CSR		(*(volatile uint16_t *)0x4000901C) // TCD Control and Status
-#define DMA_TCD0_BITER_ELINKYES (*(volatile uint16_t *)0x4000901E) // TCD Beginning Minor Loop Link, Major Loop Count, Channel Linking Enabled
-#define DMA_TCD0_BITER_ELINKNO	(*(volatile uint16_t *)0x4000901E) // TCD Beginning Minor Loop Link, Major Loop Count, Channel Linking Disabled
+  volatile uint32_t unused6[50];
+  volatile uint8_t CHPRIraw[DMA_NUM_CHANNELS];
+#define CHPRI(n)                                    \
+  CHPRIraw[((unsigned int)(n) & ~(unsigned int)3) | \
+           (3 - ((unsigned int)(n) & (unsigned int)3))]
 
-#define DMA_TCD1_SADDR		(*(volatile const void * volatile *)0x40009020) // TCD Source Address
-#define DMA_TCD1_SOFF		(*(volatile int16_t *)0x40009024)  // TCD Signed Source Address Offset
-#define DMA_TCD1_ATTR		(*(volatile uint16_t *)0x40009026) // TCD Transfer Attributes
-#define DMA_TCD1_NBYTES_MLNO	(*(volatile uint32_t *)0x40009028) // TCD Minor Byte Count, Minor Loop Disabled
-#define DMA_TCD1_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009028) // TCD Signed Minor Loop Offset, Minor Loop Enabled and Offset Disabled
-#define DMA_TCD1_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009028) // TCD Signed Minor Loop Offset, Minor Loop and Offset Enabled
-#define DMA_TCD1_SLAST		(*(volatile int32_t *)0x4000902C)  // TCD Last Source Address Adjustment
-#define DMA_TCD1_DADDR		(*(volatile void * volatile *)0x40009030) // TCD Destination Address
-#define DMA_TCD1_DOFF		(*(volatile int16_t *)0x40009034)  // TCD Signed Destination Address Offset
-#define DMA_TCD1_CITER_ELINKYES (*(volatile uint16_t *)0x40009036) // TCD Current Minor Loop Link, Major Loop Count, Channel Linking Enabled
-#define DMA_TCD1_CITER_ELINKNO	(*(volatile uint16_t *)0x40009036) // ??
-#define DMA_TCD1_DLASTSGA	(*(volatile int32_t *)0x40009038)  // TCD Last Destination Address Adjustment/Scatter Gather Address
-#define DMA_TCD1_CSR		(*(volatile uint16_t *)0x4000903C) // TCD Control and Status
-#define DMA_TCD1_BITER_ELINKYES (*(volatile uint16_t *)0x4000903E) // TCD Beginning Minor Loop Link, Major Loop Count Channel Linking Enabled
-#define DMA_TCD1_BITER_ELINKNO	(*(volatile uint16_t *)0x4000903E) // TCD Beginning Minor Loop Link, Major Loop Count, Channel Linking Disabled
-
-#define DMA_TCD2_SADDR		(*(volatile const void * volatile *)0x40009040) // TCD Source Address
-#define DMA_TCD2_SOFF		(*(volatile int16_t *)0x40009044)  // TCD Signed Source Address Offset
-#define DMA_TCD2_ATTR		(*(volatile uint16_t *)0x40009046) // TCD Transfer Attributes
-#define DMA_TCD2_NBYTES_MLNO	(*(volatile uint32_t *)0x40009048) // TCD Minor Byte Count, Minor Loop Disabled
-#define DMA_TCD2_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009048) // TCD Signed Minor Loop Offset, Minor Loop Enabled and Offset Disabled
-#define DMA_TCD2_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009048) // TCD Signed Minor Loop Offset, Minor Loop and Offset Enabled
-#define DMA_TCD2_SLAST		(*(volatile int32_t *)0x4000904C)  // TCD Last Source Address Adjustment
-#define DMA_TCD2_DADDR		(*(volatile void * volatile *)0x40009050) // TCD Destination Address
-#define DMA_TCD2_DOFF		(*(volatile int16_t *)0x40009054)  // TCD Signed Destination Address Offset
-#define DMA_TCD2_CITER_ELINKYES (*(volatile uint16_t *)0x40009056) // TCD Current Minor Loop Link, Major Loop Count, Channel Linking Enabled
-#define DMA_TCD2_CITER_ELINKNO	(*(volatile uint16_t *)0x40009056) // ??
-#define DMA_TCD2_DLASTSGA	(*(volatile int32_t *)0x40009058)  // TCD Last Destination Address Adjustment/Scatter Gather Address
-#define DMA_TCD2_CSR		(*(volatile uint16_t *)0x4000905C) // TCD Control and Status
-#define DMA_TCD2_BITER_ELINKYES (*(volatile uint16_t *)0x4000905E) // TCD Beginning Minor Loop Link, Major Loop Count, Channel Linking Enabled
-#define DMA_TCD2_BITER_ELINKNO	(*(volatile uint16_t *)0x4000905E) // TCD Beginning Minor Loop Link, Major Loop Count, Channel Linking Disabled
-
-#define DMA_TCD3_SADDR		(*(volatile const void * volatile *)0x40009060) // TCD Source Address
-#define DMA_TCD3_SOFF		(*(volatile int16_t *)0x40009064)  // TCD Signed Source Address Offset
-#define DMA_TCD3_ATTR		(*(volatile uint16_t *)0x40009066) // TCD Transfer Attributes
-#define DMA_TCD3_NBYTES_MLNO	(*(volatile uint32_t *)0x40009068) // TCD Minor Byte Count, Minor Loop Disabled
-#define DMA_TCD3_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009068) // TCD Signed Minor Loop Offset, Minor Loop Enabled and Offset Disabled
-#define DMA_TCD3_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009068) // TCD Signed Minor Loop Offset, Minor Loop and Offset Enabled
-#define DMA_TCD3_SLAST		(*(volatile int32_t *)0x4000906C)  // TCD Last Source Address Adjustment
-#define DMA_TCD3_DADDR		(*(volatile void * volatile *)0x40009070) // TCD Destination Address
-#define DMA_TCD3_DOFF		(*(volatile int16_t *)0x40009074)  // TCD Signed Destination Address Offset
-#define DMA_TCD3_CITER_ELINKYES (*(volatile uint16_t *)0x40009076) // TCD Current Minor Loop Link, Major Loop Count, Channel Linking Enabled
-#define DMA_TCD3_CITER_ELINKNO	(*(volatile uint16_t *)0x40009076) // ??
-#define DMA_TCD3_DLASTSGA	(*(volatile int32_t *)0x40009078)  // TCD Last Destination Address Adjustment/Scatter Gather Address
-#define DMA_TCD3_CSR		(*(volatile uint16_t *)0x4000907C) // TCD Control and Status
-#define DMA_TCD3_BITER_ELINKYES (*(volatile uint16_t *)0x4000907E) // TCD Beginning Minor Loop Link, Major Loop Count ,Channel Linking Enabled
-#define DMA_TCD3_BITER_ELINKNO	(*(volatile uint16_t *)0x4000907E) // TCD Beginning Minor Loop Link, Major Loop Count ,Channel Linking Disabled
-
-#define DMA_TCD4_SADDR		(*(volatile const void * volatile *)0x40009080) // TCD Source Addr
-#define DMA_TCD4_SOFF		(*(volatile int16_t *)0x40009084)  // TCD Signed Source Address Offset
-#define DMA_TCD4_ATTR		(*(volatile uint16_t *)0x40009086) // TCD Transfer Attributes
-#define DMA_TCD4_NBYTES_MLNO	(*(volatile uint32_t *)0x40009088) // TCD Minor Byte Count
-#define DMA_TCD4_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009088) // TCD Signed Minor Loop Offset
-#define DMA_TCD4_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009088) // TCD Signed Minor Loop Offset
-#define DMA_TCD4_SLAST		(*(volatile int32_t *)0x4000908C)  // TCD Last Source Addr Adj.
-#define DMA_TCD4_DADDR		(*(volatile void * volatile *)0x40009090) // TCD Destination Address
-#define DMA_TCD4_DOFF		(*(volatile int16_t *)0x40009094)  // TCD Signed Dest Address Offset
-#define DMA_TCD4_CITER_ELINKYES (*(volatile uint16_t *)0x40009096) // TCD Current Minor Loop Link
-#define DMA_TCD4_CITER_ELINKNO	(*(volatile uint16_t *)0x40009096) // ??
-#define DMA_TCD4_DLASTSGA	(*(volatile int32_t *)0x40009098)  // TCD Last Destination Addr Adj
-#define DMA_TCD4_CSR		(*(volatile uint16_t *)0x4000909C) // TCD Control and Status
-#define DMA_TCD4_BITER_ELINKYES (*(volatile uint16_t *)0x4000909E) // TCD Beginning Minor Loop Link
-#define DMA_TCD4_BITER_ELINKNO	(*(volatile uint16_t *)0x4000909E) // TCD Beginning Minor Loop Link
-#endif
-
-#if DMA_NUM_CHANNELS >= 16
-#define DMA_TCD5_SADDR		(*(volatile const void * volatile *)0x400090A0) // TCD Source Addr
-#define DMA_TCD5_SOFF		(*(volatile int16_t *)0x400090A4)  // TCD Signed Source Address Offset
-#define DMA_TCD5_ATTR		(*(volatile uint16_t *)0x400090A6) // TCD Transfer Attributes
-#define DMA_TCD5_NBYTES_MLNO	(*(volatile uint32_t *)0x400090A8) // TCD Minor Byte Count
-#define DMA_TCD5_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400090A8) // TCD Signed Minor Loop Offset
-#define DMA_TCD5_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400090A8) // TCD Signed Minor Loop Offset
-#define DMA_TCD5_SLAST		(*(volatile int32_t *)0x400090AC)  // TCD Last Source Addr Adj.
-#define DMA_TCD5_DADDR		(*(volatile void * volatile *)0x400090B0) // TCD Destination Address
-#define DMA_TCD5_DOFF		(*(volatile int16_t *)0x400090B4)  // TCD Signed Dest Address Offset
-#define DMA_TCD5_CITER_ELINKYES (*(volatile uint16_t *)0x400090B6) // TCD Current Minor Loop Link
-#define DMA_TCD5_CITER_ELINKNO	(*(volatile uint16_t *)0x400090B6) // ??
-#define DMA_TCD5_DLASTSGA	(*(volatile int32_t *)0x400090B8)  // TCD Last Destination Addr Adj
-#define DMA_TCD5_CSR		(*(volatile uint16_t *)0x400090BC) // TCD Control and Status
-#define DMA_TCD5_BITER_ELINKYES (*(volatile uint16_t *)0x400090BE) // TCD Beginning Minor Loop Link
-#define DMA_TCD5_BITER_ELINKNO	(*(volatile uint16_t *)0x400090BE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD6_SADDR		(*(volatile const void * volatile *)0x400090C0) // TCD Source Addr
-#define DMA_TCD6_SOFF		(*(volatile int16_t *)0x400090C4)  // TCD Signed Source Address Offset
-#define DMA_TCD6_ATTR		(*(volatile uint16_t *)0x400090C6) // TCD Transfer Attributes
-#define DMA_TCD6_NBYTES_MLNO	(*(volatile uint32_t *)0x400090C8) // TCD Minor Byte Count
-#define DMA_TCD6_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400090C8) // TCD Signed Minor Loop Offset
-#define DMA_TCD6_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400090C8) // TCD Signed Minor Loop Offset
-#define DMA_TCD6_SLAST		(*(volatile int32_t *)0x400090CC)  // TCD Last Source Addr Adj.
-#define DMA_TCD6_DADDR		(*(volatile void * volatile *)0x400090D0) // TCD Destination Address
-#define DMA_TCD6_DOFF		(*(volatile int16_t *)0x400090D4)  // TCD Signed Dest Address Offset
-#define DMA_TCD6_CITER_ELINKYES (*(volatile uint16_t *)0x400090D6) // TCD Current Minor Loop Link
-#define DMA_TCD6_CITER_ELINKNO	(*(volatile uint16_t *)0x400090D6) // ??
-#define DMA_TCD6_DLASTSGA	(*(volatile int32_t *)0x400090D8)  // TCD Last Destination Addr Adj
-#define DMA_TCD6_CSR		(*(volatile uint16_t *)0x400090DC) // TCD Control and Status
-#define DMA_TCD6_BITER_ELINKYES (*(volatile uint16_t *)0x400090DE) // TCD Beginning Minor Loop Link
-#define DMA_TCD6_BITER_ELINKNO	(*(volatile uint16_t *)0x400090DE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD7_SADDR		(*(volatile const void * volatile *)0x400090E0) // TCD Source Addr
-#define DMA_TCD7_SOFF		(*(volatile int16_t *)0x400090E4)  // TCD Signed Source Address Offset
-#define DMA_TCD7_ATTR		(*(volatile uint16_t *)0x400090E6) // TCD Transfer Attributes
-#define DMA_TCD7_NBYTES_MLNO	(*(volatile uint32_t *)0x400090E8) // TCD Minor Byte Count
-#define DMA_TCD7_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400090E8) // TCD Signed Minor Loop Offset
-#define DMA_TCD7_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400090E8) // TCD Signed Minor Loop Offset
-#define DMA_TCD7_SLAST		(*(volatile int32_t *)0x400090EC)  // TCD Last Source Addr Adj.
-#define DMA_TCD7_DADDR		(*(volatile void * volatile *)0x400090F0) // TCD Destination Address
-#define DMA_TCD7_DOFF		(*(volatile int16_t *)0x400090F4)  // TCD Signed Dest Address Offset
-#define DMA_TCD7_CITER_ELINKYES (*(volatile uint16_t *)0x400090F6) // TCD Current Minor Loop Link
-#define DMA_TCD7_CITER_ELINKNO	(*(volatile uint16_t *)0x400090F6) // ??
-#define DMA_TCD7_DLASTSGA	(*(volatile int32_t *)0x400090F8)  // TCD Last Destination Addr Adj
-#define DMA_TCD7_CSR		(*(volatile uint16_t *)0x400090FC) // TCD Control and Status
-#define DMA_TCD7_BITER_ELINKYES (*(volatile uint16_t *)0x400090FE) // TCD Beginning Minor Loop Link
-#define DMA_TCD7_BITER_ELINKNO	(*(volatile uint16_t *)0x400090FE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD8_SADDR		(*(volatile const void * volatile *)0x40009100) // TCD Source Addr
-#define DMA_TCD8_SOFF		(*(volatile int16_t *)0x40009104)  // TCD Signed Source Address Offset
-#define DMA_TCD8_ATTR		(*(volatile uint16_t *)0x40009106) // TCD Transfer Attributes
-#define DMA_TCD8_NBYTES_MLNO	(*(volatile uint32_t *)0x40009108) // TCD Minor Byte Count
-#define DMA_TCD8_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009108) // TCD Signed Minor Loop Offset
-#define DMA_TCD8_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009108) // TCD Signed Minor Loop Offset
-#define DMA_TCD8_SLAST		(*(volatile int32_t *)0x4000910C)  // TCD Last Source Addr Adj.
-#define DMA_TCD8_DADDR		(*(volatile void * volatile *)0x40009110) // TCD Destination Address
-#define DMA_TCD8_DOFF		(*(volatile int16_t *)0x40009114)  // TCD Signed Dest Address Offset
-#define DMA_TCD8_CITER_ELINKYES (*(volatile uint16_t *)0x40009116) // TCD Current Minor Loop Link
-#define DMA_TCD8_CITER_ELINKNO	(*(volatile uint16_t *)0x40009116) // ??
-#define DMA_TCD8_DLASTSGA	(*(volatile int32_t *)0x40009118)  // TCD Last Destination Addr Adj
-#define DMA_TCD8_CSR		(*(volatile uint16_t *)0x4000911C) // TCD Control and Status
-#define DMA_TCD8_BITER_ELINKYES (*(volatile uint16_t *)0x4000911E) // TCD Beginning Minor Loop Link
-#define DMA_TCD8_BITER_ELINKNO	(*(volatile uint16_t *)0x4000911E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD9_SADDR		(*(volatile const void * volatile *)0x40009120) // TCD Source Addr
-#define DMA_TCD9_SOFF		(*(volatile int16_t *)0x40009124)  // TCD Signed Source Address Offset
-#define DMA_TCD9_ATTR		(*(volatile uint16_t *)0x40009126) // TCD Transfer Attributes
-#define DMA_TCD9_NBYTES_MLNO	(*(volatile uint32_t *)0x40009128) // TCD Minor Byte Count
-#define DMA_TCD9_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009128) // TCD Signed Minor Loop Offset
-#define DMA_TCD9_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009128) // TCD Signed Minor Loop Offset
-#define DMA_TCD9_SLAST		(*(volatile int32_t *)0x4000912C)  // TCD Last Source Addr Adj.
-#define DMA_TCD9_DADDR		(*(volatile void * volatile *)0x40009130) // TCD Destination Address
-#define DMA_TCD9_DOFF		(*(volatile int16_t *)0x40009134)  // TCD Signed Dest Address Offset
-#define DMA_TCD9_CITER_ELINKYES (*(volatile uint16_t *)0x40009136) // TCD Current Minor Loop Link
-#define DMA_TCD9_CITER_ELINKNO	(*(volatile uint16_t *)0x40009136) // ??
-#define DMA_TCD9_DLASTSGA	(*(volatile int32_t *)0x40009138)  // TCD Last Destination Addr Adj
-#define DMA_TCD9_CSR		(*(volatile uint16_t *)0x4000913C) // TCD Control and Status
-#define DMA_TCD9_BITER_ELINKYES (*(volatile uint16_t *)0x4000913E) // TCD Beginning Minor Loop Link
-#define DMA_TCD9_BITER_ELINKNO	(*(volatile uint16_t *)0x4000913E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD10_SADDR		(*(volatile const void * volatile *)0x40009140) // TCD Source Addr
-#define DMA_TCD10_SOFF		(*(volatile int16_t *)0x40009144)	 // TCD Signed Source Address Offset
-#define DMA_TCD10_ATTR		(*(volatile uint16_t *)0x40009146) // TCD Transfer Attributes
-#define DMA_TCD10_NBYTES_MLNO	(*(volatile uint32_t *)0x40009148) // TCD Minor Byte Count
-#define DMA_TCD10_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009148) // TCD Signed Minor Loop Offset
-#define DMA_TCD10_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009148) // TCD Signed Minor Loop Offset
-#define DMA_TCD10_SLAST		(*(volatile int32_t *)0x4000914C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD10_DADDR		(*(volatile void * volatile *)0x40009150) // TCD Destination Address
-#define DMA_TCD10_DOFF		(*(volatile int16_t *)0x40009154)	 // TCD Signed Dest Address Offset
-#define DMA_TCD10_CITER_ELINKYES (*(volatile uint16_t *)0x40009156) // TCD Current Minor Loop Link
-#define DMA_TCD10_CITER_ELINKNO	(*(volatile uint16_t *)0x40009156) // ??
-#define DMA_TCD10_DLASTSGA	(*(volatile int32_t *)0x40009158)	 // TCD Last Destination Addr Adj
-#define DMA_TCD10_CSR		(*(volatile uint16_t *)0x4000915C) // TCD Control and Status
-#define DMA_TCD10_BITER_ELINKYES (*(volatile uint16_t *)0x4000915E) // TCD Beginning Minor Loop Link
-#define DMA_TCD10_BITER_ELINKNO	(*(volatile uint16_t *)0x4000915E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD11_SADDR		(*(volatile const void * volatile *)0x40009160) // TCD Source Addr
-#define DMA_TCD11_SOFF		(*(volatile int16_t *)0x40009164)	 // TCD Signed Source Address Offset
-#define DMA_TCD11_ATTR		(*(volatile uint16_t *)0x40009166) // TCD Transfer Attributes
-#define DMA_TCD11_NBYTES_MLNO	(*(volatile uint32_t *)0x40009168) // TCD Minor Byte Count
-#define DMA_TCD11_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009168) // TCD Signed Minor Loop Offset
-#define DMA_TCD11_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009168) // TCD Signed Minor Loop Offset
-#define DMA_TCD11_SLAST		(*(volatile int32_t *)0x4000916C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD11_DADDR		(*(volatile void * volatile *)0x40009170) // TCD Destination Address
-#define DMA_TCD11_DOFF		(*(volatile int16_t *)0x40009174)	 // TCD Signed Dest Address Offset
-#define DMA_TCD11_CITER_ELINKYES (*(volatile uint16_t *)0x40009176) // TCD Current Minor Loop Link
-#define DMA_TCD11_CITER_ELINKNO	(*(volatile uint16_t *)0x40009176) // ??
-#define DMA_TCD11_DLASTSGA	(*(volatile int32_t *)0x40009178)	 // TCD Last Destination Addr Adj
-#define DMA_TCD11_CSR		(*(volatile uint16_t *)0x4000917C) // TCD Control and Status
-#define DMA_TCD11_BITER_ELINKYES (*(volatile uint16_t *)0x4000917E) // TCD Beginning Minor Loop Link
-#define DMA_TCD11_BITER_ELINKNO	(*(volatile uint16_t *)0x4000917E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD12_SADDR		(*(volatile const void * volatile *)0x40009180) // TCD Source Addr
-#define DMA_TCD12_SOFF		(*(volatile int16_t *)0x40009184)	 // TCD Signed Source Address Offset
-#define DMA_TCD12_ATTR		(*(volatile uint16_t *)0x40009186) // TCD Transfer Attributes
-#define DMA_TCD12_NBYTES_MLNO	(*(volatile uint32_t *)0x40009188) // TCD Minor Byte Count
-#define DMA_TCD12_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009188) // TCD Signed Minor Loop Offset
-#define DMA_TCD12_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009188) // TCD Signed Minor Loop Offset
-#define DMA_TCD12_SLAST		(*(volatile int32_t *)0x4000918C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD12_DADDR		(*(volatile void * volatile *)0x40009190) // TCD Destination Address
-#define DMA_TCD12_DOFF		(*(volatile int16_t *)0x40009194)	 // TCD Signed Dest Address Offset
-#define DMA_TCD12_CITER_ELINKYES (*(volatile uint16_t *)0x40009196) // TCD Current Minor Loop Link
-#define DMA_TCD12_CITER_ELINKNO	(*(volatile uint16_t *)0x40009196) // ??
-#define DMA_TCD12_DLASTSGA	(*(volatile int32_t *)0x40009198)	 // TCD Last Destination Addr Adj
-#define DMA_TCD12_CSR		(*(volatile uint16_t *)0x4000919C) // TCD Control and Status
-#define DMA_TCD12_BITER_ELINKYES (*(volatile uint16_t *)0x4000919E) // TCD Beginning Minor Loop Link
-#define DMA_TCD12_BITER_ELINKNO	(*(volatile uint16_t *)0x4000919E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD13_SADDR		(*(volatile const void * volatile *)0x400091A0) // TCD Source Addr
-#define DMA_TCD13_SOFF		(*(volatile int16_t *)0x400091A4)	 // TCD Signed Source Address Offset
-#define DMA_TCD13_ATTR		(*(volatile uint16_t *)0x400091A6) // TCD Transfer Attributes
-#define DMA_TCD13_NBYTES_MLNO	(*(volatile uint32_t *)0x400091A8) // TCD Minor Byte Count
-#define DMA_TCD13_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400091A8) // TCD Signed Minor Loop Offset
-#define DMA_TCD13_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400091A8) // TCD Signed Minor Loop Offset
-#define DMA_TCD13_SLAST		(*(volatile int32_t *)0x400091AC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD13_DADDR		(*(volatile void * volatile *)0x400091B0) // TCD Destination Address
-#define DMA_TCD13_DOFF		(*(volatile int16_t *)0x400091B4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD13_CITER_ELINKYES (*(volatile uint16_t *)0x400091B6) // TCD Current Minor Loop Link
-#define DMA_TCD13_CITER_ELINKNO	(*(volatile uint16_t *)0x400091B6) // ??
-#define DMA_TCD13_DLASTSGA	(*(volatile int32_t *)0x400091B8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD13_CSR		(*(volatile uint16_t *)0x400091BC) // TCD Control and Status
-#define DMA_TCD13_BITER_ELINKYES (*(volatile uint16_t *)0x400091BE) // TCD Beginning Minor Loop Link
-#define DMA_TCD13_BITER_ELINKNO	(*(volatile uint16_t *)0x400091BE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD14_SADDR		(*(volatile const void * volatile *)0x400091C0) // TCD Source Addr
-#define DMA_TCD14_SOFF		(*(volatile int16_t *)0x400091C4)	 // TCD Signed Source Address Offset
-#define DMA_TCD14_ATTR		(*(volatile uint16_t *)0x400091C6) // TCD Transfer Attributes
-#define DMA_TCD14_NBYTES_MLNO	(*(volatile uint32_t *)0x400091C8) // TCD Minor Byte Count
-#define DMA_TCD14_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400091C8) // TCD Signed Minor Loop Offset
-#define DMA_TCD14_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400091C8) // TCD Signed Minor Loop Offset
-#define DMA_TCD14_SLAST		(*(volatile int32_t *)0x400091CC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD14_DADDR		(*(volatile void * volatile *)0x400091D0) // TCD Destination Address
-#define DMA_TCD14_DOFF		(*(volatile int16_t *)0x400091D4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD14_CITER_ELINKYES (*(volatile uint16_t *)0x400091D6) // TCD Current Minor Loop Link
-#define DMA_TCD14_CITER_ELINKNO	(*(volatile uint16_t *)0x400091D6) // ??
-#define DMA_TCD14_DLASTSGA	(*(volatile int32_t *)0x400091D8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD14_CSR		(*(volatile uint16_t *)0x400091DC) // TCD Control and Status
-#define DMA_TCD14_BITER_ELINKYES (*(volatile uint16_t *)0x400091DE) // TCD Beginning Minor Loop Link
-#define DMA_TCD14_BITER_ELINKNO	(*(volatile uint16_t *)0x400091DE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD15_SADDR		(*(volatile const void * volatile *)0x400091E0) // TCD Source Addr
-#define DMA_TCD15_SOFF		(*(volatile int16_t *)0x400091E4)	 // TCD Signed Source Address Offset
-#define DMA_TCD15_ATTR		(*(volatile uint16_t *)0x400091E6) // TCD Transfer Attributes
-#define DMA_TCD15_NBYTES_MLNO	(*(volatile uint32_t *)0x400091E8) // TCD Minor Byte Count
-#define DMA_TCD15_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400091E8) // TCD Signed Minor Loop Offset
-#define DMA_TCD15_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400091E8) // TCD Signed Minor Loop Offset
-#define DMA_TCD15_SLAST		(*(volatile int32_t *)0x400091EC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD15_DADDR		(*(volatile void * volatile *)0x400091F0) // TCD Destination Address
-#define DMA_TCD15_DOFF		(*(volatile int16_t *)0x400091F4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD15_CITER_ELINKYES (*(volatile uint16_t *)0x400091F6) // TCD Current Minor Loop Link
-#define DMA_TCD15_CITER_ELINKNO	(*(volatile uint16_t *)0x400091F6) // ??
-#define DMA_TCD15_DLASTSGA	(*(volatile int32_t *)0x400091F8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD15_CSR		(*(volatile uint16_t *)0x400091FC) // TCD Control and Status
-#define DMA_TCD15_BITER_ELINKYES (*(volatile uint16_t *)0x400091FE) // TCD Beginning Minor Loop Link
-#define DMA_TCD15_BITER_ELINKNO	(*(volatile uint16_t *)0x400091FE) // TCD Beginning Minor Loop Link
-#endif
-
-#if DMA_NUM_CHANNELS >= 32
-#define DMA_TCD16_SADDR		(*(volatile const void * volatile *)0x40009200) // TCD Source Addr
-#define DMA_TCD16_SOFF		(*(volatile int16_t *)0x40009204)	 // TCD Signed Source Address Offset
-#define DMA_TCD16_ATTR		(*(volatile uint16_t *)0x40009206) // TCD Transfer Attributes
-#define DMA_TCD16_NBYTES_MLNO	(*(volatile uint32_t *)0x40009208) // TCD Minor Byte Count
-#define DMA_TCD16_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009208) // TCD Signed Minor Loop Offset
-#define DMA_TCD16_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009208) // TCD Signed Minor Loop Offset
-#define DMA_TCD16_SLAST		(*(volatile int32_t *)0x4000920C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD16_DADDR		(*(volatile void * volatile *)0x40009210) // TCD Destination Address
-#define DMA_TCD16_DOFF		(*(volatile int16_t *)0x40009214)	 // TCD Signed Dest Address Offset
-#define DMA_TCD16_CITER_ELINKYES (*(volatile uint16_t *)0x40009216) // TCD Current Minor Loop Link
-#define DMA_TCD16_CITER_ELINKNO	(*(volatile uint16_t *)0x40009216) // ??
-#define DMA_TCD16_DLASTSGA	(*(volatile int32_t *)0x40009218)	 // TCD Last Destination Addr Adj
-#define DMA_TCD16_CSR		(*(volatile uint16_t *)0x4000921C) // TCD Control and Status
-#define DMA_TCD16_BITER_ELINKYES (*(volatile uint16_t *)0x4000921E) // TCD Beginning Minor Loop Link
-#define DMA_TCD16_BITER_ELINKNO	(*(volatile uint16_t *)0x4000921E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD17_SADDR		(*(volatile const void * volatile *)0x40009220) // TCD Source Addr
-#define DMA_TCD17_SOFF		(*(volatile int16_t *)0x40009224)	 // TCD Signed Source Address Offset
-#define DMA_TCD17_ATTR		(*(volatile uint16_t *)0x40009226) // TCD Transfer Attributes
-#define DMA_TCD17_NBYTES_MLNO	(*(volatile uint32_t *)0x40009228) // TCD Minor Byte Count
-#define DMA_TCD17_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009228) // TCD Signed Minor Loop Offset
-#define DMA_TCD17_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009228) // TCD Signed Minor Loop Offset
-#define DMA_TCD17_SLAST		(*(volatile int32_t *)0x4000922C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD17_DADDR		(*(volatile void * volatile *)0x40009230) // TCD Destination Address
-#define DMA_TCD17_DOFF		(*(volatile int16_t *)0x40009234)	 // TCD Signed Dest Address Offset
-#define DMA_TCD17_CITER_ELINKYES (*(volatile uint16_t *)0x40009236) // TCD Current Minor Loop Link
-#define DMA_TCD17_CITER_ELINKNO	(*(volatile uint16_t *)0x40009236) // ??
-#define DMA_TCD17_DLASTSGA	(*(volatile int32_t *)0x40009238)	 // TCD Last Destination Addr Adj
-#define DMA_TCD17_CSR		(*(volatile uint16_t *)0x4000923C) // TCD Control and Status
-#define DMA_TCD17_BITER_ELINKYES (*(volatile uint16_t *)0x4000923E) // TCD Beginning Minor Loop Link
-#define DMA_TCD17_BITER_ELINKNO	(*(volatile uint16_t *)0x4000923E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD18_SADDR		(*(volatile const void * volatile *)0x40009240) // TCD Source Addr
-#define DMA_TCD18_SOFF		(*(volatile int16_t *)0x40009244)	 // TCD Signed Source Address Offset
-#define DMA_TCD18_ATTR		(*(volatile uint16_t *)0x40009246) // TCD Transfer Attributes
-#define DMA_TCD18_NBYTES_MLNO	(*(volatile uint32_t *)0x40009248) // TCD Minor Byte Count
-#define DMA_TCD18_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009248) // TCD Signed Minor Loop Offset
-#define DMA_TCD18_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009248) // TCD Signed Minor Loop Offset
-#define DMA_TCD18_SLAST		(*(volatile int32_t *)0x4000924C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD18_DADDR		(*(volatile void * volatile *)0x40009250) // TCD Destination Address
-#define DMA_TCD18_DOFF		(*(volatile int16_t *)0x40009254)	 // TCD Signed Dest Address Offset
-#define DMA_TCD18_CITER_ELINKYES (*(volatile uint16_t *)0x40009256) // TCD Current Minor Loop Link
-#define DMA_TCD18_CITER_ELINKNO	(*(volatile uint16_t *)0x40009256) // ??
-#define DMA_TCD18_DLASTSGA	(*(volatile int32_t *)0x40009258)	 // TCD Last Destination Addr Adj
-#define DMA_TCD18_CSR		(*(volatile uint16_t *)0x4000925C) // TCD Control and Status
-#define DMA_TCD18_BITER_ELINKYES (*(volatile uint16_t *)0x4000925E) // TCD Beginning Minor Loop Link
-#define DMA_TCD18_BITER_ELINKNO	(*(volatile uint16_t *)0x4000925E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD19_SADDR		(*(volatile const void * volatile *)0x40009260) // TCD Source Addr
-#define DMA_TCD19_SOFF		(*(volatile int16_t *)0x40009264)	 // TCD Signed Source Address Offset
-#define DMA_TCD19_ATTR		(*(volatile uint16_t *)0x40009266) // TCD Transfer Attributes
-#define DMA_TCD19_NBYTES_MLNO	(*(volatile uint32_t *)0x40009268) // TCD Minor Byte Count
-#define DMA_TCD19_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009268) // TCD Signed Minor Loop Offset
-#define DMA_TCD19_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009268) // TCD Signed Minor Loop Offset
-#define DMA_TCD19_SLAST		(*(volatile int32_t *)0x4000926C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD19_DADDR		(*(volatile void * volatile *)0x40009270) // TCD Destination Address
-#define DMA_TCD19_DOFF		(*(volatile int16_t *)0x40009274)	 // TCD Signed Dest Address Offset
-#define DMA_TCD19_CITER_ELINKYES (*(volatile uint16_t *)0x40009276) // TCD Current Minor Loop Link
-#define DMA_TCD19_CITER_ELINKNO	(*(volatile uint16_t *)0x40009276) // ??
-#define DMA_TCD19_DLASTSGA	(*(volatile int32_t *)0x40009278)	 // TCD Last Destination Addr Adj
-#define DMA_TCD19_CSR		(*(volatile uint16_t *)0x4000927C) // TCD Control and Status
-#define DMA_TCD19_BITER_ELINKYES (*(volatile uint16_t *)0x4000927E) // TCD Beginning Minor Loop Link
-#define DMA_TCD19_BITER_ELINKNO	(*(volatile uint16_t *)0x4000927E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD20_SADDR		(*(volatile const void * volatile *)0x40009280) // TCD Source Addr
-#define DMA_TCD20_SOFF		(*(volatile int16_t *)0x40009284)	 // TCD Signed Source Address Offset
-#define DMA_TCD20_ATTR		(*(volatile uint16_t *)0x40009286) // TCD Transfer Attributes
-#define DMA_TCD20_NBYTES_MLNO	(*(volatile uint32_t *)0x40009288) // TCD Minor Byte Count
-#define DMA_TCD20_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009288) // TCD Signed Minor Loop Offset
-#define DMA_TCD20_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009288) // TCD Signed Minor Loop Offset
-#define DMA_TCD20_SLAST		(*(volatile int32_t *)0x4000928C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD20_DADDR		(*(volatile void * volatile *)0x40009290) // TCD Destination Address
-#define DMA_TCD20_DOFF		(*(volatile int16_t *)0x40009294)	 // TCD Signed Dest Address Offset
-#define DMA_TCD20_CITER_ELINKYES (*(volatile uint16_t *)0x40009296) // TCD Current Minor Loop Link
-#define DMA_TCD20_CITER_ELINKNO	(*(volatile uint16_t *)0x40009296) // ??
-#define DMA_TCD20_DLASTSGA	(*(volatile int32_t *)0x40009298)	 // TCD Last Destination Addr Adj
-#define DMA_TCD20_CSR		(*(volatile uint16_t *)0x4000929C) // TCD Control and Status
-#define DMA_TCD20_BITER_ELINKYES (*(volatile uint16_t *)0x4000929E) // TCD Beginning Minor Loop Link
-#define DMA_TCD20_BITER_ELINKNO	(*(volatile uint16_t *)0x4000929E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD21_SADDR		(*(volatile const void * volatile *)0x400092A0) // TCD Source Addr
-#define DMA_TCD21_SOFF		(*(volatile int16_t *)0x400092A4)	 // TCD Signed Source Address Offset
-#define DMA_TCD21_ATTR		(*(volatile uint16_t *)0x400092A6) // TCD Transfer Attributes
-#define DMA_TCD21_NBYTES_MLNO	(*(volatile uint32_t *)0x400092A8) // TCD Minor Byte Count
-#define DMA_TCD21_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400092A8) // TCD Signed Minor Loop Offset
-#define DMA_TCD21_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400092A8) // TCD Signed Minor Loop Offset
-#define DMA_TCD21_SLAST		(*(volatile int32_t *)0x400092AC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD21_DADDR		(*(volatile void * volatile *)0x400092B0) // TCD Destination Address
-#define DMA_TCD21_DOFF		(*(volatile int16_t *)0x400092B4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD21_CITER_ELINKYES (*(volatile uint16_t *)0x400092B6) // TCD Current Minor Loop Link
-#define DMA_TCD21_CITER_ELINKNO	(*(volatile uint16_t *)0x400092B6) // ??
-#define DMA_TCD21_DLASTSGA	(*(volatile int32_t *)0x400092B8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD21_CSR		(*(volatile uint16_t *)0x400092BC) // TCD Control and Status
-#define DMA_TCD21_BITER_ELINKYES (*(volatile uint16_t *)0x400092BE) // TCD Beginning Minor Loop Link
-#define DMA_TCD21_BITER_ELINKNO	(*(volatile uint16_t *)0x400092BE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD22_SADDR		(*(volatile const void * volatile *)0x400092C0) // TCD Source Addr
-#define DMA_TCD22_SOFF		(*(volatile int16_t *)0x400092C4)	 // TCD Signed Source Address Offset
-#define DMA_TCD22_ATTR		(*(volatile uint16_t *)0x400092C6) // TCD Transfer Attributes
-#define DMA_TCD22_NBYTES_MLNO	(*(volatile uint32_t *)0x400092C8) // TCD Minor Byte Count
-#define DMA_TCD22_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400092C8) // TCD Signed Minor Loop Offset
-#define DMA_TCD22_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400092C8) // TCD Signed Minor Loop Offset
-#define DMA_TCD22_SLAST		(*(volatile int32_t *)0x400092CC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD22_DADDR		(*(volatile void * volatile *)0x400092D0) // TCD Destination Address
-#define DMA_TCD22_DOFF		(*(volatile int16_t *)0x400092D4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD22_CITER_ELINKYES (*(volatile uint16_t *)0x400092D6) // TCD Current Minor Loop Link
-#define DMA_TCD22_CITER_ELINKNO	(*(volatile uint16_t *)0x400092D6) // ??
-#define DMA_TCD22_DLASTSGA	(*(volatile int32_t *)0x400092D8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD22_CSR		(*(volatile uint16_t *)0x400092DC) // TCD Control and Status
-#define DMA_TCD22_BITER_ELINKYES (*(volatile uint16_t *)0x400092DE) // TCD Beginning Minor Loop Link
-#define DMA_TCD22_BITER_ELINKNO	(*(volatile uint16_t *)0x400092DE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD23_SADDR		(*(volatile const void * volatile *)0x400092E0) // TCD Source Addr
-#define DMA_TCD23_SOFF		(*(volatile int16_t *)0x400092E4)	 // TCD Signed Source Address Offset
-#define DMA_TCD23_ATTR		(*(volatile uint16_t *)0x400092E6) // TCD Transfer Attributes
-#define DMA_TCD23_NBYTES_MLNO	(*(volatile uint32_t *)0x400092E8) // TCD Minor Byte Count
-#define DMA_TCD23_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400092E8) // TCD Signed Minor Loop Offset
-#define DMA_TCD23_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400092E8) // TCD Signed Minor Loop Offset
-#define DMA_TCD23_SLAST		(*(volatile int32_t *)0x400092EC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD23_DADDR		(*(volatile void * volatile *)0x400092F0) // TCD Destination Address
-#define DMA_TCD23_DOFF		(*(volatile int16_t *)0x400092F4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD23_CITER_ELINKYES (*(volatile uint16_t *)0x400092F6) // TCD Current Minor Loop Link
-#define DMA_TCD23_CITER_ELINKNO	(*(volatile uint16_t *)0x400092F6) // ??
-#define DMA_TCD23_DLASTSGA	(*(volatile int32_t *)0x400092F8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD23_CSR		(*(volatile uint16_t *)0x400092FC) // TCD Control and Status
-#define DMA_TCD23_BITER_ELINKYES (*(volatile uint16_t *)0x400092FE) // TCD Beginning Minor Loop Link
-#define DMA_TCD23_BITER_ELINKNO	(*(volatile uint16_t *)0x400092FE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD24_SADDR		(*(volatile const void * volatile *)0x40009300) // TCD Source Addr
-#define DMA_TCD24_SOFF		(*(volatile int16_t *)0x40009304)	 // TCD Signed Source Address Offset
-#define DMA_TCD24_ATTR		(*(volatile uint16_t *)0x40009306) // TCD Transfer Attributes
-#define DMA_TCD24_NBYTES_MLNO	(*(volatile uint32_t *)0x40009308) // TCD Minor Byte Count
-#define DMA_TCD24_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009308) // TCD Signed Minor Loop Offset
-#define DMA_TCD24_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009308) // TCD Signed Minor Loop Offset
-#define DMA_TCD24_SLAST		(*(volatile int32_t *)0x4000930C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD24_DADDR		(*(volatile void * volatile *)0x40009310) // TCD Destination Address
-#define DMA_TCD24_DOFF		(*(volatile int16_t *)0x40009314)	 // TCD Signed Dest Address Offset
-#define DMA_TCD24_CITER_ELINKYES (*(volatile uint16_t *)0x40009316) // TCD Current Minor Loop Link
-#define DMA_TCD24_CITER_ELINKNO	(*(volatile uint16_t *)0x40009316) // ??
-#define DMA_TCD24_DLASTSGA	(*(volatile int32_t *)0x40009318)	 // TCD Last Destination Addr Adj
-#define DMA_TCD24_CSR		(*(volatile uint16_t *)0x4000931C) // TCD Control and Status
-#define DMA_TCD24_BITER_ELINKYES (*(volatile uint16_t *)0x4000931E) // TCD Beginning Minor Loop Link
-#define DMA_TCD24_BITER_ELINKNO	(*(volatile uint16_t *)0x4000931E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD25_SADDR		(*(volatile const void * volatile *)0x40009320) // TCD Source Addr
-#define DMA_TCD25_SOFF		(*(volatile int16_t *)0x40009324)	 // TCD Signed Source Address Offset
-#define DMA_TCD25_ATTR		(*(volatile uint16_t *)0x40009326) // TCD Transfer Attributes
-#define DMA_TCD25_NBYTES_MLNO	(*(volatile uint32_t *)0x40009328) // TCD Minor Byte Count
-#define DMA_TCD25_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009328) // TCD Signed Minor Loop Offset
-#define DMA_TCD25_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009328) // TCD Signed Minor Loop Offset
-#define DMA_TCD25_SLAST		(*(volatile int32_t *)0x4000932C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD25_DADDR		(*(volatile void * volatile *)0x40009330) // TCD Destination Address
-#define DMA_TCD25_DOFF		(*(volatile int16_t *)0x40009334)	 // TCD Signed Dest Address Offset
-#define DMA_TCD25_CITER_ELINKYES (*(volatile uint16_t *)0x40009336) // TCD Current Minor Loop Link
-#define DMA_TCD25_CITER_ELINKNO	(*(volatile uint16_t *)0x40009336) // ??
-#define DMA_TCD25_DLASTSGA	(*(volatile int32_t *)0x40009338)	 // TCD Last Destination Addr Adj
-#define DMA_TCD25_CSR		(*(volatile uint16_t *)0x4000933C) // TCD Control and Status
-#define DMA_TCD25_BITER_ELINKYES (*(volatile uint16_t *)0x4000933E) // TCD Beginning Minor Loop Link
-#define DMA_TCD25_BITER_ELINKNO	(*(volatile uint16_t *)0x4000933E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD26_SADDR		(*(volatile const void * volatile *)0x40009340) // TCD Source Addr
-#define DMA_TCD26_SOFF		(*(volatile int16_t *)0x40009344)	 // TCD Signed Source Address Offset
-#define DMA_TCD26_ATTR		(*(volatile uint16_t *)0x40009346) // TCD Transfer Attributes
-#define DMA_TCD26_NBYTES_MLNO	(*(volatile uint32_t *)0x40009348) // TCD Minor Byte Count
-#define DMA_TCD26_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009348) // TCD Signed Minor Loop Offset
-#define DMA_TCD26_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009348) // TCD Signed Minor Loop Offset
-#define DMA_TCD26_SLAST		(*(volatile int32_t *)0x4000934C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD26_DADDR		(*(volatile void * volatile *)0x40009350) // TCD Destination Address
-#define DMA_TCD26_DOFF		(*(volatile int16_t *)0x40009354)	 // TCD Signed Dest Address Offset
-#define DMA_TCD26_CITER_ELINKYES (*(volatile uint16_t *)0x40009356) // TCD Current Minor Loop Link
-#define DMA_TCD26_CITER_ELINKNO	(*(volatile uint16_t *)0x40009356) // ??
-#define DMA_TCD26_DLASTSGA	(*(volatile int32_t *)0x40009358)	 // TCD Last Destination Addr Adj
-#define DMA_TCD26_CSR		(*(volatile uint16_t *)0x4000935C) // TCD Control and Status
-#define DMA_TCD26_BITER_ELINKYES (*(volatile uint16_t *)0x4000935E) // TCD Beginning Minor Loop Link
-#define DMA_TCD26_BITER_ELINKNO	(*(volatile uint16_t *)0x4000935E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD27_SADDR		(*(volatile const void * volatile *)0x40009360) // TCD Source Addr
-#define DMA_TCD27_SOFF		(*(volatile int16_t *)0x40009364)	 // TCD Signed Source Address Offset
-#define DMA_TCD27_ATTR		(*(volatile uint16_t *)0x40009366) // TCD Transfer Attributes
-#define DMA_TCD27_NBYTES_MLNO	(*(volatile uint32_t *)0x40009368) // TCD Minor Byte Count
-#define DMA_TCD27_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009368) // TCD Signed Minor Loop Offset
-#define DMA_TCD27_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009368) // TCD Signed Minor Loop Offset
-#define DMA_TCD27_SLAST		(*(volatile int32_t *)0x4000936C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD27_DADDR		(*(volatile void * volatile *)0x40009370) // TCD Destination Address
-#define DMA_TCD27_DOFF		(*(volatile int16_t *)0x40009374)	 // TCD Signed Dest Address Offset
-#define DMA_TCD27_CITER_ELINKYES (*(volatile uint16_t *)0x40009376) // TCD Current Minor Loop Link
-#define DMA_TCD27_CITER_ELINKNO	(*(volatile uint16_t *)0x40009376) // ??
-#define DMA_TCD27_DLASTSGA	(*(volatile int32_t *)0x40009378)	 // TCD Last Destination Addr Adj
-#define DMA_TCD27_CSR		(*(volatile uint16_t *)0x4000937C) // TCD Control and Status
-#define DMA_TCD27_BITER_ELINKYES (*(volatile uint16_t *)0x4000937E) // TCD Beginning Minor Loop Link
-#define DMA_TCD27_BITER_ELINKNO	(*(volatile uint16_t *)0x4000937E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD28_SADDR		(*(volatile const void * volatile *)0x40009380) // TCD Source Addr
-#define DMA_TCD28_SOFF		(*(volatile int16_t *)0x40009384)	 // TCD Signed Source Address Offset
-#define DMA_TCD28_ATTR		(*(volatile uint16_t *)0x40009386) // TCD Transfer Attributes
-#define DMA_TCD28_NBYTES_MLNO	(*(volatile uint32_t *)0x40009388) // TCD Minor Byte Count
-#define DMA_TCD28_NBYTES_MLOFFNO (*(volatile uint32_t *)0x40009388) // TCD Signed Minor Loop Offset
-#define DMA_TCD28_NBYTES_MLOFFYES (*(volatile uint32_t *)0x40009388) // TCD Signed Minor Loop Offset
-#define DMA_TCD28_SLAST		(*(volatile int32_t *)0x4000938C)	 // TCD Last Source Addr Adj.
-#define DMA_TCD28_DADDR		(*(volatile void * volatile *)0x40009390) // TCD Destination Address
-#define DMA_TCD28_DOFF		(*(volatile int16_t *)0x40009394)	 // TCD Signed Dest Address Offset
-#define DMA_TCD28_CITER_ELINKYES (*(volatile uint16_t *)0x40009396) // TCD Current Minor Loop Link
-#define DMA_TCD28_CITER_ELINKNO	(*(volatile uint16_t *)0x40009396) // ??
-#define DMA_TCD28_DLASTSGA	(*(volatile int32_t *)0x40009398)	 // TCD Last Destination Addr Adj
-#define DMA_TCD28_CSR		(*(volatile uint16_t *)0x4000939C) // TCD Control and Status
-#define DMA_TCD28_BITER_ELINKYES (*(volatile uint16_t *)0x4000939E) // TCD Beginning Minor Loop Link
-#define DMA_TCD28_BITER_ELINKNO	(*(volatile uint16_t *)0x4000939E) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD29_SADDR		(*(volatile const void * volatile *)0x400093A0) // TCD Source Addr
-#define DMA_TCD29_SOFF		(*(volatile int16_t *)0x400093A4)	 // TCD Signed Source Address Offset
-#define DMA_TCD29_ATTR		(*(volatile uint16_t *)0x400093A6) // TCD Transfer Attributes
-#define DMA_TCD29_NBYTES_MLNO	(*(volatile uint32_t *)0x400093A8) // TCD Minor Byte Count
-#define DMA_TCD29_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400093A8) // TCD Signed Minor Loop Offset
-#define DMA_TCD29_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400093A8) // TCD Signed Minor Loop Offset
-#define DMA_TCD29_SLAST		(*(volatile int32_t *)0x400093AC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD29_DADDR		(*(volatile void * volatile *)0x400093B0) // TCD Destination Address
-#define DMA_TCD29_DOFF		(*(volatile int16_t *)0x400093B4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD29_CITER_ELINKYES (*(volatile uint16_t *)0x400093B6) // TCD Current Minor Loop Link
-#define DMA_TCD29_CITER_ELINKNO	(*(volatile uint16_t *)0x400093B6) // ??
-#define DMA_TCD29_DLASTSGA	(*(volatile int32_t *)0x400093B8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD29_CSR		(*(volatile uint16_t *)0x400093BC) // TCD Control and Status
-#define DMA_TCD29_BITER_ELINKYES (*(volatile uint16_t *)0x400093BE) // TCD Beginning Minor Loop Link
-#define DMA_TCD29_BITER_ELINKNO	(*(volatile uint16_t *)0x400093BE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD30_SADDR		(*(volatile const void * volatile *)0x400093C0) // TCD Source Addr
-#define DMA_TCD30_SOFF		(*(volatile int16_t *)0x400093C4)	 // TCD Signed Source Address Offset
-#define DMA_TCD30_ATTR		(*(volatile uint16_t *)0x400093C6) // TCD Transfer Attributes
-#define DMA_TCD30_NBYTES_MLNO	(*(volatile uint32_t *)0x400093C8) // TCD Minor Byte Count
-#define DMA_TCD30_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400093C8) // TCD Signed Minor Loop Offset
-#define DMA_TCD30_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400093C8) // TCD Signed Minor Loop Offset
-#define DMA_TCD30_SLAST		(*(volatile int32_t *)0x400093CC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD30_DADDR		(*(volatile void * volatile *)0x400093D0) // TCD Destination Address
-#define DMA_TCD30_DOFF		(*(volatile int16_t *)0x400093D4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD30_CITER_ELINKYES (*(volatile uint16_t *)0x400093D6) // TCD Current Minor Loop Link
-#define DMA_TCD30_CITER_ELINKNO	(*(volatile uint16_t *)0x400093D6) // ??
-#define DMA_TCD30_DLASTSGA	(*(volatile int32_t *)0x400093D8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD30_CSR		(*(volatile uint16_t *)0x400093DC) // TCD Control and Status
-#define DMA_TCD30_BITER_ELINKYES (*(volatile uint16_t *)0x400093DE) // TCD Beginning Minor Loop Link
-#define DMA_TCD30_BITER_ELINKNO	(*(volatile uint16_t *)0x400093DE) // TCD Beginning Minor Loop Link
-
-#define DMA_TCD31_SADDR		(*(volatile const void * volatile *)0x400093E0) // TCD Source Addr
-#define DMA_TCD31_SOFF		(*(volatile int16_t *)0x400093E4)	 // TCD Signed Source Address Offset
-#define DMA_TCD31_ATTR		(*(volatile uint16_t *)0x400093E6) // TCD Transfer Attributes
-#define DMA_TCD31_NBYTES_MLNO	(*(volatile uint32_t *)0x400093E8) // TCD Minor Byte Count
-#define DMA_TCD31_NBYTES_MLOFFNO (*(volatile uint32_t *)0x400093E8) // TCD Signed Minor Loop Offset
-#define DMA_TCD31_NBYTES_MLOFFYES (*(volatile uint32_t *)0x400093E8) // TCD Signed Minor Loop Offset
-#define DMA_TCD31_SLAST		(*(volatile int32_t *)0x400093EC)	 // TCD Last Source Addr Adj.
-#define DMA_TCD31_DADDR		(*(volatile void * volatile *)0x400093F0) // TCD Destination Address
-#define DMA_TCD31_DOFF		(*(volatile int16_t *)0x400093F4)	 // TCD Signed Dest Address Offset
-#define DMA_TCD31_CITER_ELINKYES (*(volatile uint16_t *)0x400093F6) // TCD Current Minor Loop Link
-#define DMA_TCD31_CITER_ELINKNO	(*(volatile uint16_t *)0x400093F6) // ??
-#define DMA_TCD31_DLASTSGA	(*(volatile int32_t *)0x400093F8)	 // TCD Last Destination Addr Adj
-#define DMA_TCD31_CSR		(*(volatile uint16_t *)0x400093FC) // TCD Control and Status
-#define DMA_TCD31_BITER_ELINKYES (*(volatile uint16_t *)0x400093FE) // TCD Beginning Minor Loop Link
-#define DMA_TCD31_BITER_ELINKNO	(*(volatile uint16_t *)0x400093FE) // TCD Beginning Minor Loop Link
-#endif
-
-#elif defined(KINETISL)
-#define DMA_SAR0		(*(volatile const void * volatile *)0x40008100)  // Source Address
-#define DMA_DAR0		(*(volatile void * volatile *)0x40008104)  // Destination Address
-#define DMA_DSR_BCR0		(*(volatile uint32_t *)0x40008108)  // Status / Byte Count
-#define DMA_DCR0		(*(volatile uint32_t *)0x4000810C)  // Control
-#define DMA_SAR1		(*(volatile const void * volatile *)0x40008110)  // Source Address
-#define DMA_DAR1		(*(volatile void * volatile *)0x40008114)  // Destination Address
-#define DMA_DSR_BCR1		(*(volatile uint32_t *)0x40008118)  // Status / Byte Count
-#define DMA_DCR1		(*(volatile uint32_t *)0x4000811C)  // Control
-#define DMA_SAR2		(*(volatile const void * volatile *)0x40008120)  // Source Address
-#define DMA_DAR2		(*(volatile void * volatile *)0x40008124)  // Destination Address
-#define DMA_DSR_BCR2		(*(volatile uint32_t *)0x40008128)  // Status / Byte Count
-#define DMA_DCR2		(*(volatile uint32_t *)0x4000812C)  // Control
-#define DMA_SAR3		(*(volatile const void * volatile *)0x40008130)  // Source Address
-#define DMA_DAR3		(*(volatile void * volatile *)0x40008134)  // Destination Address
-#define DMA_DSR_BCR3		(*(volatile uint32_t *)0x40008138)  // Status / Byte Count
-#define DMA_DCR3		(*(volatile uint32_t *)0x4000813C)  // Control
-#define DMA_DSR_BCR_CE			((uint32_t)0x40000000)	// Configuration Error
-#define DMA_DSR_BCR_BES			((uint32_t)0x20000000)	// Bus Error on Source
-#define DMA_DSR_BCR_BED			((uint32_t)0x10000000)	// Bus Error on Destination
-#define DMA_DSR_BCR_REQ			((uint32_t)0x04000000)	// Request
-#define DMA_DSR_BCR_BSY			((uint32_t)0x02000000)	// Busy
-#define DMA_DSR_BCR_DONE		((uint32_t)0x01000000)	// Transactions Done
-#define DMA_DSR_BCR_BCR(n)		((n) & 0x00FFFFFF)	// Byte Count Remaining
-#define DMA_DCR_EINT			((uint32_t)0x80000000)	// Enable Interrupt on Completion
-#define DMA_DCR_ERQ			((uint32_t)0x40000000)	// Enable Peripheral Request
-#define DMA_DCR_CS			((uint32_t)0x20000000)	// Cycle Steal
-#define DMA_DCR_AA			((uint32_t)0x10000000)	// Auto-align
-#define DMA_DCR_EADREQ			((uint32_t)0x00800000)	// Enable asynchronous DMA requests
-#define DMA_DCR_SINC			((uint32_t)0x00400000)	// Source Increment
-#define DMA_DCR_SSIZE(n)		(((n) & 3) << 20)	// Source Size, 0=32, 1=8, 2=16
-#define DMA_DCR_DINC			((uint32_t)0x00080000)	// Destination Increment
-#define DMA_DCR_DSIZE(n)		(((n) & 3) << 17)	// Dest Size, 0=32, 1=8, 2=16
-#define DMA_DCR_START			((uint32_t)0x00010000)	// Start Transfer
-#define DMA_DCR_SMOD(n)			(((n) & 15) << 12)	// Source Address Modulo
-#define DMA_DCR_DMOD(n)			(((n) & 15) << 8)	// Destination Address Modulo
-#define DMA_DCR_D_REQ			((uint32_t)0x00000080)	// Disable Request
-#define DMA_DCR_LINKCC(n)		(((n) & 3) << 4)	// Link Channel Control
-#define DMA_DCR_LCH1(n)			(((n) & 3) << 2)	// Link Channel 1
-#define DMA_DCR_LCH2(n)			(((n) & 3) << 0)	// Link Channel 2
-#endif
-
+  volatile uint32_t unused7[960 - DMA_NUM_CHANNELS / 4];
+  KINETIS_TCD_t TCD[DMA_NUM_CHANNELS];
+} KINETIS_DMA_t __attribute__((aligned(0x1000)));
+#define DMA (*(KINETIS_DMA_t *)0x40008000)
+static_assert(offsetof(KINETIS_DMA_t, HRS) == 0x34, "padding is wrong");
+static_assert(offsetof(KINETIS_DMA_t, CHPRIraw) == 0x100, "padding is wrong");
+static_assert(offsetof(KINETIS_DMA_t, TCD) == 0x1000, "padding is wrong");
 
 // External Watchdog Monitor (EWM)
 
@@ -2642,42 +2041,43 @@
 #define FMC_DATAW3S0		(*(volatile uint32_t *)0x4001F218) // Cache Data Storage
 #define FMC_DATAW3S1		(*(volatile uint32_t *)0x4001F21C) // Cache Data Storage
 
-// Flash Memory Module (FTFL)
+// Flash Memory Module (FTFA/FTFL/FTFE)
 
-#define FTFL_FSTAT		(*(volatile uint8_t  *)0x40020000) // Flash Status Register
-#define FTFL_FSTAT_CCIF			((uint8_t)0x80)			// Command Complete Interrupt Flag
-#define FTFL_FSTAT_RDCOLERR		((uint8_t)0x40)			// Flash Read Collision Error Flag
-#define FTFL_FSTAT_ACCERR		((uint8_t)0x20)			// Flash Access Error Flag
-#define FTFL_FSTAT_FPVIOL		((uint8_t)0x10)			// Flash Protection Violation Flag
-#define FTFL_FSTAT_MGSTAT0		((uint8_t)0x01)			// Memory Controller Command Completion Status Flag
-#define FTFL_FCNFG		(*(volatile uint8_t  *)0x40020001) // Flash Configuration Register
-#define FTFL_FCNFG_CCIE			((uint8_t)0x80)			// Command Complete Interrupt Enable
-#define FTFL_FCNFG_RDCOLLIE		((uint8_t)0x40)			// Read Collision Error Interrupt Enable
-#define FTFL_FCNFG_ERSAREQ		((uint8_t)0x20)			// Erase All Request
-#define FTFL_FCNFG_ERSSUSP		((uint8_t)0x10)			// Erase Suspend
-#define FTFL_FCNFG_PFLSH		((uint8_t)0x04)			// Flash memory configuration
-#define FTFL_FCNFG_RAMRDY		((uint8_t)0x02)			// RAM Ready
-#define FTFL_FCNFG_EEERDY		((uint8_t)0x01)			// EEPROM Ready
-#define FTFL_FSEC		(*(const    uint8_t  *)0x40020002) // Flash Security Register
-#define FTFL_FOPT		(*(const    uint8_t  *)0x40020003) // Flash Option Register
-#define FTFL_FCCOB3		(*(volatile uint8_t  *)0x40020004) // Flash Common Command Object Registers
-#define FTFL_FCCOB2		(*(volatile uint8_t  *)0x40020005)
-#define FTFL_FCCOB1		(*(volatile uint8_t  *)0x40020006)
-#define FTFL_FCCOB0		(*(volatile uint8_t  *)0x40020007)
-#define FTFL_FCCOB7		(*(volatile uint8_t  *)0x40020008)
-#define FTFL_FCCOB6		(*(volatile uint8_t  *)0x40020009)
-#define FTFL_FCCOB5		(*(volatile uint8_t  *)0x4002000A)
-#define FTFL_FCCOB4		(*(volatile uint8_t  *)0x4002000B)
-#define FTFL_FCCOBB		(*(volatile uint8_t  *)0x4002000C)
-#define FTFL_FCCOBA		(*(volatile uint8_t  *)0x4002000D)
-#define FTFL_FCCOB9		(*(volatile uint8_t  *)0x4002000E)
-#define FTFL_FCCOB8		(*(volatile uint8_t  *)0x4002000F)
-#define FTFL_FPROT3		(*(volatile uint8_t  *)0x40020010) // Program Flash Protection Registers
-#define FTFL_FPROT2		(*(volatile uint8_t  *)0x40020011) // Program Flash Protection Registers
-#define FTFL_FPROT1		(*(volatile uint8_t  *)0x40020012) // Program Flash Protection Registers
-#define FTFL_FPROT0		(*(volatile uint8_t  *)0x40020013) // Program Flash Protection Registers
-#define FTFL_FEPROT		(*(volatile uint8_t  *)0x40020016) // EEPROM Protection Register
-#define FTFL_FDPROT		(*(volatile uint8_t  *)0x40020017) // Data Flash Protection Register
+#define FTFX_FSTAT		(*(volatile uint8_t  *)0x40020000) // Flash Status Register
+#define FTFX_FSTAT_CCIF			((uint8_t)0x80)			// Command Complete Interrupt Flag
+#define FTFX_FSTAT_RDCOLERR		((uint8_t)0x40)			// Flash Read Collision Error Flag
+#define FTFX_FSTAT_ACCERR		((uint8_t)0x20)			// Flash Access Error Flag
+#define FTFX_FSTAT_FPVIOL		((uint8_t)0x10)			// Flash Protection Violation Flag
+#define FTFX_FSTAT_MGSTAT0		((uint8_t)0x01)			// Memory Controller Command Completion Status Flag
+#define FTFX_FCNFG		(*(volatile uint8_t  *)0x40020001) // Flash Configuration Register
+#define FTFX_FCNFG_CCIE			((uint8_t)0x80)			// Command Complete Interrupt Enable
+#define FTFX_FCNFG_RDCOLLIE		((uint8_t)0x40)			// Read Collision Error Interrupt Enable
+#define FTFX_FCNFG_ERSAREQ		((uint8_t)0x20)			// Erase All Request
+#define FTFX_FCNFG_ERSSUSP		((uint8_t)0x10)			// Erase Suspend
+#define FTFX_FCNFG_SWAP		((uint8_t)0x08)			// Swap (halves of program flash)
+#define FTFX_FCNFG_PFLSH		((uint8_t)0x04)			// Flash memory configuration
+#define FTFX_FCNFG_RAMRDY		((uint8_t)0x02)			// RAM Ready
+#define FTFX_FCNFG_EEERDY		((uint8_t)0x01)			// EEPROM Ready
+#define FTFX_FSEC		(*(const    uint8_t  *)0x40020002) // Flash Security Register
+#define FTFX_FOPT		(*(const    uint8_t  *)0x40020003) // Flash Option Register
+#define FTFX_FCCOB3		(*(volatile uint8_t  *)0x40020004) // Flash Common Command Object Registers
+#define FTFX_FCCOB2		(*(volatile uint8_t  *)0x40020005)
+#define FTFX_FCCOB1		(*(volatile uint8_t  *)0x40020006)
+#define FTFX_FCCOB0		(*(volatile uint8_t  *)0x40020007)
+#define FTFX_FCCOB7		(*(volatile uint8_t  *)0x40020008)
+#define FTFX_FCCOB6		(*(volatile uint8_t  *)0x40020009)
+#define FTFX_FCCOB5		(*(volatile uint8_t  *)0x4002000A)
+#define FTFX_FCCOB4		(*(volatile uint8_t  *)0x4002000B)
+#define FTFX_FCCOBB		(*(volatile uint8_t  *)0x4002000C)
+#define FTFX_FCCOBA		(*(volatile uint8_t  *)0x4002000D)
+#define FTFX_FCCOB9		(*(volatile uint8_t  *)0x4002000E)
+#define FTFX_FCCOB8		(*(volatile uint8_t  *)0x4002000F)
+#define FTFX_FPROT3		(*(volatile uint8_t  *)0x40020010) // Program Flash Protection Registers
+#define FTFX_FPROT2		(*(volatile uint8_t  *)0x40020011) // Program Flash Protection Registers
+#define FTFX_FPROT1		(*(volatile uint8_t  *)0x40020012) // Program Flash Protection Registers
+#define FTFX_FPROT0		(*(volatile uint8_t  *)0x40020013) // Program Flash Protection Registers
+#define FTFX_FEPROT		(*(volatile uint8_t  *)0x40020016) // EEPROM Protection Register
+#define FTFX_FDPROT		(*(volatile uint8_t  *)0x40020017) // Data Flash Protection Register
 
 // Cyclic Redundancy Check (CRC)
 
@@ -2685,6 +2085,7 @@
 #define CRC_GPOLY		(*(volatile uint32_t *)0x40032004) // CRC Polynomial register
 #define CRC_CTRL		(*(volatile uint32_t *)0x40032008) // CRC Control register
 
+#if defined(HAS_KINETIS_CAU)
 // Cryptographic Acceleration Unit (CAU)
 
 #define CAU_CASR		(*(volatile uint32_t *)0xE0081000) // Status Register
@@ -2698,16 +2099,93 @@
 #define CAU_CA6			(*(volatile uint32_t *)0xE0081008) // General Purpose Register
 #define CAU_CA7			(*(volatile uint32_t *)0xE0081009) // General Purpose Register
 #define CAU_CA8			(*(volatile uint32_t *)0xE008100A) // General Purpose Register
+#endif
 
+#if defined(HAS_KINETIS_RNG)
 // Random Number Generator Accelerator (RNGA)
 
 #define RNG_CR			(*(volatile uint32_t *)0x40029000) // RNGA Control Register
 #define RNG_SR			(*(volatile uint32_t *)0x40029004) // RNGA Status Register
 #define RNG_ER			(*(volatile uint32_t *)0x40029008) // RNGA Entropy Register
 #define RNG_OR			(*(volatile uint32_t *)0x4002900C) // RNGA Output Register
+#endif
 
 // Analog-to-Digital Converter (ADC)
 
+#define M_ADC_COCO ((uint32_t)0x80)                 // Conversion complete flag
+#define M_ADC_AIEN ((uint32_t)0x40)                 // Interrupt enable
+#define M_ADC_DIFF ((uint32_t)0x20)                 // Differential mode enable
+#define V_ADC_ADCH(n) ((uint32_t)((n)&0x1F))        // Input channel select
+#define M_ADC_ADLPC ((uint32_t)0x80)                // Low-power configuration
+#define V_ADC_ADIV(n) ((uint32_t)(((n)&3) << 5))    // Clock divide select
+#define M_ADC_ADLSMP ((uint32_t)0x10)               // Sample time configuration
+#define V_ADC_MODE(n) ((uint32_t)(((n)&3) << 2))    // Conversion mode
+#define V_ADC_ADICLK(n) ((uint32_t)(((n)&3) << 0))  // Input clock
+#define M_ADC_MUXSEL ((uint32_t)0x10)   // 0=a channels, 1=b channels
+#define M_ADC_ADACKEN ((uint32_t)0x08)  // async clock enable
+#define M_ADC_ADHSC ((uint32_t)0x04)    // High speed configuration
+#define V_ADC_ADLSTS(n) ((uint32_t)(((n)&3) << 0))  // Sample time
+#define M_ADC_ADACT ((uint32_t)0x80)                // Conversion active
+#define M_ADC_ADTRG ((uint32_t)0x40)                // Conversion trigger select
+#define M_ADC_ACFE ((uint32_t)0x20)                 // Compare function enable
+#define M_ADC_ACFGT ((uint32_t)0x10)  // Compare function greater than enable
+#define M_ADC_ACREN ((uint32_t)0x08)  // Compare function range enable
+#define M_ADC_DMAEN ((uint32_t)0x04)  // DMA enable
+#define V_ADC_REFSEL(n) ((uint32_t)(((n)&3) << 0))  // Voltage reference
+#define M_ADC_CAL ((uint32_t)0x80)                  // Calibration
+#define M_ADC_CALF ((uint32_t)0x40)                 // Calibration failed flag
+#define M_ADC_ADCO ((uint32_t)0x08)  // Continuous conversion enable
+#define M_ADC_AVGE ((uint32_t)0x04)  // Hardware average enable
+#define V_ADC_AVGS(n) ((uint32_t)(((n)&3) << 0))    // avg select
+#define M_ADC_PGAEN ((uint32_t)0x00800000)          // Enable
+#define M_ADC_PGALPB ((uint32_t)0x00100000)         // Low-Power Mode Control
+#define V_ADC_PGAG(n) ((uint32_t)(((n)&15) << 16))  // Gain
+
+typedef struct {
+  union {
+    struct {
+      volatile uint32_t SC1A;  // ADC status and control registers 1
+      volatile uint32_t SC1B;  // ADC status and control registers 1
+    };
+    volatile uint32_t SC1[2];
+  };
+  volatile uint32_t CFG1;  // Configuration register 1
+  volatile uint32_t CFG2;  // Configuration register 2
+  union {
+    struct {
+      volatile uint32_t RA;  // ADC data result register
+      volatile uint32_t RB;  // ADC data result register
+    };
+    volatile uint32_t R[2];
+  };
+  volatile uint32_t CV1;   // Compare value registers
+  volatile uint32_t CV2;   // Compare value registers
+  volatile uint32_t SC2;   // Status and control register 2
+  volatile uint32_t SC3;   // Status and control register 3
+  volatile uint32_t OFS;   // ADC offset correction register
+  volatile uint32_t PG;    // ADC plus-side gain register
+  volatile uint32_t MG;    // ADC minus-side gain register
+  volatile uint32_t CLPD;  // ADC plus-side general calibration value register
+  volatile uint32_t CLPS;  // ADC plus-side general calibration value register
+  volatile uint32_t CLP4;  // ADC plus-side general calibration value register
+  volatile uint32_t CLP3;  // ADC plus-side general calibration value register
+  volatile uint32_t CLP2;  // ADC plus-side general calibration value register
+  volatile uint32_t CLP1;  // ADC plus-side general calibration value register
+  volatile uint32_t CLP0;  // ADC plus-side general calibration value register
+  volatile uint32_t PGA;   // ADC Programmable Gain Amplifier
+  volatile uint32_t CLMD;  // ADC minus-side general calibration value register
+  volatile uint32_t CLMS;  // ADC minus-side general calibration value register
+  volatile uint32_t CLM4;  // ADC minus-side general calibration value register
+  volatile uint32_t CLM3;  // ADC minus-side general calibration value register
+  volatile uint32_t CLM2;  // ADC minus-side general calibration value register
+  volatile uint32_t CLM1;  // ADC minus-side general calibration value register
+  volatile uint32_t CLM0;  // ADC minus-side general calibration value register
+} KINETIS_ADC_t __attribute__((aligned(0x1000)));
+#define ADC0 (*(KINETIS_ADC_t *)0x4003B000)
+#define ADC1 (*(KINETIS_ADC_t *)0x400BB000)
+static inline KINETIS_ADC_t *ADC(int i) { return (i == 0) ? &ADC0 : &ADC1; }
+
+// DEPRECATED(Brian): Use the new ones above.
 #define ADC0_SC1A		(*(volatile uint32_t *)0x4003B000) // ADC status and control registers 1
 #define ADC0_SC1B		(*(volatile uint32_t *)0x4003B004) // ADC status and control registers 1
 #define ADC_SC1_COCO			((uint32_t)0x80)		// Conversion complete flag
@@ -2797,7 +2275,25 @@
 
 // 12-bit Digital-to-Analog Converter (DAC)
 
-#if defined(KINETISK)
+#define DAC_SR_DACBFWMF			0x04				// Buffer Watermark Flag
+#define DAC_SR_DACBFRTF			0x02				// Pointer Top Position Flag
+#define DAC_SR_DACBFRBF			0x01				// Pointer Bottom Position Flag
+#define DAC_C0_DACEN			0x80				// DAC Enable
+#define DAC_C0_DACRFS			0x40				// DAC Reference Select
+#define DAC_C0_DACTRGSEL		0x20				// DAC Trigger Select
+#define DAC_C0_DACSWTRG			0x10				// DAC Software Trigger
+#define DAC_C0_LPEN			0x08				// DAC Low Power Control
+#define DAC_C0_DACBWIEN			0x04				// DAC Buffer Watermark Interrupt Enable
+#define DAC_C0_DACBTIEN			0x02				// DAC Buffer Read Pointer Top Flag Interrupt Enable
+#define DAC_C0_DACBBIEN			0x01				// DAC Buffer Read Pointer Bottom Flag Interrupt Enable
+#define DAC_C1_DMAEN			0x80				// DMA Enable Select
+#define DAC_C1_DACBFWM(n)		((((n) & 3) << 3))		// DAC Buffer Watermark Select
+#define DAC_C1_DACBFMD(n)		((((n) & 3) << 1))		// DAC Buffer Work Mode Select
+#define DAC_C1_DACBFEN			0x01				// DAC Buffer Enable
+#define DAC_C2_DACBFRP(n)		((((n) & 15) << 4))		// DAC Buffer Read Pointer
+#define DAC_C2_DACBFUP(n)		((((n) & 15) << 0))		// DAC Buffer Upper Limit
+
+#if defined(HAS_KINETIS_DAC0)
 #define DAC0_DAT0L		(*(volatile uint8_t  *)0x400CC000) // DAC Data Low Register
 #define DAC0_DATH		(*(volatile uint8_t  *)0x400CC001) // DAC Data High Register
 #define DAC0_DAT1L		(*(volatile uint8_t  *)0x400CC002) // DAC Data Low Register
@@ -2816,26 +2312,11 @@
 #define DAC0_DAT14L		(*(volatile uint8_t  *)0x400CC01C) // DAC Data Low Register
 #define DAC0_DAT15L		(*(volatile uint8_t  *)0x400CC01E) // DAC Data Low Register
 #define DAC0_SR			(*(volatile uint8_t  *)0x400CC020) // DAC Status Register
-#define DAC_SR_DACBFWMF			0x04				// Buffer Watermark Flag
-#define DAC_SR_DACBFRTF			0x02				// Pointer Top Position Flag
-#define DAC_SR_DACBFRBF			0x01				// Pointer Bottom Position Flag
 #define DAC0_C0			(*(volatile uint8_t  *)0x400CC021) // DAC Control Register
-#define DAC_C0_DACEN			0x80				// DAC Enable
-#define DAC_C0_DACRFS			0x40				// DAC Reference Select
-#define DAC_C0_DACTRGSEL		0x20				// DAC Trigger Select
-#define DAC_C0_DACSWTRG			0x10				// DAC Software Trigger
-#define DAC_C0_LPEN			0x08				// DAC Low Power Control
-#define DAC_C0_DACBWIEN			0x04				// DAC Buffer Watermark Interrupt Enable
-#define DAC_C0_DACBTIEN			0x02				// DAC Buffer Read Pointer Top Flag Interrupt Enable
-#define DAC_C0_DACBBIEN			0x01				// DAC Buffer Read Pointer Bottom Flag Interrupt Enable
 #define DAC0_C1			(*(volatile uint8_t  *)0x400CC022) // DAC Control Register 1
-#define DAC_C1_DMAEN			0x80				// DMA Enable Select
-#define DAC_C1_DACBFWM(n)		((((n) & 3) << 3))		// DAC Buffer Watermark Select
-#define DAC_C1_DACBFMD(n)		((((n) & 3) << 1))		// DAC Buffer Work Mode Select
-#define DAC_C1_DACBFEN			0x01				// DAC Buffer Enable
 #define DAC0_C2			(*(volatile uint8_t  *)0x400CC023) // DAC Control Register 2
-#define DAC_C2_DACBFRP(n)		((((n) & 15) << 4))		// DAC Buffer Read Pointer
-#define DAC_C2_DACBFUP(n)		((((n) & 15) << 0))		// DAC Buffer Upper Limit
+#endif
+#if defined(HAS_KINETIS_DAC1)
 #define DAC1_DAT0L		(*(volatile uint8_t  *)0x400CD000) // DAC Data Low Register
 #define DAC1_DATH		(*(volatile uint8_t  *)0x400CD001) // DAC Data High Register
 #define DAC1_DAT1L		(*(volatile uint8_t  *)0x400CD002) // DAC Data Low Register
@@ -2857,30 +2338,6 @@
 #define DAC1_C0			(*(volatile uint8_t  *)0x400CD021) // DAC Control Register
 #define DAC1_C1			(*(volatile uint8_t  *)0x400CD022) // DAC Control Register 1
 #define DAC1_C2			(*(volatile uint8_t  *)0x400CD023) // DAC Control Register 2
-
-#elif defined(KINETISL)
-#define DAC0_DAT0L		(*(volatile uint8_t  *)0x4003F000) // Data Low
-#define DAC0_DAT0H		(*(volatile uint8_t  *)0x4003F001) // Data High
-#define DAC0_DAT1L		(*(volatile uint8_t  *)0x4003F002) // Data Low
-#define DAC0_DAT1H		(*(volatile uint8_t  *)0x4003F003) // Data High
-#define DAC0_SR			(*(volatile uint8_t  *)0x4003F020) // Status
-#define DAC0_C0			(*(volatile uint8_t  *)0x4003F021) // Control Register
-#define DAC0_C1			(*(volatile uint8_t  *)0x4003F022) // Control Register 1
-#define DAC0_C2			(*(volatile uint8_t  *)0x4003F023) // Control Register 2
-#define DAC_SR_DACBFRPTF		((uint8_t)0x02)		// Read Pointer Top Position Flag
-#define DAC_SR_DACBFRPBF		((uint8_t)0x01)		// Read Pointer Bottom Position Flag
-#define DAC_C0_DACEN			((uint8_t)0x80)		// Enable
-#define DAC_C0_DACRFS			((uint8_t)0x40)		// Reference, 0=AREF pin, 1=VCC
-#define DAC_C0_DACTRGSEL		((uint8_t)0x20)		// Trigger Select
-#define DAC_C0_DACSWTRG			((uint8_t)0x10)		// Software Trigger
-#define DAC_C0_LPEN			((uint8_t)0x08)		// Low Power Control
-#define DAC_C0_DACBTIEN			((uint8_t)0x02)		// Top Flag Interrupt Enable
-#define DAC_C0_DACBBIEN			((uint8_t)0x01)		// Bottom Flag Interrupt Enable
-#define DAC_C1_DMAEN			((uint8_t)0x80)		// DMA Enable
-#define DAC_C1_DACBFMD			((uint8_t)0x04)		// Work Mode Select
-#define DAC_C1_DACBFEN			((uint8_t)0x01)		// Buffer Enable
-#define DAC_C2_DACBFRP			((uint8_t)0x10)		// Buffer Read Pointer
-#define DAC_C2_DACBFUP			((uint8_t)0x01)		// Buffer Upper Limit
 #endif
 
 // Analog Comparator (CMP)
@@ -2942,122 +2399,63 @@
 #define VREF_SC_REGEN			((uint8_t)0x40)			// Regulator enable
 #define VREF_SC_ICOMPEN			((uint8_t)0x20)			// Second order curvature compensation enable
 #define VREF_SC_VREFST			((uint8_t)0x04)			// Internal Voltage Reference stable flag
-#define VREF_SC_MODE_LV(n)		(uint8_t)(((n) & 3) << 0)	// Buffer Mode selection: 0=Bandgap on only
-									//  2=Low-power buffer mode
+#define VREF_SC_MODE_LV(n) \
+  ((uint8_t)(((n)&3) << 0))  // Buffer Mode selection: 0=Bandgap on only
+                             //  2=Low-power buffer mode
 
 // Programmable Delay Block (PDB)
 
-#define PDB0_SC			(*(volatile uint32_t *)0x40036000) // Status and Control Register
-#define PDB_SC_LDMOD(n)			(((n) & 3) << 18)	// Load Mode Select
-#define PDB_SC_PDBEIE			0x00020000		// Sequence Error Interrupt Enable
-#define PDB_SC_SWTRIG			0x00010000		// Software Trigger
-#define PDB_SC_DMAEN			0x00008000		// DMA Enable
-#define PDB_SC_PRESCALER(n)		(((n) & 7) << 12)	// Prescaler Divider Select
-#define PDB_SC_TRGSEL(n)		(((n) & 15) << 8)	// Trigger Input Source Select
-#define PDB_SC_PDBEN			0x00000080		// PDB Enable
-#define PDB_SC_PDBIF			0x00000040		// PDB Interrupt Flag
-#define PDB_SC_PDBIE			0x00000020		// PDB Interrupt Enable.
-#define PDB_SC_MULT(n)			(((n) & 3) << 2)	// Multiplication Factor
-#define PDB_SC_CONT			0x00000002		// Continuous Mode Enable
-#define PDB_SC_LDOK			0x00000001		// Load OK
-#define PDB0_MOD		(*(volatile uint32_t *)0x40036004) // Modulus Register
-#define PDB0_CNT		(*(volatile uint32_t *)0x40036008) // Counter Register
-#define PDB0_IDLY		(*(volatile uint32_t *)0x4003600C) // Interrupt Delay Register
-#define PDB0_CH0C1		(*(volatile uint32_t *)0x40036010) // Channel 0 Control Register 1
-#define PDB0_CH0S		(*(volatile uint32_t *)0x40036014) // Channel 0 Status Register
-#define PDB0_CH0DLY0		(*(volatile uint32_t *)0x40036018) // Channel 0 Delay 0 Register
-#define PDB0_CH0DLY1		(*(volatile uint32_t *)0x4003601C) // Channel 0 Delay 1 Register
-#define PDB0_CH1C1		(*(volatile uint32_t *)0x40036038) // Channel 1 Control Register 1
-#define PDB0_CH1S		(*(volatile uint32_t *)0x4003603C) // Channel 1 Status Register
-#define PDB0_CH1DLY0		(*(volatile uint32_t *)0x40036040) // Channel 1 Delay 0 Register
-#define PDB0_CH1DLY1		(*(volatile uint32_t *)0x40036044) // Channel 1 Delay 1 Register
-#define PDB0_DACINTC0		(*(volatile uint32_t *)0x40036150) // DAC Interval Trigger n Control Register
-#define PDB_DACINTC_EXT			0x02			// External Trigger Input Enable
-#define PDB_DACINTC_TOE			0x01			// Interval Trigger Enable
-#define PDB0_DACINT0		(*(volatile uint32_t *)0x40036154) // DAC Interval n Register
-#define PDB0_DACINTC1		(*(volatile uint32_t *)0x40036158) // DAC Interval Trigger n Control register
-#define PDB0_DACINT1		(*(volatile uint32_t *)0x4003615C) // DAC Interval n register
-#define PDB0_POEN		(*(volatile uint32_t *)0x40036190) // Pulse-Out n Enable Register
-#define PDB0_PO0DLY		(*(volatile uint32_t *)0x40036194) // Pulse-Out n Delay Register
-#define PDB0_PO1DLY		(*(volatile uint32_t *)0x40036198) // Pulse-Out n Delay Register
-#define PDB0_PO2DLY		(*(volatile uint32_t *)0x4003619C) // Pulse-Out n Delay Register
-#define PDB0_PO3DLY		(*(volatile uint32_t *)0x400361A0) // Pulse-Out n Delay Register
+#define V_PDB_LDMOD(n) ((uint32_t)(((n)&3) << 18))  // Load Mode Select
+#define M_PDB_PDBEIE UINT32_C(0x00020000)  // Sequence Error Interrupt Enable
+#define M_PDB_SWTRIG UINT32_C(0x00010000)  // Software Trigger
+#define M_PDB_DMAEN UINT32_C(0x00008000)   // DMA Enable
+#define V_PDB_PRESCALER(n) \
+  ((uint32_t)(((n)&7) << 12))  // Prescaler Divider Select
+#define V_PDB_TRGSEL(n) \
+  ((uint32_t)(((n)&15) << 8))                     // Trigger Input Source Select
+#define M_PDB_PDBEN UINT32_C(0x00000080)          // PDB Enable
+#define M_PDB_PDBIF UINT32_C(0x00000040)          // PDB Interrupt Flag
+#define M_PDB_PDBIE UINT32_C(0x00000020)          // PDB Interrupt Enable.
+#define V_PDB_MULT(n) ((uint32_t)(((n)&3) << 2))  // Multiplication Factor
+#define M_PDB_CONT UINT32_C(0x00000002)           // Continuous Mode Enable
+#define M_PDB_LDOK UINT32_C(0x00000001)           // Load OK
+#define M_PDB_EXT UINT32_C(0x02)  // External Trigger Input Enable
+#define M_PDB_TOE UINT32_C(0x01)  // Interval Trigger Enable
+#define V_PDB_BB(n) ((uint32_t)(((n) & 0xFF) << 16))
+#define V_PDB_TOS(n) ((uint32_t)(((n) & 0xFF) << 8))
+#define V_PDB_EN(n) ((uint32_t)(((n) & 0xFF) << 0))
 
-
-// Timer/PWM Module (TPM)
-
-#if defined(KINETISL)
-#define TPM0_SC			(*(volatile uint32_t *)0x40038000) // Status And Control
-#define TPM0_CNT		(*(volatile uint32_t *)0x40038004) // Counter
-#define TPM0_MOD		(*(volatile uint32_t *)0x40038008) // Modulo
-#define TPM0_C0SC		(*(volatile uint32_t *)0x4003800C) // Channel 0 Status And Control
-#define TPM0_C0V		(*(volatile uint32_t *)0x40038010) // Channel 0 Value
-#define TPM0_C1SC		(*(volatile uint32_t *)0x40038014) // Channel 1 Status And Control
-#define TPM0_C1V		(*(volatile uint32_t *)0x40038018) // Channel 1 Value
-#define TPM0_C2SC		(*(volatile uint32_t *)0x4003801C) // Channel 2 Status And Control
-#define TPM0_C2V		(*(volatile uint32_t *)0x40038020) // Channel 2 Value
-#define TPM0_C3SC		(*(volatile uint32_t *)0x40038024) // Channel 3 Status And Control
-#define TPM0_C3V		(*(volatile uint32_t *)0x40038028) // Channel 3 Value
-#define TPM0_C4SC		(*(volatile uint32_t *)0x4003802C) // Channel 4 Status And Control
-#define TPM0_C4V		(*(volatile uint32_t *)0x40038030) // Channel 4 Value
-#define TPM0_C5SC		(*(volatile uint32_t *)0x40038034) // Channel 5 Status And Control
-#define TPM0_C5V		(*(volatile uint32_t *)0x40038038) // Channel 5 Value
-#define TPM0_STATUS		(*(volatile uint32_t *)0x40038050) // Capture And Compare Status
-#define TPM0_CONF		(*(volatile uint32_t *)0x40038084) // Configuration
-#define TPM1_SC			(*(volatile uint32_t *)0x40039000) // Status And Control
-#define TPM1_CNT		(*(volatile uint32_t *)0x40039004) // Counter
-#define TPM1_MOD		(*(volatile uint32_t *)0x40039008) // Modulo
-#define TPM1_C0SC		(*(volatile uint32_t *)0x4003900C) // Channel 0 Status And Control
-#define TPM1_C0V		(*(volatile uint32_t *)0x40039010) // Channel 0 Value
-#define TPM1_C1SC		(*(volatile uint32_t *)0x40039014) // Channel 1 Status And Control
-#define TPM1_C1V		(*(volatile uint32_t *)0x40039018) // Channel 1 Value
-#define TPM1_STATUS		(*(volatile uint32_t *)0x40039050) // Capture And Compare Status
-#define TPM1_CONF		(*(volatile uint32_t *)0x40039084) // Configuration
-#define TPM2_SC			(*(volatile uint32_t *)0x4003A000) // Status And Control
-#define TPM2_CNT		(*(volatile uint32_t *)0x4003A004) // Counter
-#define TPM2_MOD		(*(volatile uint32_t *)0x4003A008) // Modulo
-#define TPM2_C0SC		(*(volatile uint32_t *)0x4003A00C) // Channel 0 Status And Control
-#define TPM2_C0V		(*(volatile uint32_t *)0x4003A010) // Channel 0 Value
-#define TPM2_C1SC		(*(volatile uint32_t *)0x4003A014) // Channel 1 Status And Control
-#define TPM2_C1V		(*(volatile uint32_t *)0x4003A018) // Channel 1 Value
-#define TPM2_STATUS		(*(volatile uint32_t *)0x4003A050) // Capture And Compare Status
-#define TPM2_CONF		(*(volatile uint32_t *)0x4003A084) // Configuration
-#elif defined(KINETISK)
-#define TPM1_SC			(*(volatile uint32_t *)0x400C9000) // Status And Control
-#define TPM1_CNT		(*(volatile uint32_t *)0x400C9004) // Counter
-#define TPM1_MOD		(*(volatile uint32_t *)0x400C9008) // Modulo
-#define TPM1_C0SC		(*(volatile uint32_t *)0x400C900C) // Channel 0 Status And Control
-#define TPM1_C0V		(*(volatile uint32_t *)0x400C9010) // Channel 0 Value
-#define TPM1_C1SC		(*(volatile uint32_t *)0x400C9014) // Channel 1 Status And Control
-#define TPM1_C1V		(*(volatile uint32_t *)0x400C9018) // Channel 1 Value
-#define TPM1_STATUS		(*(volatile uint32_t *)0x400C9050) // Capture And Compare Status
-#define TPM1_COMBINE		(*(volatile uint32_t *)0x400C9064) // Function For Linked Channels
-#define TPM1_POL		(*(volatile uint32_t *)0x400C9070) // Channels Polarity
-#define TPM1_FILTER		(*(volatile uint32_t *)0x400C9078) // Input Capture Filter Control
-#define TPM1_QDCTRL		(*(volatile uint32_t *)0x400C9080) // Quadrature Decoder Control And Status
-#define TPM1_CONF		(*(volatile uint32_t *)0x400C9084) // Configuration
-#define TPM2_SC			(*(volatile uint32_t *)0x400CA000) // Status And Control
-#define TPM2_CNT		(*(volatile uint32_t *)0x400CA004) // Counter
-#define TPM2_MOD		(*(volatile uint32_t *)0x400CA008) // Modulo
-#define TPM2_C0SC		(*(volatile uint32_t *)0x400CA00C) // Channel 0 Status And Control
-#define TPM2_C0V		(*(volatile uint32_t *)0x400CA010) // Channel 0 Value
-#define TPM2_C1SC		(*(volatile uint32_t *)0x400CA014) // Channel 1 Status And Control
-#define TPM2_C1V		(*(volatile uint32_t *)0x400CA018) // Channel 1 Value
-#define TPM2_STATUS		(*(volatile uint32_t *)0x400CA050) // Capture And Compare Status
-#define TPM2_COMBINE		(*(volatile uint32_t *)0x400CA064) // Function For Linked Channels
-#define TPM2_POL		(*(volatile uint32_t *)0x400CA070) // Channels Polarity
-#define TPM2_FILTER		(*(volatile uint32_t *)0x400CA078) // Input Capture Filter Control
-#define TPM2_QDCTRL		(*(volatile uint32_t *)0x400CA080) // Quadrature Decoder Control And Status
-#define TPM2_CONF		(*(volatile uint32_t *)0x400CA084) // Configuration
-#endif
+typedef struct {
+  volatile uint32_t C1;      // Channel n Control Register 1
+  volatile uint32_t S;       // Channel n Status Register
+  volatile uint32_t DLY[2];  // Channel n Delay n Register
+  volatile uint32_t unused1[6];
+} KINETIS_PDB_CHANNEL_t;
+static_assert(sizeof(KINETIS_PDB_CHANNEL_t) == 40, "padding is wrong");
+typedef struct {
+  volatile uint32_t Cn;  // DAC Interval Trigger n Control Register
+  volatile uint32_t n;   // DAC Interval n Register
+} KINETIS_PDB_DACINT_t;
+typedef struct {
+  volatile uint32_t SC;    // Status and Control Register
+  volatile uint32_t MOD;   // Modulus Register
+  volatile uint32_t CNT;   // Counter Register
+  volatile uint32_t IDLY;  // Interrupt Delay Register
+  KINETIS_PDB_CHANNEL_t CH[2];
+  volatile uint32_t unused1[60];
+  KINETIS_PDB_DACINT_t DACINT[2];
+  volatile uint32_t unused2[12];
+  volatile uint32_t POEN;                       // Pulse-Out n Enable Register
+  volatile uint32_t POnDLY[PDB_NUM_PULSE_OUT];  // Pulse-Out n Delay Register
+} KINETIS_PDB_t __attribute__((aligned(0x1000)));
+static_assert(offsetof(KINETIS_PDB_t, DACINT) == 0x150, "padding is wrong");
+static_assert(offsetof(KINETIS_PDB_t, POEN) == 0x190, "padding is wrong");
+#define PDB0 (*(KINETIS_PDB_t *)0x40036000)
 
 
 // FlexTimer Module (FTM)
 
 #define FTM0_SC			(*(volatile uint32_t *)0x40038000) // Status And Control
-#ifdef KINETISL
-#define FTM_SC_DMA			0x100				// DMA Enable
-#endif
 #define FTM_SC_TOF			0x80				// Timer Overflow Flag
 #define FTM_SC_TOIE			0x40				// Timer Overflow Interrupt Enable
 #define FTM_SC_CPWMS			0x20				// Center-Aligned PWM Select
@@ -3311,7 +2709,6 @@
 #define FTM1_SWOCTRL		(*(volatile uint32_t *)0x40039094) // FTM Software Output Control
 #define FTM1_PWMLOAD		(*(volatile uint32_t *)0x40039098) // FTM PWM Load
 
-#if defined(KINETISK)
 #define FTM2_SC			(*(volatile uint32_t *)0x400B8000) // Status And Control
 #define FTM2_CNT		(*(volatile uint32_t *)0x400B8004) // Counter
 #define FTM2_MOD		(*(volatile uint32_t *)0x400B8008) // Modulo
@@ -3378,17 +2775,6 @@
 #define FTM3_INVCTRL		(*(volatile uint32_t *)0x400B9090) // FTM Inverting Control
 #define FTM3_SWOCTRL		(*(volatile uint32_t *)0x400B9094) // FTM Software Output Control
 #define FTM3_PWMLOAD		(*(volatile uint32_t *)0x400B9098) // FTM PWM Load
-#elif defined(KINETISL)
-#define FTM2_SC			(*(volatile uint32_t *)0x4003A000) // Status And Control
-#define FTM2_CNT		(*(volatile uint32_t *)0x4003A004) // Counter
-#define FTM2_MOD		(*(volatile uint32_t *)0x4003A008) // Modulo
-#define FTM2_C0SC		(*(volatile uint32_t *)0x4003A00C) // Channel 0 Status And Control
-#define FTM2_C0V		(*(volatile uint32_t *)0x4003A010) // Channel 0 Value
-#define FTM2_C1SC		(*(volatile uint32_t *)0x4003A014) // Channel 1 Status And Control
-#define FTM2_C1V		(*(volatile uint32_t *)0x4003A018) // Channel 1 Value
-#define FTM2_STATUS		(*(volatile uint32_t *)0x4003A050) // Capture And Compare Status
-#define FTM2_CONF		(*(volatile uint32_t *)0x4003A084) // Configuration
-#endif
 
 
 // Periodic Interrupt Timer (PIT)
@@ -3396,10 +2782,6 @@
 #define PIT_MCR			(*(volatile uint32_t *)0x40037000) // PIT Module Control Register
 #define PIT_MCR_MDIS            (1<<1)                               // Module disable
 #define PIT_MCR_FRZ             (1<<0)                               // Freeze
-#if defined(KINETISL)
-#define PIT_LTMR64H             (*(volatile uint32_t *)0x400370E0) // PIT Upper Lifetime Timer Register
-#define PIT_LTMR64L             (*(volatile uint32_t *)0x400370E4) // PIT Lower Lifetime Timer Register
-#endif // defined(KINETISL)
 typedef struct {
 	volatile uint32_t	LDVAL;
 	volatile uint32_t	CVAL;
@@ -3419,7 +2801,6 @@
 #define PIT_CVAL1		(*(volatile uint32_t *)0x40037114) // Current Timer Value Register
 #define PIT_TCTRL1		(*(volatile uint32_t *)0x40037118) // Timer Control Register
 #define PIT_TFLG1		(*(volatile uint32_t *)0x4003711C) // Timer Flag Register
-#if defined(KINETISK) // the 3.1 has 4 PITs, LC has only 2
 #define PIT_LDVAL2		(*(volatile uint32_t *)0x40037120) // Timer Load Value Register
 #define PIT_CVAL2		(*(volatile uint32_t *)0x40037124) // Current Timer Value Register
 #define PIT_TCTRL2		(*(volatile uint32_t *)0x40037128) // Timer Control Register
@@ -3428,7 +2809,6 @@
 #define PIT_CVAL3		(*(volatile uint32_t *)0x40037134) // Current Timer Value Register
 #define PIT_TCTRL3		(*(volatile uint32_t *)0x40037138) // Timer Control Register
 #define PIT_TFLG3		(*(volatile uint32_t *)0x4003713C) // Timer Flag Register
-#endif // defined(KINETISK)
 
 // Low-Power Timer (LPTMR)
 
@@ -3500,6 +2880,7 @@
 #define RTC_RAR			(*(volatile uint32_t *)0x4003D804) // RTC Read Access Register
 
 
+#if defined(HAS_KINETIS_ENET)
 // 10/100-Mbps Ethernet MAC (ENET)
 
 #define ENET_EIR		(*(volatile uint32_t *)0x400C0004) // Interrupt Event Register
@@ -3711,6 +3092,7 @@
 #define ENET_TCCR2		(*(volatile uint32_t *)0x400C061C) // Timer Compare Capture Register
 #define ENET_TCSR3		(*(volatile uint32_t *)0x400C0620) // Timer Control Status Register
 #define ENET_TCCR3		(*(volatile uint32_t *)0x400C0624) // Timer Compare Capture Register
+#endif
 
 
 // Universal Serial Bus OTG Controller (USBOTG)
@@ -3882,6 +3264,7 @@
 #define USBHSDCD_TIMER2		(*(volatile uint32_t *)0x400A3018) // TIMER2 register
 
 
+#if defined(HAS_KINETIS_USBHS)
 // USB High Speed OTG Controller (USBHS)
 
 #define USBHS_ID		(*(volatile uint32_t *)0x400A1000) // Identification Register
@@ -4057,8 +3440,10 @@
 #define USBHS_USBGENCTRL	(*(volatile uint32_t *)0x400A1200) // USB General Control Register
 #define USBHS_USBGENCTRL_WU_INT_CLR	((uint32_t)0x00000020)
 #define USBHS_USBGENCTRL_WU_IE		((uint32_t)0x00000001)
+#endif
 
 
+#if defined(HAS_KINETIS_USBPHY)
 // Universal Serial Bus 2.0 Integrated PHY (USB-PHY)
 
 #define USBPHY_PWD		(*(volatile uint32_t *)0x400A2000) // USB PHY Power-Down Register
@@ -4169,10 +3554,12 @@
 #define USBPHY_TRIM_OVERRIDE_EN_SET	(*(volatile uint32_t *)0x400A2134) // USB PHY Trim Override Enable Register
 #define USBPHY_TRIM_OVERRIDE_EN_CLR	(*(volatile uint32_t *)0x400A2138) // USB PHY Trim Override Enable Register
 #define USBPHY_TRIM_OVERRIDE_EN_TOG	(*(volatile uint32_t *)0x400A213C) // USB PHY Trim Override Enable Register
+#endif
 
 
 // CAN - Controller Area Network (FlexCAN)
 
+#if defined(HAS_KINETIS_CAN0)
 #define CAN0_MCR		(*(volatile uint32_t *)0x40024000) // Module Configuration Register
 #define CAN0_CTRL1		(*(volatile uint32_t *)0x40024004) // Control 1 register
 #define CAN0_TIMER		(*(volatile uint32_t *)0x40024008) // Free Running Timer
@@ -4204,6 +3591,8 @@
 #define CAN0_RXIMR13		(*(volatile uint32_t *)0x400248B4) // Rx Individual Mask Registers
 #define CAN0_RXIMR14		(*(volatile uint32_t *)0x400248B8) // Rx Individual Mask Registers
 #define CAN0_RXIMR15		(*(volatile uint32_t *)0x400248BC) // Rx Individual Mask Registers
+#endif
+#if defined(HAS_KINETIS_CAN1)
 #define CAN1_MCR		(*(volatile uint32_t *)0x400A4000) // Module Configuration Register
 #define CAN1_CTRL1		(*(volatile uint32_t *)0x400A4004) // Control 1 register
 #define CAN1_TIMER		(*(volatile uint32_t *)0x400A4008) // Free Running Timer
@@ -4235,11 +3624,60 @@
 #define CAN1_RXIMR13		(*(volatile uint32_t *)0x400A48B4) // Rx Individual Mask Registers
 #define CAN1_RXIMR14		(*(volatile uint32_t *)0x400A48B8) // Rx Individual Mask Registers
 #define CAN1_RXIMR15		(*(volatile uint32_t *)0x400A48BC) // Rx Individual Mask Registers
+#endif
 
 
 // SPI (DSPI)
 
-#if defined(KINETISK)
+#define SPI_MCR_MSTR			((uint32_t)0x80000000)		// Master/Slave Mode Select
+#define SPI_MCR_CONT_SCKE		((uint32_t)0x40000000)		//
+#define SPI_MCR_DCONF(n)		(((n) & 3) << 28)		//
+#define SPI_MCR_FRZ			((uint32_t)0x08000000)		//
+#define SPI_MCR_MTFE			((uint32_t)0x04000000)		//
+#define SPI_MCR_ROOE			((uint32_t)0x01000000)		//
+#define SPI_MCR_PCSIS(n)		(((n) & 0x1F) << 16)		//
+#define SPI_MCR_DOZE			((uint32_t)0x00008000)		//
+#define SPI_MCR_MDIS			((uint32_t)0x00004000)		//
+#define SPI_MCR_DIS_TXF			((uint32_t)0x00002000)		//
+#define SPI_MCR_DIS_RXF			((uint32_t)0x00001000)		//
+#define SPI_MCR_CLR_TXF			((uint32_t)0x00000800)		//
+#define SPI_MCR_CLR_RXF			((uint32_t)0x00000400)		//
+#define SPI_MCR_SMPL_PT(n)		(((n) & 3) << 8)		//
+#define SPI_MCR_HALT			((uint32_t)0x00000001)		//
+#define SPI_CTAR_DBR			((uint32_t)0x80000000)		// Double Baud Rate
+#define SPI_CTAR_FMSZ(n)		(((n) & 15) << 27)		// Frame Size (+1)
+#define SPI_CTAR_CPOL			((uint32_t)0x04000000)		// Clock Polarity
+#define SPI_CTAR_CPHA			((uint32_t)0x02000000)		// Clock Phase
+#define SPI_CTAR_LSBFE			((uint32_t)0x01000000)		// LSB First
+#define SPI_CTAR_PCSSCK(n)		(((n) & 3) << 22)		// PCS to SCK Delay Prescaler
+#define SPI_CTAR_PASC(n)		(((n) & 3) << 20)		// After SCK Delay Prescaler
+#define SPI_CTAR_PDT(n)			(((n) & 3) << 18)		// Delay after Transfer Prescaler
+#define SPI_CTAR_PBR(n)			(((n) & 3) << 16)		// Baud Rate Prescaler
+#define SPI_CTAR_CSSCK(n)		(((n) & 15) << 12)		// PCS to SCK Delay Scaler
+#define SPI_CTAR_ASC(n)			(((n) & 15) << 8)		// After SCK Delay Scaler
+#define SPI_CTAR_DT(n)			(((n) & 15) << 4)		// Delay After Transfer Scaler
+#define SPI_CTAR_BR(n)			(((n) & 15) << 0)		// Baud Rate Scaler
+#define SPI_SR_TCF			((uint32_t)0x80000000)		// Transfer Complete Flag
+#define SPI_SR_TXRXS			((uint32_t)0x40000000)		// TX and RX Status
+#define SPI_SR_EOQF			((uint32_t)0x10000000)		// End of Queue Flag
+#define SPI_SR_TFUF			((uint32_t)0x08000000)		// Transmit FIFO Underflow Flag
+#define SPI_SR_TFFF			((uint32_t)0x02000000)		// Transmit FIFO Fill Flag
+#define SPI_SR_RFOF			((uint32_t)0x00080000)		// Receive FIFO Overflow Flag
+#define SPI_SR_RFDF			((uint32_t)0x00020000)		// Receive FIFO Drain Flag
+#define SPI_RSER_TCF_RE			((uint32_t)0x80000000)		// Transmission Complete Request Enable
+#define SPI_RSER_EOQF_RE		((uint32_t)0x10000000)		// DSPI Finished Request Request Enable
+#define SPI_RSER_TFUF_RE		((uint32_t)0x08000000)		// Transmit FIFO Underflow Request Enable
+#define SPI_RSER_TFFF_RE		((uint32_t)0x02000000)		// Transmit FIFO Fill Request Enable
+#define SPI_RSER_TFFF_DIRS		((uint32_t)0x01000000)		// Transmit FIFO FIll Dma or Interrupt Request Select
+#define SPI_RSER_RFOF_RE		((uint32_t)0x00080000)		// Receive FIFO Overflow Request Enable
+#define SPI_RSER_RFDF_RE		((uint32_t)0x00020000)		// Receive FIFO Drain Request Enable
+#define SPI_RSER_RFDF_DIRS		((uint32_t)0x00010000)		// Receive FIFO Drain DMA or Interrupt Request Select
+#define SPI_PUSHR_CONT			((uint32_t)0x80000000)		//
+#define SPI_PUSHR_CTAS(n)		(((n) & 7) << 28)		//
+#define SPI_PUSHR_EOQ			((uint32_t)0x08000000)		//
+#define SPI_PUSHR_CTCNT			((uint32_t)0x04000000)		//
+#define SPI_PUSHR_PCS(n)		(((n) & 31) << 16)		//
+
 typedef struct {
 	volatile uint32_t	MCR;	// 0
 	volatile uint32_t	unused1;// 4
@@ -4261,61 +3699,13 @@
 } KINETISK_SPI_t;
 #define KINETISK_SPI0		(*(KINETISK_SPI_t *)0x4002C000)
 #define SPI0_MCR		(KINETISK_SPI0.MCR)	// DSPI Module Configuration Register
-#define SPI_MCR_MSTR			((uint32_t)0x80000000)		// Master/Slave Mode Select
-#define SPI_MCR_CONT_SCKE		((uint32_t)0x40000000)		//
-#define SPI_MCR_DCONF(n)		(((n) & 3) << 28)		//
-#define SPI_MCR_FRZ			((uint32_t)0x08000000)		//
-#define SPI_MCR_MTFE			((uint32_t)0x04000000)		//
-#define SPI_MCR_ROOE			((uint32_t)0x01000000)		//
-#define SPI_MCR_PCSIS(n)		(((n) & 0x1F) << 16)		//
-#define SPI_MCR_DOZE			((uint32_t)0x00008000)		//
-#define SPI_MCR_MDIS			((uint32_t)0x00004000)		//
-#define SPI_MCR_DIS_TXF			((uint32_t)0x00002000)		//
-#define SPI_MCR_DIS_RXF			((uint32_t)0x00001000)		//
-#define SPI_MCR_CLR_TXF			((uint32_t)0x00000800)		//
-#define SPI_MCR_CLR_RXF			((uint32_t)0x00000400)		//
-#define SPI_MCR_SMPL_PT(n)		(((n) & 3) << 8)		//
-#define SPI_MCR_HALT			((uint32_t)0x00000001)		//
 #define SPI0_TCR		(KINETISK_SPI0.TCR)	// DSPI Transfer Count Register
 #define SPI0_CTAR0		(KINETISK_SPI0.CTAR0)	// DSPI Clock and Transfer Attributes Register, In Master Mode
-#define SPI_CTAR_DBR			((uint32_t)0x80000000)		// Double Baud Rate
-#define SPI_CTAR_FMSZ(n)		(((n) & 15) << 27)		// Frame Size (+1)
-#define SPI_CTAR_CPOL			((uint32_t)0x04000000)		// Clock Polarity
-#define SPI_CTAR_CPHA			((uint32_t)0x02000000)		// Clock Phase
-#define SPI_CTAR_LSBFE			((uint32_t)0x01000000)		// LSB First
-#define SPI_CTAR_PCSSCK(n)		(((n) & 3) << 22)		// PCS to SCK Delay Prescaler
-#define SPI_CTAR_PASC(n)		(((n) & 3) << 20)		// After SCK Delay Prescaler
-#define SPI_CTAR_PDT(n)			(((n) & 3) << 18)		// Delay after Transfer Prescaler
-#define SPI_CTAR_PBR(n)			(((n) & 3) << 16)		// Baud Rate Prescaler
-#define SPI_CTAR_CSSCK(n)		(((n) & 15) << 12)		// PCS to SCK Delay Scaler
-#define SPI_CTAR_ASC(n)			(((n) & 15) << 8)		// After SCK Delay Scaler
-#define SPI_CTAR_DT(n)			(((n) & 15) << 4)		// Delay After Transfer Scaler
-#define SPI_CTAR_BR(n)			(((n) & 15) << 0)		// Baud Rate Scaler
 #define SPI0_CTAR0_SLAVE	(KINETISK_SPI0.CTAR0)	// DSPI Clock and Transfer Attributes Register, In Slave Mode
 #define SPI0_CTAR1		(KINETISK_SPI0.CTAR1)	// DSPI Clock and Transfer Attributes Register, In Master Mode
 #define SPI0_SR			(KINETISK_SPI0.SR)	// DSPI Status Register
-#define SPI_SR_TCF			((uint32_t)0x80000000)		// Transfer Complete Flag
-#define SPI_SR_TXRXS			((uint32_t)0x40000000)		// TX and RX Status
-#define SPI_SR_EOQF			((uint32_t)0x10000000)		// End of Queue Flag
-#define SPI_SR_TFUF			((uint32_t)0x08000000)		// Transmit FIFO Underflow Flag
-#define SPI_SR_TFFF			((uint32_t)0x02000000)		// Transmit FIFO Fill Flag
-#define SPI_SR_RFOF			((uint32_t)0x00080000)		// Receive FIFO Overflow Flag
-#define SPI_SR_RFDF			((uint32_t)0x00020000)		// Receive FIFO Drain Flag
 #define SPI0_RSER		(KINETISK_SPI0.RSER)	// DSPI DMA/Interrupt Request Select and Enable Register
-#define SPI_RSER_TCF_RE			((uint32_t)0x80000000)		// Transmission Complete Request Enable
-#define SPI_RSER_EOQF_RE		((uint32_t)0x10000000)		// DSPI Finished Request Request Enable
-#define SPI_RSER_TFUF_RE		((uint32_t)0x08000000)		// Transmit FIFO Underflow Request Enable
-#define SPI_RSER_TFFF_RE		((uint32_t)0x02000000)		// Transmit FIFO Fill Request Enable
-#define SPI_RSER_TFFF_DIRS		((uint32_t)0x01000000)		// Transmit FIFO FIll Dma or Interrupt Request Select
-#define SPI_RSER_RFOF_RE		((uint32_t)0x00080000)		// Receive FIFO Overflow Request Enable
-#define SPI_RSER_RFDF_RE		((uint32_t)0x00020000)		// Receive FIFO Drain Request Enable
-#define SPI_RSER_RFDF_DIRS		((uint32_t)0x00010000)		// Receive FIFO Drain DMA or Interrupt Request Select
 #define SPI0_PUSHR		(KINETISK_SPI0.PUSHR)	// DSPI PUSH TX FIFO Register In Master Mode
-#define SPI_PUSHR_CONT			((uint32_t)0x80000000)		//
-#define SPI_PUSHR_CTAS(n)		(((n) & 7) << 28)		//
-#define SPI_PUSHR_EOQ			((uint32_t)0x08000000)		//
-#define SPI_PUSHR_CTCNT			((uint32_t)0x04000000)		//
-#define SPI_PUSHR_PCS(n)		(((n) & 31) << 16)		//
 #define SPI0_PUSHR_SLAVE	(KINETISK_SPI0.PUSHR)	// DSPI PUSH TX FIFO Register In Slave Mode
 #define SPI0_POPR		(KINETISK_SPI0.POPR)	// DSPI POP RX FIFO Register
 #define SPI0_TXFR0		(KINETISK_SPI0.TXFR[0])	// DSPI Transmit FIFO Registers
@@ -4327,7 +3717,7 @@
 #define SPI0_RXFR2		(KINETISK_SPI0.RXFR[2])	// DSPI Receive FIFO Registers
 #define SPI0_RXFR3		(KINETISK_SPI0.RXFR[3])	// DSPI Receive FIFO Registers
 
-#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
+#if defined(HAS_KINETIS_SPI1)
 #define KINETISK_SPI1		(*(KINETISK_SPI_t *)0x4002D000)
 #define SPI1_MCR		(KINETISK_SPI1.MCR)	// DSPI Module Configuration Register
 #define SPI1_TCR		(KINETISK_SPI1.TCR)	// DSPI Transfer Count Register
@@ -4347,7 +3737,9 @@
 #define SPI1_RXFR1		(KINETISK_SPI1.RXFR[1])	// DSPI Receive FIFO Registers
 #define SPI1_RXFR2		(KINETISK_SPI1.RXFR[2])	// DSPI Receive FIFO Registers
 #define SPI1_RXFR3		(KINETISK_SPI1.RXFR[3])	// DSPI Receive FIFO Registers
+#endif
 
+#if defined(HAS_KINETIS_SPI2)
 #define KINETISK_SPI2		(*(KINETISK_SPI_t *)0x400AC000)
 #define SPI2_MCR		(KINETISK_SPI2.MCR)	// DSPI Module Configuration Register
 #define SPI2_TCR		(KINETISK_SPI2.TCR)	// DSPI Transfer Count Register
@@ -4367,110 +3759,11 @@
 #define SPI2_RXFR1		(KINETISK_SPI2.RXFR[1])	// DSPI Receive FIFO Registers
 #define SPI2_RXFR2		(KINETISK_SPI2.RXFR[2])	// DSPI Receive FIFO Registers
 #define SPI2_RXFR3		(KINETISK_SPI2.RXFR[3])	// DSPI Receive FIFO Registers
-
-#endif
-#elif defined(KINETISL)
-typedef struct {
-	volatile uint8_t	S;
-	volatile uint8_t	BR;
-	volatile uint8_t	C2;
-	volatile uint8_t	C1;
-	volatile uint8_t	ML;
-	volatile uint8_t	MH;
-	volatile uint8_t	DL;
-	volatile uint8_t	DH;
-	volatile uint8_t	unused1;
-	volatile uint8_t	unused2;
-	volatile uint8_t	CI;
-	volatile uint8_t	C3;
-} KINETISL_SPI_t;
-#define KINETISL_SPI0		(*(KINETISL_SPI_t *)0x40076000)
-#define KINETISL_SPI1		(*(KINETISL_SPI_t *)0x40077000)
-#define SPI0_S			(KINETISL_SPI0.S)		// Status
-#define SPI_S_SPRF			((uint8_t)0x80)			// Read Buffer Full Flag
-#define SPI_S_SPMF			((uint8_t)0x40)			// Match Flag
-#define SPI_S_SPTEF			((uint8_t)0x20)			// Transmit Buffer Empty Flag
-#define SPI_S_MODF			((uint8_t)0x10)			// Fault Flag
-#define SPI_S_RNFULLF			((uint8_t)0x08)			// Receive FIFO nearly full flag
-#define SPI_S_TNEAREF			((uint8_t)0x04)			// Transmit FIFO nearly empty flag
-#define SPI_S_TXFULLF			((uint8_t)0x02)			// Transmit FIFO full flag
-#define SPI_S_RFIFOEF			((uint8_t)0x01)			// Read FIFO empty flag
-#define SPI0_BR			(KINETISL_SPI0.BR)		// Baud Rate
-#define SPI_BR_SPPR(n)			(((n) & 7) << 4)		// Prescale = N+1
-#define SPI_BR_SPR(n)			(((n) & 15) << 0)		// Baud Rate Divisor = 2^(N+1) : 0-8 -> 2 to 512
-#define SPI0_C2			(KINETISL_SPI0.C2)		// Control Register 2
-#define SPI_C2_SPMIE			((uint8_t)0x80)			// Match Interrupt Enable
-#define SPI_C2_SPIMODE			((uint8_t)0x40)			// 0 = 8 bit mode, 1 = 16 bit mode
-#define SPI_C2_TXDMAE			((uint8_t)0x20)			// Transmit DMA enable
-#define SPI_C2_MODFEN			((uint8_t)0x10)			// Master Mode-Fault Function Enable
-#define SPI_C2_BIDIROE			((uint8_t)0x08)			// Bidirectional Mode Output Enable
-#define SPI_C2_RXDMAE			((uint8_t)0x04)			// Receive DMA enable
-#define SPI_C2_SPISWAI			((uint8_t)0x02)			// SPI Stop in Wait Mode
-#define SPI_C2_SPC0			((uint8_t)0x01)			// SPI Pin Control, 0=normal, 1=single bidirectional
-#define SPI0_C1			(KINETISL_SPI0.C1)		// Control Register 1
-#define SPI_C1_SPIE			((uint8_t)0x80)			// Interrupt Enable
-#define SPI_C1_SPE			((uint8_t)0x40)			// SPI System Enable
-#define SPI_C1_SPTIE			((uint8_t)0x20)			// Transmit Interrupt Enable
-#define SPI_C1_MSTR			((uint8_t)0x10)			// Master/Slave Mode: 0=slave, 1=master
-#define SPI_C1_CPOL			((uint8_t)0x08)			// Clock Polarity
-#define SPI_C1_CPHA			((uint8_t)0x04)			// Clock Phase
-#define SPI_C1_SSOE			((uint8_t)0x02)			// Slave Select Output Enable
-#define SPI_C1_LSBFE			((uint8_t)0x01)			// LSB First: 0=MSB First, 1=LSB First
-#define SPI0_ML			(KINETISL_SPI0.ML)		// Match Low
-#define SPI0_MH			(KINETISL_SPI0.MH)		// Match High
-#define SPI0_DL			(KINETISL_SPI0.DL)		// Data Low
-#define SPI0_DH			(KINETISL_SPI0.DH)		// Data High
-#define SPI0_CI			(KINETISL_SPI0.CI)		// Clear Interrupt
-#define SPI_CI_TXFERR			((uint8_t)0x80)			// Transmit FIFO error flag
-#define SPI_CI_RXFERR			((uint8_t)0x40)			// Receive FIFO error flag
-#define SPI_CI_TXFOF			((uint8_t)0x20)			// Transmit FIFO overflow flag
-#define SPI_CI_RXFOF			((uint8_t)0x10)			// Receive FIFO overflow flag
-#define SPI_CI_TNEAREFCI		((uint8_t)0x08)			// Transmit FIFO nearly empty flag clear interrupt
-#define SPI_CI_RNFULLFCI		((uint8_t)0x04)			// Receive FIFO nearly full flag clear interrupt
-#define SPI_CI_SPTEFCI			((uint8_t)0x02)			// Transmit FIFO empty flag clear interrupt
-#define SPI_CI_SPRFCI			((uint8_t)0x01)			// Receive FIFO full flag clear interrupt
-#define SPI0_C3			(KINETISL_SPI0.C3)		// Control Register 3
-#define SPI_C3_TNEAREF_MARK		((uint8_t)0x20)			// Transmit FIFO nearly empty watermark
-#define SPI_C3_RNFULLF_MARK		((uint8_t)0x10)			// Receive FIFO nearly full watermark
-#define SPI_C3_INTCLR			((uint8_t)0x08)			// Interrupt clearing mechanism select
-#define SPI_C3_TNEARIEN			((uint8_t)0x04)			// Transmit FIFO nearly empty interrupt enable
-#define SPI_C3_RNFULLIEN		((uint8_t)0x02)			// Receive FIFO nearly full interrupt enable
-#define SPI_C3_FIFOMODE			((uint8_t)0x01)			// FIFO mode enable
-#define SPI1_S			(KINETISL_SPI1.S)		// Status
-#define SPI1_BR			(KINETISL_SPI1.BR)		// Baud Rate
-#define SPI1_C2			(KINETISL_SPI1.C2)		// Control Register 2
-#define SPI1_C1			(KINETISL_SPI1.C1)		// Control Register 1
-#define SPI1_ML			(KINETISL_SPI1.ML)		// Match Low
-#define SPI1_MH			(KINETISL_SPI1.MH)		// Match High
-#define SPI1_DL			(KINETISL_SPI1.DL)		// Data Low
-#define SPI1_DH			(KINETISL_SPI1.DH)		// Data High
-#define SPI1_CI			(KINETISL_SPI1.CI)		// Dlear Interrupt
-#define SPI1_C3			(KINETISL_SPI1.C3)		// Control Register 3
 #endif
 
 
 // Inter-Integrated Circuit (I2C)
 
-typedef struct {
-	volatile uint8_t	A1;
-	volatile uint8_t	F;
-	volatile uint8_t	C1;
-	volatile uint8_t	S;
-	volatile uint8_t	D;
-	volatile uint8_t	C2;
-	volatile uint8_t	FLT;
-	volatile uint8_t	RA;
-	volatile uint8_t	SMB;
-	volatile uint8_t	A2;
-	volatile uint8_t	SLTH;
-	volatile uint8_t	SLTL;
-} KINETIS_I2C_t;
-#define KINETIS_I2C0		(*(KINETIS_I2C_t *)0x40066000)
-#define KINETIS_I2C1		(*(KINETIS_I2C_t *)0x40067000)
-#define KINETIS_I2C2		(*(KINETIS_I2C_t *)0x400E6000)
-#define KINETIS_I2C3		(*(KINETIS_I2C_t *)0x400E7000)
-#define I2C0_A1			(KINETIS_I2C0.A1)		// I2C Address Register 1
-#define I2C0_F			(KINETIS_I2C0.F)		// I2C Frequency Divider register
 #define I2C_F_DIV20			((uint8_t)0x00)
 #define I2C_F_DIV22			((uint8_t)0x01)
 #define I2C_F_DIV24			((uint8_t)0x02)
@@ -4535,7 +3828,6 @@
 //#define I2C_F_DIV768			((uint8_t)0x31)
 //#define I2C_F_DIV1280			((uint8_t)0x38)
 //#define I2C_F_DIV1536			((uint8_t)0x39)
-#define I2C0_C1			(KINETIS_I2C0.C1)		// I2C Control Register 1
 #define I2C_C1_IICEN			((uint8_t)0x80)			// I2C Enable
 #define I2C_C1_IICIE			((uint8_t)0x40)			// I2C Interrupt Enable
 #define I2C_C1_MST			((uint8_t)0x20)			// Master Mode Select
@@ -4544,7 +3836,6 @@
 #define I2C_C1_RSTA			((uint8_t)0x04)			// Repeat START
 #define I2C_C1_WUEN			((uint8_t)0x02)			// Wakeup Enable
 #define I2C_C1_DMAEN			((uint8_t)0x01)			// DMA Enable
-#define I2C0_S			(KINETIS_I2C0.S)		// I2C Status register
 #define I2C_S_TCF			((uint8_t)0x80)			// Transfer Complete Flag
 #define I2C_S_IAAS			((uint8_t)0x40)			// Addressed As A Slave
 #define I2C_S_BUSY			((uint8_t)0x20)			// Bus Busy
@@ -4553,26 +3844,46 @@
 #define I2C_S_SRW			((uint8_t)0x04)			// Slave Read/Write
 #define I2C_S_IICIF			((uint8_t)0x02)			// Interrupt Flag
 #define I2C_S_RXAK			((uint8_t)0x01)			// Receive Acknowledge
-#define I2C0_D			(KINETIS_I2C0.D)		// I2C Data I/O register
-#define I2C0_C2			(KINETIS_I2C0.C2)		// I2C Control Register 2
 #define I2C_C2_GCAEN			((uint8_t)0x80)			// General Call Address Enable
 #define I2C_C2_ADEXT			((uint8_t)0x40)			// Address Extension
 #define I2C_C2_HDRS			((uint8_t)0x20)			// High Drive Select
 #define I2C_C2_SBRC			((uint8_t)0x10)			// Slave Baud Rate Control
 #define I2C_C2_RMEN			((uint8_t)0x08)			// Range Address Matching Enable
 #define I2C_C2_AD(n)			((n) & 7)			// Slave Address, upper 3 bits
-#define I2C0_FLT		(KINETIS_I2C0.FLT)		// I2C Programmable Input Glitch Filter register
 #define I2C_FLT_SHEN			((uint8_t)0x80)			// Stop Hold Enable
 #define I2C_FLT_STOPF			((uint8_t)0x40)			// Stop Detect Flag
 #define I2C_FLT_STOPIE			((uint8_t)0x20)			// Stop Interrupt Enable
 #define I2C_FLT_FTL(n)			((n) & 0x1F)			// Programmable Filter Factor
+
+typedef struct {
+	volatile uint8_t	A1;
+	volatile uint8_t	F;
+	volatile uint8_t	C1;
+	volatile uint8_t	S;
+	volatile uint8_t	D;
+	volatile uint8_t	C2;
+	volatile uint8_t	FLT;
+	volatile uint8_t	RA;
+	volatile uint8_t	SMB;
+	volatile uint8_t	A2;
+	volatile uint8_t	SLTH;
+	volatile uint8_t	SLTL;
+} KINETIS_I2C_t;
+#define KINETIS_I2C0		(*(KINETIS_I2C_t *)0x40066000)
+#define I2C0_A1			(KINETIS_I2C0.A1)		// I2C Address Register 1
+#define I2C0_F			(KINETIS_I2C0.F)		// I2C Frequency Divider register
+#define I2C0_C1			(KINETIS_I2C0.C1)		// I2C Control Register 1
+#define I2C0_S			(KINETIS_I2C0.S)		// I2C Status register
+#define I2C0_D			(KINETIS_I2C0.D)		// I2C Data I/O register
+#define I2C0_C2			(KINETIS_I2C0.C2)		// I2C Control Register 2
+#define I2C0_FLT		(KINETIS_I2C0.FLT)		// I2C Programmable Input Glitch Filter register
 #define I2C0_RA			(KINETIS_I2C0.RA)		// I2C Range Address register
 #define I2C0_SMB		(KINETIS_I2C0.SMB)		// I2C SMBus Control and Status register
 #define I2C0_A2			(KINETIS_I2C0.A2)		// I2C Address Register 2
 #define I2C0_SLTH		(KINETIS_I2C0.SLTH)		// I2C SCL Low Timeout Register High
 #define I2C0_SLTL		(KINETIS_I2C0.SLTL)		// I2C SCL Low Timeout Register Low
 
-#define I2C1_A1			(KINETIS_I2C1.A1)		// I2C Address Register 1
+#define KINETIS_I2C1		(*(KINETIS_I2C_t *)0x40067000)
 #define I2C1_F			(KINETIS_I2C1.F)		// I2C Frequency Divider register
 #define I2C1_C1			(KINETIS_I2C1.C1)		// I2C Control Register 1
 #define I2C1_S			(KINETIS_I2C1.S)		// I2C Status register
@@ -4585,6 +3896,8 @@
 #define I2C1_SLTH		(KINETIS_I2C1.SLTH)		// I2C SCL Low Timeout Register High
 #define I2C1_SLTL		(KINETIS_I2C1.SLTL)		// I2C SCL Low Timeout Register Low
 
+#define KINETIS_I2C2		(*(KINETIS_I2C_t *)0x400E6000)
+#define I2C1_A1			(KINETIS_I2C1.A1)		// I2C Address Register 1
 #define I2C2_A1			(KINETIS_I2C2.A1)		// I2C Address Register 1
 #define I2C2_F			(KINETIS_I2C2.F)		// I2C Frequency Divider register
 #define I2C2_C1			(KINETIS_I2C2.C1)		// I2C Control Register 1
@@ -4598,6 +3911,8 @@
 #define I2C2_SLTH		(KINETIS_I2C2.SLTH)		// I2C SCL Low Timeout Register High
 #define I2C2_SLTL		(KINETIS_I2C2.SLTL)		// I2C SCL Low Timeout Register Low
 
+#if defined(HAS_KINETIS_I2C3)
+#define KINETIS_I2C3		(*(KINETIS_I2C_t *)0x400E7000)
 #define I2C3_A1			(KINETIS_I2C3.A1)		// I2C Address Register 1
 #define I2C3_F			(KINETIS_I2C3.F)		// I2C Frequency Divider register
 #define I2C3_C1			(KINETIS_I2C3.C1)		// I2C Control Register 1
@@ -4610,424 +3925,197 @@
 #define I2C3_A2			(KINETIS_I2C3.A2)		// I2C Address Register 2
 #define I2C3_SLTH		(KINETIS_I2C3.SLTH)		// I2C SCL Low Timeout Register High
 #define I2C3_SLTL		(KINETIS_I2C3.SLTL)		// I2C SCL Low Timeout Register Low
+#endif
 
 
 // Universal Asynchronous Receiver/Transmitter (UART)
 
+#define M_UART_SBNS 0x20  // UART Stop Bit Number Select (TLC T3.5 T3.6)
+#define M_UART_LOOPS \
+  0x80  //  When LOOPS is set, the RxD pin is disconnected from the UART and the
+        //  transmitter output is internally connected to the receiver input
+#define M_UART_UARTSWAI 0x40  //  UART Stops in Wait Mode
+#define M_UART_RSRC \
+  0x20  //  When LOOPS is set, the RSRC field determines the source for the
+        //  receiver shift register input
+#define M_UART_M 0x10        //  9-bit or 8-bit Mode Select
+#define M_UART_WAKE 0x08     //  Determines which condition wakes the UART
+#define M_UART_ILT 0x04      //  Idle Line Type Select
+#define M_UART_PE 0x02       //  Parity Enable
+#define M_UART_PT 0x01       //  Parity Type, 0=even, 1=odd
+#define M_UART_TIE 0x80      //  Transmitter Interrupt or DMA Transfer Enable.
+#define M_UART_TCIE 0x40     //  Transmission Complete Interrupt Enable
+#define M_UART_RIE 0x20      //  Receiver Full Interrupt or DMA Transfer Enable
+#define M_UART_ILIE 0x10     //  Idle Line Interrupt Enable
+#define M_UART_TE 0x08       //  Transmitter Enable
+#define M_UART_RE 0x04       //  Receiver Enable
+#define M_UART_RWU 0x02      //  Receiver Wakeup Control
+#define M_UART_SBK 0x01      //  Send Break
+#define M_UART_TDRE 0x80     //  Transmit Data Register Empty Flag
+#define M_UART_TC 0x40       //  Transmit Complete Flag
+#define M_UART_RDRF 0x20     //  Receive Data Register Full Flag
+#define M_UART_IDLE 0x10     //  Idle Line Flag
+#define M_UART_OR 0x08       //  Receiver Overrun Flag
+#define M_UART_NF 0x04       //  Noise Flag
+#define M_UART_FE 0x02       //  Framing Error Flag
+#define M_UART_PF 0x01       //  Parity Error Flag
+#define M_UART_LBKDIF 0x80   // LIN Break Detect Interrupt Flag
+#define M_UART_RXEDGIF 0x40  // RxD Pin Active Edge Interrupt Flag
+#define M_UART_MSBF 0x20     // Most Significant Bit First
+#define M_UART_RXINV 0x10    // Receive Data Inversion
+#define M_UART_RWUID 0x08    // Receive Wakeup Idle Detect
+#define M_UART_BRK13 0x04    // Break Transmit Character Length
+#define M_UART_LBKDE 0x02    // LIN Break Detection Enable
+#define M_UART_RAF 0x01      // Receiver Active Flag
+#define M_UART_R8 0x80       // Received Bit 8
+#define M_UART_T8 0x40       // Transmit Bit 8
+#define M_UART_TXDIR 0x20    // TX Pin Direction in Single-Wire mode
+#define M_UART_TXINV 0x10    // Transmit Data Inversion
+#define M_UART_ORIE 0x08     // Overrun Error Interrupt Enable
+#define M_UART_NEIE 0x04     // Noise Error Interrupt Enable
+#define M_UART_FEIE 0x02     // Framing Error Interrupt Enable
+#define M_UART_PEIE 0x01     // Parity Error Interrupt Enable
+#define M_UART_MAEN1 0x80    // Match Address Mode Enable 1
+#define M_UART_MAEN2 0x40    // Match Address Mode Enable 2
+#define M_UART_M10 0x20      // 10-bit Mode select
+#define V_UART_BRFA(n) (((uint8_t)(n)) & 31)  // Baud Rate Fine Adjust
+#define M_UART_TDMAS 0x80                     // Transmitter DMA Select
+#define M_UART_RDMAS 0x20                     // Receiver Full DMA Select
+#define M_UART_NOISY 0x80                     // data received with noise
+#define M_UART_PARITYE 0x40   // data received with a parity error
+#define M_UART_RXRTSE 0x08    // Receiver request-to-send enable
+#define M_UART_TXRTSPOL 0x04  // Transmitter request-to-send polarity
+#define M_UART_TXRTSE 0x02    // Transmitter request-to-send enable
+#define M_UART_TXCTSE 0x01    // Transmitter clear-to-send enable
+#define M_UART_IREN 0x04      // Infrared enable
+#define V_UART_TNP(n) \
+  (((uint8_t)(n)) & 3)    // TX narrow pulse, 0=3/16, 1=1/16, 2=1/32, 3=1/4
+#define M_UART_TXFE 0x80  //  Transmit FIFO Enable
+#define G_UART_TXFIFOSIZE(n) \
+  ((((uint8_t)(n)) >> 4) &   \
+   7)  //  Transmit FIFO Size, 0=1, 1=4, 2=8, 3=16, 4=32, 5=64, 6=128
+#define M_UART_RXFE 0x08  //  Receive FIFO Enable
+#define G_UART_RXFIFOSIZE(n) \
+  ((((uint8_t)(n)) >> 0) &   \
+   7)  //  Transmit FIFO Size, 0=1, 1=4, 2=8, 3=16, 4=32, 5=64, 6=128
+#define M_UART_TXFLUSH 0x80    //  Transmit FIFO/Buffer Flush
+#define M_UART_RXFLUSH 0x40    //  Receive FIFO/Buffer Flush
+#define M_UART_RXOFE 0x04      //  Receive FIFO Overflow Interrupt Enable
+#define M_UART_TXOFE 0x02      //  Transmit FIFO Overflow Interrupt Enable
+#define M_UART_RXUFE 0x01      //  Receive FIFO Underflow Interrupt Enable
+#define M_UART_TXEMPT 0x80     //  Transmit Buffer/FIFO Empty
+#define M_UART_RXEMPT 0x40     //  Receive Buffer/FIFO Empty
+#define M_UART_RXOF 0x04       //  Receiver Buffer Overflow Flag
+#define M_UART_TXOF 0x02       //  Transmitter Buffer Overflow Flag
+#define M_UART_RXUF 0x01       //  Receiver Buffer Underflow Flag
+#define M_UART_ONACK 0x10      //  Generate NACK on Overflow
+#define M_UART_ANACK 0x08      //  Generate NACK on Error
+#define M_UART_INIT 0x04       //  Detect Initial Character
+#define M_UART_TTYPE 0x02      //  Transfer Type
+#define M_UART_ISO_7816E 0x01  //  ISO-7816 Functionality Enabled
+#define M_UART_WTE 0x80        //  Wait Timer Interrupt Enable
+#define M_UART_CWTE 0x40       //  Character Wait Timer Interrupt Enable
+#define M_UART_BWTE 0x20       //  Block Wait Timer Interrupt Enable
+#define M_UART_INITDE 0x10     //  Initial Character Detected Interrupt Enable
+#define M_UART_GTVE 0x04       //  Guard Timer Violated Interrupt Enable
+#define M_UART_TXTE 0x02       //  Transmit Threshold Exceeded Interrupt Enable
+#define M_UART_RXTE 0x01       //  Receive Threshold Exceeded Interrupt Enable
+#define M_UART_WT 0x80         //  Wait Timer Interrupt
+#define M_UART_CWT 0x40        //  Character Wait Timer Interrupt
+#define M_UART_BWT 0x20        //  Block Wait Timer Interrupt
+#define M_UART_INITD 0x10      //  Initial Character Detected Interrupt
+#define M_UART_GTV 0x04        //  Guard Timer Violated Interrupt
+#define M_UART_TXT 0x02        //  Transmit Threshold Exceeded Interrupt
+#define M_UART_RXT 0x01        //  Receive Threshold Exceeded Interrupt
+#define V_UART_CWI(n)       \
+  (                         \
+      (((uint8_t)(n)) & 15) \
+      << 4)  //  Character Wait Time Integer (C7816[TTYPE] = 1)
+#define V_UART_BWI(n) \
+  ((((uint8_t)(n)) & 15) << 0)  //  Block Wait Time Integer(C7816[TTYPE] = 1)
+#define V_UART_TXTHRESHOLD(n) \
+  ((((uint8_t)(n)) & 15) << 4)  //  Transmit NACK Threshold
+#define V_UART_RXTHRESHOLD(n) \
+  ((((uint8_t)(n)) & 15) << 0)  //  Receive NACK Threshold
+#define M_UART_EN709 0x80       //  Enables the CEA709.1-B feature.
+#define M_UART_TX709 0x40       //  Starts CEA709.1-B transmission.
+#define M_UART_CE 0x20          //  Collision Enable
+#define M_UART_CP 0x10          //  Collision Signal Polarity
+#define M_UART_WBEIE 0x40       //  WBASE Expired Interrupt Enable
+#define M_UART_ISDIE 0x20       //  Initial Sync Detection Interrupt Enable
+#define M_UART_PRXIE 0x10       //  Packet Received Interrupt Enable
+#define M_UART_PTXIE 0x08       //  Packet Transmitted Interrupt Enable
+#define M_UART_PCTEIE 0x04      //  Packet Cycle Timer Interrupt Enable
+#define M_UART_PSIE 0x02        //  Preamble Start Interrupt Enable
+#define M_UART_TXFIE 0x01       //  Transmission Fail Interrupt Enable
+
 typedef struct __attribute__((packed)) {
-	volatile uint8_t	BDH;
-	volatile uint8_t	BDL;
-	volatile uint8_t	C1;
-	volatile uint8_t	C2;
-	volatile uint8_t	S1;
-	volatile uint8_t	S2;
-	volatile uint8_t	C3;
-	volatile uint8_t	D;
-	volatile uint8_t	MA1;
-	volatile uint8_t	MA2;
-	volatile uint8_t	C4;
-	volatile uint8_t	C5;
-	volatile uint8_t	ED;
-	volatile uint8_t	MODEM;
-	volatile uint8_t	IR;
-	volatile uint8_t	unused1;
-	volatile uint8_t	PFIFO;
-	volatile uint8_t	CFIFO;
-	volatile uint8_t	SFIFO;
-	volatile uint8_t	TWFIFO;
-	volatile uint8_t	TCFIFO;
-	volatile uint8_t	RWFIFO;
-	volatile uint8_t	RCFIFO;
-	volatile uint8_t	unused2;
-	volatile uint8_t	C7816;
-	volatile uint8_t	IE7816;
-	volatile uint8_t	IS7816;
-	union { volatile uint8_t WP7816T0; volatile uint8_t WP7816T1; };
-	volatile uint8_t	WN7816;
-	volatile uint8_t	WF7816;
-	volatile uint8_t	ET7816;
-	volatile uint8_t	TL7816;
-	volatile uint8_t	unused3;
-	volatile uint8_t	C6;
-	volatile uint8_t	PCTH;
-	volatile uint8_t	PCTL;
-	volatile uint8_t	B1T;
-	volatile uint8_t	SDTH;
-	volatile uint8_t	SDTL;
-	volatile uint8_t	PRE;
-	volatile uint8_t	TPL;
-	volatile uint8_t	IE;
-	volatile uint8_t	WB;
-	volatile uint8_t	S3;
-	volatile uint8_t	S4;
-	volatile uint8_t	RPL;
-	volatile uint8_t	RPREL;
-	volatile uint8_t	CPW;
-	volatile uint8_t	RIDT;
-	volatile uint8_t	TIDT;
-} KINETISK_UART_t;
-#define KINETISK_UART0		(*(KINETISK_UART_t *)0x4006A000)
-#define UART0_BDH		(KINETISK_UART0.BDH)		// UART Baud Rate Registers: High
-#define UART_BDH_SBNS		0x20			// UART Stop Bit Number Select (TLC T3.5 T3.6)
-#define UART0_BDL		(KINETISK_UART0.BDL)		// UART Baud Rate Registers: Low
-#define UART0_C1		(KINETISK_UART0.C1)		// UART Control Register 1
-#define UART_C1_LOOPS		0x80			//  When LOOPS is set, the RxD pin is disconnected from the UART and the transmitter output is internally connected to the receiver input
-#define UART_C1_UARTSWAI	0x40			//  UART Stops in Wait Mode
-#define UART_C1_RSRC		0x20			//  When LOOPS is set, the RSRC field determines the source for the receiver shift register input
-#define UART_C1_M			0x10			//  9-bit or 8-bit Mode Select
-#define UART_C1_WAKE		0x08			//  Determines which condition wakes the UART
-#define UART_C1_ILT		0x04			//  Idle Line Type Select
-#define UART_C1_PE		0x02			//  Parity Enable
-#define UART_C1_PT		0x01			//  Parity Type, 0=even, 1=odd
-#define UART0_C2		(KINETISK_UART0.C2)		// UART Control Register 2
-#define UART_C2_TIE		0x80			//  Transmitter Interrupt or DMA Transfer Enable.
-#define UART_C2_TCIE		0x40			//  Transmission Complete Interrupt Enable
-#define UART_C2_RIE		0x20			//  Receiver Full Interrupt or DMA Transfer Enable
-#define UART_C2_ILIE		0x10			//  Idle Line Interrupt Enable
-#define UART_C2_TE		0x08			//  Transmitter Enable
-#define UART_C2_RE		0x04			//  Receiver Enable
-#define UART_C2_RWU		0x02			//  Receiver Wakeup Control
-#define UART_C2_SBK		0x01			//  Send Break
-#define UART0_S1		(KINETISK_UART0.S1)		// UART Status Register 1
-#define UART_S1_TDRE		0x80			//  Transmit Data Register Empty Flag
-#define UART_S1_TC		0x40			//  Transmit Complete Flag
-#define UART_S1_RDRF		0x20			//  Receive Data Register Full Flag
-#define UART_S1_IDLE		0x10			//  Idle Line Flag
-#define UART_S1_OR		0x08			//  Receiver Overrun Flag
-#define UART_S1_NF		0x04			//  Noise Flag
-#define UART_S1_FE		0x02			//  Framing Error Flag
-#define UART_S1_PF		0x01			//  Parity Error Flag
-#define UART0_S2		(KINETISK_UART0.S2)		// UART Status Register 2
-#define UART_S2_LBKDIF		0x80			// LIN Break Detect Interrupt Flag
-#define UART_S2_RXEDGIF		0x40			// RxD Pin Active Edge Interrupt Flag
-#define UART_S2_MSBF		0x20			// Most Significant Bit First
-#define UART_S2_RXINV		0x10			// Receive Data Inversion
-#define UART_S2_RWUID		0x08			// Receive Wakeup Idle Detect
-#define UART_S2_BRK13		0x04			// Break Transmit Character Length
-#define UART_S2_LBKDE		0x02			// LIN Break Detection Enable
-#define UART_S2_RAF		0x01			// Receiver Active Flag
-#define UART0_C3		(KINETISK_UART0.C3)		// UART Control Register 3
-#define UART_C3_R8		0x80			// Received Bit 8
-#define UART_C3_T8		0x40			// Transmit Bit 8
-#define UART_C3_TXDIR		0x20			// TX Pin Direction in Single-Wire mode
-#define UART_C3_TXINV		0x10			// Transmit Data Inversion
-#define UART_C3_ORIE		0x08			// Overrun Error Interrupt Enable
-#define UART_C3_NEIE		0x04			// Noise Error Interrupt Enable
-#define UART_C3_FEIE		0x02			// Framing Error Interrupt Enable
-#define UART_C3_PEIE		0x01			// Parity Error Interrupt Enable
-#define UART0_D			(KINETISK_UART0.D)		// UART Data Register
-#define UART0_MA1		(KINETISK_UART0.MA1)		// UART Match Address Registers 1
-#define UART0_MA2		(KINETISK_UART0.MA2)		// UART Match Address Registers 2
-#define UART0_C4		(KINETISK_UART0.C4)		// UART Control Register 4
-#define UART_C4_MAEN1		0x80			// Match Address Mode Enable 1
-#define UART_C4_MAEN2		0x40			// Match Address Mode Enable 2
-#define UART_C4_M10		0x20			// 10-bit Mode select
-#define UART_C4_BRFA(n)		((n) & 31)		// Baud Rate Fine Adjust
-#define UART0_C5		(KINETISK_UART0.C5)		// UART Control Register 5
-#define UART_C5_TDMAS		0x80			// Transmitter DMA Select
-#define UART_C5_RDMAS		0x20			// Receiver Full DMA Select
-#define UART0_ED		(KINETISK_UART0.ED)		// UART Extended Data Register
-#define UART_ED_NOISY		0x80			// data received with noise
-#define UART_ED_PARITYE		0x40			// data received with a parity error
-#define UART0_MODEM		(KINETISK_UART0.MODEM)		// UART Modem Register
-#define UART_MODEM_RXRTSE	0x08			// Receiver request-to-send enable
-#define UART_MODEM_TXRTSPOL	0x04			// Transmitter request-to-send polarity
-#define UART_MODEM_TXRTSE	0x02			// Transmitter request-to-send enable
-#define UART_MODEM_TXCTSE	0x01			// Transmitter clear-to-send enable
-#define UART0_IR		(KINETISK_UART0.IR)		// UART Infrared Register
-#define UART_IR_IREN		0x04			// Infrared enable
-#define UART_IR_TNP(n)		((n) & 3)		// TX narrow pulse, 0=3/16, 1=1/16, 2=1/32, 3=1/4
-#define UART0_PFIFO		(KINETISK_UART0.PFIFO)		// UART FIFO Parameters
-#define UART_PFIFO_TXFE		0x80			//  Transmit FIFO Enable
-#define UART_PFIFO_TXFIFOSIZE(n) (((n) & 7) << 4)	//  Transmit FIFO Size, 0=1, 1=4, 2=8, 3=16, 4=32, 5=64, 6=128
-#define UART_PFIFO_RXFE		0x08			//  Receive FIFO Enable
-#define UART_PFIFO_RXFIFOSIZE(n) (((n) & 7) << 0)	//  Transmit FIFO Size, 0=1, 1=4, 2=8, 3=16, 4=32, 5=64, 6=128
-#define UART0_CFIFO		(KINETISK_UART0.CFIFO)		// UART FIFO Control Register
-#define UART_CFIFO_TXFLUSH	0x80			//  Transmit FIFO/Buffer Flush
-#define UART_CFIFO_RXFLUSH	0x40			//  Receive FIFO/Buffer Flush
-#define UART_CFIFO_RXOFE	0x04			//  Receive FIFO Overflow Interrupt Enable
-#define UART_CFIFO_TXOFE	0x02			//  Transmit FIFO Overflow Interrupt Enable
-#define UART_CFIFO_RXUFE	0x01			//  Receive FIFO Underflow Interrupt Enable
-#define UART0_SFIFO		(KINETISK_UART0.SFIFO)		// UART FIFO Status Register
-#define UART_SFIFO_TXEMPT	0x80			//  Transmit Buffer/FIFO Empty
-#define UART_SFIFO_RXEMPT	0x40			//  Receive Buffer/FIFO Empty
-#define UART_SFIFO_RXOF		0x04			//  Receiver Buffer Overflow Flag
-#define UART_SFIFO_TXOF		0x02			//  Transmitter Buffer Overflow Flag
-#define UART_SFIFO_RXUF		0x01			//  Receiver Buffer Underflow Flag
-#define UART0_TWFIFO		(KINETISK_UART0.TWFIFO)		// UART FIFO Transmit Watermark
-#define UART0_TCFIFO		(KINETISK_UART0.TCFIFO)		// UART FIFO Transmit Count
-#define UART0_RWFIFO		(KINETISK_UART0.RWFIFO)		// UART FIFO Receive Watermark
-#define UART0_RCFIFO		(KINETISK_UART0.RCFIFO)		// UART FIFO Receive Count
-#define UART0_C7816		(KINETISK_UART0.C7816)		// UART 7816 Control Register
-#define UART_C7816_ONACK	0x10			//  Generate NACK on Overflow
-#define UART_C7816_ANACK	0x08			//  Generate NACK on Error
-#define UART_C7816_INIT		0x04			//  Detect Initial Character
-#define UART_C7816_TTYPE	0x02			//  Transfer Type
-#define UART_C7816_ISO_7816E	0x01			//  ISO-7816 Functionality Enabled
-#define UART0_IE7816		(KINETISK_UART0.IE7816)		// UART 7816 Interrupt Enable Register
-#define UART_IE7816_WTE		0x80			//  Wait Timer Interrupt Enable
-#define UART_IE7816_CWTE	0x40			//  Character Wait Timer Interrupt Enable
-#define UART_IE7816_BWTE	0x20			//  Block Wait Timer Interrupt Enable
-#define UART_IE7816_INITDE	0x10			//  Initial Character Detected Interrupt Enable
-#define UART_IE7816_GTVE	0x04			//  Guard Timer Violated Interrupt Enable
-#define UART_IE7816_TXTE	0x02			//  Transmit Threshold Exceeded Interrupt Enable
-#define UART_IE7816_RXTE	0x01			//  Receive Threshold Exceeded Interrupt Enable
-#define UART0_IS7816		(KINETISK_UART0.IS7816)		// UART 7816 Interrupt Status Register
-#define UART_IS7816_WT		0x80			//  Wait Timer Interrupt
-#define UART_IS7816_CWT		0x40			//  Character Wait Timer Interrupt
-#define UART_IS7816_BWT		0x20			//  Block Wait Timer Interrupt
-#define UART_IS7816_INITD	0x10			//  Initial Character Detected Interrupt
-#define UART_IS7816_GTV		0x04			//  Guard Timer Violated Interrupt
-#define UART_IS7816_TXT		0x02			//  Transmit Threshold Exceeded Interrupt
-#define UART_IS7816_RXT		0x01			//  Receive Threshold Exceeded Interrupt
-#define UART0_WP7816T0		(KINETISK_UART0.WP7816T0)	// UART 7816 Wait Parameter Register
-#define UART0_WP7816T1		(KINETISK_UART0.WP7816T1)	// UART 7816 Wait Parameter Register
-#define UART_WP7816T1_CWI(n)	(((n) & 15) << 4)	//  Character Wait Time Integer (C7816[TTYPE] = 1)
-#define UART_WP7816T1_BWI(n)	(((n) & 15) << 0)	//  Block Wait Time Integer(C7816[TTYPE] = 1)
-#define UART0_WN7816		(KINETISK_UART0.WN7816)		// UART 7816 Wait N Register
-#define UART0_WF7816		(KINETISK_UART0.WF7816)		// UART 7816 Wait FD Register
-#define UART0_ET7816		(KINETISK_UART0.ET7816)		// UART 7816 Error Threshold Register
-#define UART_ET7816_TXTHRESHOLD(n) (((n) & 15) << 4)	//  Transmit NACK Threshold
-#define UART_ET7816_RXTHRESHOLD(n) (((n) & 15) << 0)	//  Receive NACK Threshold
-#define UART0_TL7816		(KINETISK_UART0.TL7816)		// UART 7816 Transmit Length Register
-#define UART0_C6		(KINETISK_UART0.C6)		// UART CEA709.1-B Control Register 6
-#define UART_C6_EN709		0x80			//  Enables the CEA709.1-B feature.
-#define UART_C6_TX709		0x40			//  Starts CEA709.1-B transmission.
-#define UART_C6_CE		0x20			//  Collision Enable
-#define UART_C6_CP		0x10			//  Collision Signal Polarity
-#define UART0_PCTH		(KINETISK_UART0.PCTH)		// UART CEA709.1-B Packet Cycle Time Counter High
-#define UART0_PCTL		(KINETISK_UART0.PCTL)		// UART CEA709.1-B Packet Cycle Time Counter Low
-#define UART0_B1T		(KINETISK_UART0.B1T)		// UART CEA709.1-B Beta1 Timer
-#define UART0_SDTH		(KINETISK_UART0.SDTH)		// UART CEA709.1-B Secondary Delay Timer High
-#define UART0_SDTL		(KINETISK_UART0.SDTL)		// UART CEA709.1-B Secondary Delay Timer Low
-#define UART0_PRE		(KINETISK_UART0.PRE)		// UART CEA709.1-B Preamble
-#define UART0_TPL		(KINETISK_UART0.TPL)		// UART CEA709.1-B Transmit Packet Length
-#define UART0_IE		(KINETISK_UART0.IE)		// UART CEA709.1-B Interrupt Enable Register
-#define UART_IE_WBEIE		0x40			//  WBASE Expired Interrupt Enable
-#define UART_IE_ISDIE		0x20			//  Initial Sync Detection Interrupt Enable
-#define UART_IE_PRXIE		0x10			//  Packet Received Interrupt Enable
-#define UART_IE_PTXIE		0x08			//  Packet Transmitted Interrupt Enable
-#define UART_IE_PCTEIE		0x04			//  Packet Cycle Timer Interrupt Enable
-#define UART_IE_PSIE		0x02			//  Preamble Start Interrupt Enable
-#define UART_IE_TXFIE		0x01			//  Transmission Fail Interrupt Enable
-#define UART0_WB		(KINETISK_UART0.WB)		// UART CEA709.1-B WBASE
-#define UART0_S3		(KINETISK_UART0.S3)		// UART CEA709.1-B Status Register
-#define UART_S3_PEF		0x80			//  Preamble Error Flag
-#define UART_S3_WBEF		0x40			//  Wbase Expired Flag
-#define UART_S3_ISD		0x20			//  Initial Sync Detect
-#define UART_S3_PRXF		0x10			//  Packet Received Flag
-#define UART_S3_PTXF		0x08			//  Packet Transmitted Flag
-#define UART_S3_PCTEF		0x04			//  Packet Cycle Timer Expired Flag
-#define UART_S3_PSF		0x02			//  Preamble Start Flag
-#define UART_S3_TXFF		0x01			//  Transmission Fail Flag
-#define UART0_S4		(KINETISK_UART0.S4)		// UART CEA709.1-B Status Register
-#define UART_S4_INITF		0x10			//  Initial Synchronization Fail Flag
-#define UART_S4_CDET(n)		(((n) & 3) << 2)	//  Indicates collision: 0=none, 1=preamble, 2=data, 3=line code violation
-#define UART_S4_ILCV		0x02			//  Improper Line Code Violation
-#define UART_S4_FE		0x01			//  Framing Error
-#define UART0_RPL		(KINETISK_UART0.RPL)	// UART CEA709.1-B Received Packet Length
-#define UART0_RPREL		(KINETISK_UART0.RPREL)	// UART CEA709.1-B Received Preamble Length
-#define UART0_CPW		(KINETISK_UART0.CPW)	// UART CEA709.1-B Collision Pulse Width
-#define UART0_RIDT		(KINETISK_UART0.RIDT)	// UART CEA709.1-B Receive Indeterminate Time
-#define UART0_TIDT		(KINETISK_UART0.TIDT)	// UART CEA709.1-B Transmit Indeterminate Time
-#define KINETISK_UART1		(*(KINETISK_UART_t *)0x4006B000)
-#define UART1_BDH		(KINETISK_UART1.BDH)	// UART Baud Rate Registers: High
-#define UART1_BDL		(KINETISK_UART1.BDL)	// UART Baud Rate Registers: Low
-#define UART1_C1		(KINETISK_UART1.C1)	// UART Control Register 1
-#define UART1_C2		(KINETISK_UART1.C2)	// UART Control Register 2
-#define UART1_S1		(KINETISK_UART1.S1)	// UART Status Register 1
-#define UART1_S2		(KINETISK_UART1.S2)	// UART Status Register 2
-#define UART1_C3		(KINETISK_UART1.C3)	// UART Control Register 3
-#define UART1_D			(KINETISK_UART1.D)	// UART Data Register
-#define UART1_MA1		(KINETISK_UART1.MA1)	// UART Match Address Registers 1
-#define UART1_MA2		(KINETISK_UART1.MA2)	// UART Match Address Registers 2
-#define UART1_C4		(KINETISK_UART1.C4)	// UART Control Register 4
-#define UART1_C5		(KINETISK_UART1.C5)	// UART Control Register 5
-#define UART1_ED		(KINETISK_UART1.ED)	// UART Extended Data Register
-#define UART1_MODEM		(KINETISK_UART1.MODEM)	// UART Modem Register
-#define UART1_IR		(KINETISK_UART1.IR)	// UART Infrared Register
-#define UART1_PFIFO		(KINETISK_UART1.PFIFO)	// UART FIFO Parameters
-#define UART1_CFIFO		(KINETISK_UART1.CFIFO)	// UART FIFO Control Register
-#define UART1_SFIFO		(KINETISK_UART1.SFIFO)	// UART FIFO Status Register
-#define UART1_TWFIFO		(KINETISK_UART1.TWFIFO)	// UART FIFO Transmit Watermark
-#define UART1_TCFIFO		(KINETISK_UART1.TCFIFO)	// UART FIFO Transmit Count
-#define UART1_RWFIFO		(KINETISK_UART1.RWFIFO)	// UART FIFO Receive Watermark
-#define UART1_RCFIFO		(KINETISK_UART1.RCFIFO)	// UART FIFO Receive Count
-#define UART1_C7816		(KINETISK_UART1.C7816)	// UART 7816 Control Register
-#define UART1_IE7816		(KINETISK_UART1.IE7816)	// UART 7816 Interrupt Enable Register
-#define UART1_IS7816		(KINETISK_UART1.IS7816)	// UART 7816 Interrupt Status Register
-#define UART1_WP7816T0		(KINETISK_UART1.WP7816T0)// UART 7816 Wait Parameter Register
-#define UART1_WP7816T1		(KINETISK_UART1.WP7816T1)// UART 7816 Wait Parameter Register
-#define UART1_WN7816		(KINETISK_UART1.WN7816)	// UART 7816 Wait N Register
-#define UART1_WF7816		(KINETISK_UART1.WF7816)	// UART 7816 Wait FD Register
-#define UART1_ET7816		(KINETISK_UART1.ET7816)	// UART 7816 Error Threshold Register
-#define UART1_TL7816		(KINETISK_UART1.TL7816)	// UART 7816 Transmit Length Register
-#define UART1_C6		(KINETISK_UART1.C6)	// UART CEA709.1-B Control Register 6
-#define UART1_PCTH		(KINETISK_UART1.PCTH)	// UART CEA709.1-B Packet Cycle Time Counter High
-#define UART1_PCTL		(KINETISK_UART1.PCTL)	// UART CEA709.1-B Packet Cycle Time Counter Low
-#define UART1_B1T		(KINETISK_UART1.B1T)	// UART CEA709.1-B Beta1 Timer
-#define UART1_SDTH		(KINETISK_UART1.SDTH)	// UART CEA709.1-B Secondary Delay Timer High
-#define UART1_SDTL		(KINETISK_UART1.SDTL)	// UART CEA709.1-B Secondary Delay Timer Low
-#define UART1_PRE		(KINETISK_UART1.PRE)	// UART CEA709.1-B Preamble
-#define UART1_TPL		(KINETISK_UART1.TPL)	// UART CEA709.1-B Transmit Packet Length
-#define UART1_IE		(KINETISK_UART1.IE)	// UART CEA709.1-B Interrupt Enable Register
-#define UART1_WB		(KINETISK_UART1.WB)	// UART CEA709.1-B WBASE
-#define UART1_S3		(KINETISK_UART1.S3)	// UART CEA709.1-B Status Register
-#define UART1_S4		(KINETISK_UART1.S4)	// UART CEA709.1-B Status Register
-#define UART1_RPL		(KINETISK_UART1.RPL)	// UART CEA709.1-B Received Packet Length
-#define UART1_RPREL		(KINETISK_UART1.RPREL)	// UART CEA709.1-B Received Preamble Length
-#define UART1_CPW		(KINETISK_UART1.CPW)	// UART CEA709.1-B Collision Pulse Width
-#define UART1_RIDT		(KINETISK_UART1.RIDT)	// UART CEA709.1-B Receive Indeterminate Time
-#define UART1_TIDT		(KINETISK_UART1.TIDT)	// UART CEA709.1-B Transmit Indeterminate Time
-#define KINETISK_UART2		(*(KINETISK_UART_t *)0x4006C000)
-#define UART2_BDH		(KINETISK_UART2.BDH)	// UART Baud Rate Registers: High
-#define UART2_BDL		(KINETISK_UART2.BDL)	// UART Baud Rate Registers: Low
-#define UART2_C1		(KINETISK_UART2.C1)	// UART Control Register 1
-#define UART2_C2		(KINETISK_UART2.C2)	// UART Control Register 2
-#define UART2_S1		(KINETISK_UART2.S1)	// UART Status Register 1
-#define UART2_S2		(KINETISK_UART2.S2)	// UART Status Register 2
-#define UART2_C3		(KINETISK_UART2.C3)	// UART Control Register 3
-#define UART2_D			(KINETISK_UART2.D)	// UART Data Register
-#define UART2_MA1		(KINETISK_UART2.MA1)	// UART Match Address Registers 1
-#define UART2_MA2		(KINETISK_UART2.MA2)	// UART Match Address Registers 2
-#define UART2_C4		(KINETISK_UART2.C4)	// UART Control Register 4
-#define UART2_C5		(KINETISK_UART2.C5)	// UART Control Register 5
-#define UART2_ED		(KINETISK_UART2.ED)	// UART Extended Data Register
-#define UART2_MODEM		(KINETISK_UART2.MODEM)	// UART Modem Register
-#define UART2_IR		(KINETISK_UART2.IR)	// UART Infrared Register
-#define UART2_PFIFO		(KINETISK_UART2.PFIFO)	// UART FIFO Parameters
-#define UART2_CFIFO		(KINETISK_UART2.CFIFO)	// UART FIFO Control Register
-#define UART2_SFIFO		(KINETISK_UART2.SFIFO)	// UART FIFO Status Register
-#define UART2_TWFIFO		(KINETISK_UART2.TWFIFO)	// UART FIFO Transmit Watermark
-#define UART2_TCFIFO		(KINETISK_UART2.TCFIFO)	// UART FIFO Transmit Count
-#define UART2_RWFIFO		(KINETISK_UART2.RWFIFO)	// UART FIFO Receive Watermark
-#define UART2_RCFIFO		(KINETISK_UART2.RCFIFO)	// UART FIFO Receive Count
-#define UART2_C7816		(KINETISK_UART2.C7816)	// UART 7816 Control Register
-#define UART2_IE7816		(KINETISK_UART2.IE7816)	// UART 7816 Interrupt Enable Register
-#define UART2_IS7816		(KINETISK_UART2.IS7816)	// UART 7816 Interrupt Status Register
-#define UART2_WP7816T0		(KINETISK_UART2.WP7816T0)// UART 7816 Wait Parameter Register
-#define UART2_WP7816T1		(KINETISK_UART2.WP7816T1)// UART 7816 Wait Parameter Register
-#define UART2_WN7816		(KINETISK_UART2.WN7816)	// UART 7816 Wait N Register
-#define UART2_WF7816		(KINETISK_UART2.WF7816)	// UART 7816 Wait FD Register
-#define UART2_ET7816		(KINETISK_UART2.ET7816)	// UART 7816 Error Threshold Register
-#define UART2_TL7816		(KINETISK_UART2.TL7816)	// UART 7816 Transmit Length Register
-#define UART2_C6		(KINETISK_UART2.C6)	// UART CEA709.1-B Control Register 6
-#define UART2_PCTH		(KINETISK_UART2.PCTH)	// UART CEA709.1-B Packet Cycle Time Counter High
-#define UART2_PCTL		(KINETISK_UART2.PCTL)	// UART CEA709.1-B Packet Cycle Time Counter Low
-#define UART2_B1T		(KINETISK_UART2.B1T)	// UART CEA709.1-B Beta1 Timer
-#define UART2_SDTH		(KINETISK_UART2.SDTH)	// UART CEA709.1-B Secondary Delay Timer High
-#define UART2_SDTL		(KINETISK_UART2.SDTL)	// UART CEA709.1-B Secondary Delay Timer Low
-#define UART2_PRE		(KINETISK_UART2.PRE)	// UART CEA709.1-B Preamble
-#define UART2_TPL		(KINETISK_UART2.TPL)	// UART CEA709.1-B Transmit Packet Length
-#define UART2_IE		(KINETISK_UART2.IE)	// UART CEA709.1-B Interrupt Enable Register
-#define UART2_WB		(KINETISK_UART2.WB)	// UART CEA709.1-B WBASE
-#define UART2_S3		(KINETISK_UART2.S3)	// UART CEA709.1-B Status Register
-#define UART2_S4		(KINETISK_UART2.S4)	// UART CEA709.1-B Status Register
-#define UART2_RPL		(KINETISK_UART2.RPL)	// UART CEA709.1-B Received Packet Length
-#define UART2_RPREL		(KINETISK_UART2.RPREL)	// UART CEA709.1-B Received Preamble Length
-#define UART2_CPW		(KINETISK_UART2.CPW)	// UART CEA709.1-B Collision Pulse Width
-#define UART2_RIDT		(KINETISK_UART2.RIDT)	// UART CEA709.1-B Receive Indeterminate Time
-#define UART2_TIDT		(KINETISK_UART2.TIDT)	// UART CEA709.1-B Transmit Indeterminate Time
-
-#define KINETISK_UART3		(*(KINETISK_UART_t *)0x4006D000)
-#define UART3_BDH		(KINETISK_UART3.BDH)	// UART Baud Rate Registers: High
-#define UART3_BDL		(KINETISK_UART3.BDL)	// UART Baud Rate Registers: Low
-#define UART3_C1		(KINETISK_UART3.C1)	// UART Control Register 1
-#define UART3_C2		(KINETISK_UART3.C2)	// UART Control Register 2
-#define UART3_S1		(KINETISK_UART3.S1)	// UART Status Register 1
-#define UART3_S2		(KINETISK_UART3.S2)	// UART Status Register 2
-#define UART3_C3		(KINETISK_UART3.C3)	// UART Control Register 3
-#define UART3_D			(KINETISK_UART3.D)	// UART Data Register
-#define UART3_MA1		(KINETISK_UART3.MA1)	// UART Match Address Registers 1
-#define UART3_MA2		(KINETISK_UART3.MA2)	// UART Match Address Registers 2
-#define UART3_C4		(KINETISK_UART3.C4)	// UART Control Register 4
-#define UART3_C5		(KINETISK_UART3.C5)	// UART Control Register 5
-#define UART3_ED		(KINETISK_UART3.ED)	// UART Extended Data Register
-#define UART3_MODEM		(KINETISK_UART3.MODEM)	// UART Modem Register
-#define UART3_IR		(KINETISK_UART3.IR)	// UART Infrared Register
-#define UART3_PFIFO		(KINETISK_UART3.PFIFO)	// UART FIFO Parameters
-#define UART3_CFIFO		(KINETISK_UART3.CFIFO)	// UART FIFO Control Register
-#define UART3_SFIFO		(KINETISK_UART3.SFIFO)	// UART FIFO Status Register
-#define UART3_TWFIFO		(KINETISK_UART3.TWFIFO)	// UART FIFO Transmit Watermark
-#define UART3_TCFIFO		(KINETISK_UART3.TCFIFO)	// UART FIFO Transmit Count
-#define UART3_RWFIFO		(KINETISK_UART3.RWFIFO)	// UART FIFO Receive Watermark
-#define UART3_RCFIFO		(KINETISK_UART3.RCFIFO)	// UART FIFO Receive Count
-#define UART3_C7816		(KINETISK_UART3.C7816)	// UART 7816 Control Register
-#define UART3_IE7816		(KINETISK_UART3.IE7816)	// UART 7816 Interrupt Enable Register
-#define UART3_IS7816		(KINETISK_UART3.IS7816)	// UART 7816 Interrupt Status Register
-#define UART3_WP7816T0		(KINETISK_UART3.WP7816T0)// UART 7816 Wait Parameter Register
-#define UART3_WP7816T1		(KINETISK_UART3.WP7816T1)// UART 7816 Wait Parameter Register
-#define UART3_WN7816		(KINETISK_UART3.WN7816)	// UART 7816 Wait N Register
-#define UART3_WF7816		(KINETISK_UART3.WF7816)	// UART 7816 Wait FD Register
-#define UART3_ET7816		(KINETISK_UART3.ET7816)	// UART 7816 Error Threshold Register
-#define UART3_TL7816		(KINETISK_UART3.TL7816)	// UART 7816 Transmit Length Register
-
-#define KINETISK_UART4		(*(KINETISK_UART_t *)0x400EA000)
-#define UART4_BDH		(KINETISK_UART4.BDH)	// UART Baud Rate Registers: High
-#define UART4_BDL		(KINETISK_UART4.BDL)	// UART Baud Rate Registers: Low
-#define UART4_C1		(KINETISK_UART4.C1)	// UART Control Register 1
-#define UART4_C2		(KINETISK_UART4.C2)	// UART Control Register 2
-#define UART4_S1		(KINETISK_UART4.S1)	// UART Status Register 1
-#define UART4_S2		(KINETISK_UART4.S2)	// UART Status Register 2
-#define UART4_C3		(KINETISK_UART4.C3)	// UART Control Register 3
-#define UART4_D			(KINETISK_UART4.D)	// UART Data Register
-#define UART4_MA1		(KINETISK_UART4.MA1)	// UART Match Address Registers 1
-#define UART4_MA2		(KINETISK_UART4.MA2)	// UART Match Address Registers 2
-#define UART4_C4		(KINETISK_UART4.C4)	// UART Control Register 4
-#define UART4_C5		(KINETISK_UART4.C5)	// UART Control Register 5
-#define UART4_ED		(KINETISK_UART4.ED)	// UART Extended Data Register
-#define UART4_MODEM		(KINETISK_UART4.MODEM)	// UART Modem Register
-#define UART4_IR		(KINETISK_UART4.IR)	// UART Infrared Register
-#define UART4_PFIFO		(KINETISK_UART4.PFIFO)	// UART FIFO Parameters
-#define UART4_CFIFO		(KINETISK_UART4.CFIFO)	// UART FIFO Control Register
-#define UART4_SFIFO		(KINETISK_UART4.SFIFO)	// UART FIFO Status Register
-#define UART4_TWFIFO		(KINETISK_UART4.TWFIFO)	// UART FIFO Transmit Watermark
-#define UART4_TCFIFO		(KINETISK_UART4.TCFIFO)	// UART FIFO Transmit Count
-#define UART4_RWFIFO		(KINETISK_UART4.RWFIFO)	// UART FIFO Receive Watermark
-#define UART4_RCFIFO		(KINETISK_UART4.RCFIFO)	// UART FIFO Receive Count
-#define UART4_C7816		(KINETISK_UART4.C7816)	// UART 7816 Control Register
-#define UART4_IE7816		(KINETISK_UART4.IE7816)	// UART 7816 Interrupt Enable Register
-#define UART4_IS7816		(KINETISK_UART4.IS7816)	// UART 7816 Interrupt Status Register
-#define UART4_WP7816T0		(KINETISK_UART4.WP7816T0)// UART 7816 Wait Parameter Register
-#define UART4_WP7816T1		(KINETISK_UART4.WP7816T1)// UART 7816 Wait Parameter Register
-#define UART4_WN7816		(KINETISK_UART4.WN7816)	// UART 7816 Wait N Register
-#define UART4_WF7816		(KINETISK_UART4.WF7816)	// UART 7816 Wait FD Register
-#define UART4_ET7816		(KINETISK_UART4.ET7816)	// UART 7816 Error Threshold Register
-#define UART4_TL7816		(KINETISK_UART4.TL7816)	// UART 7816 Transmit Length Register
-
-#define KINETISK_UART5		(*(KINETISK_UART_t *)0x400EB000)
-#define UART5_BDH		(KINETISK_UART5.BDH)	// UART Baud Rate Registers: High
-#define UART5_BDL		(KINETISK_UART5.BDL)	// UART Baud Rate Registers: Low
-#define UART5_C1		(KINETISK_UART5.C1)	// UART Control Register 1
-#define UART5_C2		(KINETISK_UART5.C2)	// UART Control Register 2
-#define UART5_S1		(KINETISK_UART5.S1)	// UART Status Register 1
-#define UART5_S2		(KINETISK_UART5.S2)	// UART Status Register 2
-#define UART5_C3		(KINETISK_UART5.C3)	// UART Control Register 3
-#define UART5_D			(KINETISK_UART5.D)	// UART Data Register
-#define UART5_MA1		(KINETISK_UART5.MA1)	// UART Match Address Registers 1
-#define UART5_MA2		(KINETISK_UART5.MA2)	// UART Match Address Registers 2
-#define UART5_C4		(KINETISK_UART5.C4)	// UART Control Register 4
-#define UART5_C5		(KINETISK_UART5.C5)	// UART Control Register 5
-#define UART5_ED		(KINETISK_UART5.ED)	// UART Extended Data Register
-#define UART5_MODEM		(KINETISK_UART5.MODEM)	// UART Modem Register
-#define UART5_IR		(KINETISK_UART5.IR)	// UART Infrared Register
-#define UART5_PFIFO		(KINETISK_UART5.PFIFO)	// UART FIFO Parameters
-#define UART5_CFIFO		(KINETISK_UART5.CFIFO)	// UART FIFO Control Register
-#define UART5_SFIFO		(KINETISK_UART5.SFIFO)	// UART FIFO Status Register
-#define UART5_TWFIFO		(KINETISK_UART5.TWFIFO)	// UART FIFO Transmit Watermark
-#define UART5_TCFIFO		(KINETISK_UART5.TCFIFO)	// UART FIFO Transmit Count
-#define UART5_RWFIFO		(KINETISK_UART5.RWFIFO)	// UART FIFO Receive Watermark
-#define UART5_RCFIFO		(KINETISK_UART5.RCFIFO)	// UART FIFO Receive Count
-#define UART5_C7816		(KINETISK_UART5.C7816)	// UART 7816 Control Register
-#define UART5_IE7816		(KINETISK_UART5.IE7816)	// UART 7816 Interrupt Enable Register
-#define UART5_IS7816		(KINETISK_UART5.IS7816)	// UART 7816 Interrupt Status Register
-#define UART5_WP7816T0		(KINETISK_UART5.WP7816T0)// UART 7816 Wait Parameter Register
-#define UART5_WP7816T1		(KINETISK_UART5.WP7816T1)// UART 7816 Wait Parameter Register
-#define UART5_WN7816		(KINETISK_UART5.WN7816)	// UART 7816 Wait N Register
-#define UART5_WF7816		(KINETISK_UART5.WF7816)	// UART 7816 Wait FD Register
-#define UART5_ET7816		(KINETISK_UART5.ET7816)	// UART 7816 Error Threshold Register
-#define UART5_TL7816		(KINETISK_UART5.TL7816)	// UART 7816 Transmit Length Register
-
+  volatile uint8_t BDH;
+  volatile uint8_t BDL;
+  volatile uint8_t C1;
+  volatile uint8_t C2;
+  volatile uint8_t S1;
+  volatile uint8_t S2;
+  volatile uint8_t C3;
+  volatile uint8_t D;
+  volatile uint8_t MA1;
+  volatile uint8_t MA2;
+  volatile uint8_t C4;
+  volatile uint8_t C5;
+  volatile uint8_t ED;
+  volatile uint8_t MODEM;
+  volatile uint8_t IR;
+  volatile uint8_t unused1;
+  volatile uint8_t PFIFO;
+  volatile uint8_t CFIFO;
+  volatile uint8_t SFIFO;
+  volatile uint8_t TWFIFO;
+  volatile uint8_t TCFIFO;
+  volatile uint8_t RWFIFO;
+  volatile uint8_t RCFIFO;
+  volatile uint8_t unused2;
+  volatile uint8_t C7816;
+  volatile uint8_t IE7816;
+  volatile uint8_t IS7816;
+  volatile uint8_t WP7818;
+  volatile uint8_t WN7816;
+  volatile uint8_t WF7816;
+  volatile uint8_t ET7816;
+  volatile uint8_t TL7816;
+  volatile uint8_t unused3[26];
+  volatile uint8_t AP7816A_T0;
+  volatile uint8_t AP7816B_T0;
+  union {
+    volatile uint8_t WP7816A_T0;
+    volatile uint8_t WP7816A_T1;
+  };
+  union {
+    volatile uint8_t WP7816B_T0;
+    volatile uint8_t WP7816B_T1;
+  };
+  volatile uint8_t WGP7816_T1;
+  volatile uint8_t WP7816C_T1;
+} KINETISK_UART_t __attribute__((aligned(0x1000)));
+static_assert(offsetof(KINETISK_UART_t, AP7816A_T0) == 0x3a,
+              "padding is wrong");
+#if defined(HAS_KINETISK_UART0)
+#define UART0 (*(KINETISK_UART_t *)0x4006A000)
+#endif
+#if defined(HAS_KINETISK_UART1)
+#define UART1 (*(KINETISK_UART_t *)0x4006B000)
+#endif
+#if defined(HAS_KINETISK_UART2)
+#define UART2 (*(KINETISK_UART_t *)0x4006C000)
+#endif
+#if defined(HAS_KINETISK_UART3)
+#define UART3 (*(KINETISK_UART_t *)0x4006D000)
+#endif
+#if defined(HAS_KINETISK_UART4)
+#define UART4 (*(KINETISK_UART_t *)0x400EA000)
+#endif
+#if defined(HAS_KINETISK_UART5)
+#define UART5 (*(KINETISK_UART_t *)0x400EB000)
+#endif
 
 // Secured digital host controller (SDHC)
 
@@ -5214,6 +4302,7 @@
 	volatile uint32_t	MATCH;
 	volatile uint32_t	MODIR;
 } KINETISK_LPUART_t;
+#if defined(HAS_KINETISK_LPUART0)
 #define KINETISK_LPUART0	(*(KINETISK_LPUART_t *)0x400C4000)
 #define LPUART0_BAUD		(KINETISK_LPUART0.BAUD)		// LPUART Baud Register
 #define LPUART_BAUD_MAEN1		((uint32_t)0x80000000)		// Enable automatic address or data maching
@@ -5281,7 +4370,7 @@
 #define LPUART_DATA_IDLINE		((uint32_t)0x00008000)		// Match Address Mode Enable 1
 #define LPUART0_MATCH		(KINETISK_LPUART0.MATCH)	// LPUART Match register
 #define LPUART0_MODIR		(KINETISK_LPUART0.MODIR)	// LPUART Modem IrDA Register
-
+#endif
 
 // Synchronous Audio Interface (SAI)
 
@@ -5430,39 +4519,6 @@
 #define GPIOE_PDIR		(*(volatile uint32_t *)0x400FF110) // Port Data Input Register
 #define GPIOE_PDDR		(*(volatile uint32_t *)0x400FF114) // Port Data Direction Register
 
-#if defined(KINETISL)
-#define FGPIOA_PDOR		(*(volatile uint32_t *)0xF8000000) // Port Data Output Register
-#define FGPIOA_PSOR		(*(volatile uint32_t *)0xF8000004) // Port Set Output Register
-#define FGPIOA_PCOR		(*(volatile uint32_t *)0xF8000008) // Port Clear Output Register
-#define FGPIOA_PTOR		(*(volatile uint32_t *)0xF800000C) // Port Toggle Output Register
-#define FGPIOA_PDIR		(*(volatile uint32_t *)0xF8000010) // Port Data Input Register
-#define FGPIOA_PDDR		(*(volatile uint32_t *)0xF8000014) // Port Data Direction Register
-#define FGPIOB_PDOR		(*(volatile uint32_t *)0xF8000040) // Port Data Output Register
-#define FGPIOB_PSOR		(*(volatile uint32_t *)0xF8000044) // Port Set Output Register
-#define FGPIOB_PCOR		(*(volatile uint32_t *)0xF8000048) // Port Clear Output Register
-#define FGPIOB_PTOR		(*(volatile uint32_t *)0xF800004C) // Port Toggle Output Register
-#define FGPIOB_PDIR		(*(volatile uint32_t *)0xF8000050) // Port Data Input Register
-#define FGPIOB_PDDR		(*(volatile uint32_t *)0xF8000054) // Port Data Direction Register
-#define FGPIOC_PDOR		(*(volatile uint32_t *)0xF8000080) // Port Data Output Register
-#define FGPIOC_PSOR		(*(volatile uint32_t *)0xF8000084) // Port Set Output Register
-#define FGPIOC_PCOR		(*(volatile uint32_t *)0xF8000088) // Port Clear Output Register
-#define FGPIOC_PTOR		(*(volatile uint32_t *)0xF800008C) // Port Toggle Output Register
-#define FGPIOC_PDIR		(*(volatile uint32_t *)0xF8000090) // Port Data Input Register
-#define FGPIOC_PDDR		(*(volatile uint32_t *)0xF8000094) // Port Data Direction Register
-#define FGPIOD_PDOR		(*(volatile uint32_t *)0xF80000C0) // Port Data Output Register
-#define FGPIOD_PSOR		(*(volatile uint32_t *)0xF80000C4) // Port Set Output Register
-#define FGPIOD_PCOR		(*(volatile uint32_t *)0xF80000C8) // Port Clear Output Register
-#define FGPIOD_PTOR		(*(volatile uint32_t *)0xF80000CC) // Port Toggle Output Register
-#define FGPIOD_PDIR		(*(volatile uint32_t *)0xF80000D0) // Port Data Input Register
-#define FGPIOD_PDDR		(*(volatile uint32_t *)0xF80000D4) // Port Data Direction Register
-#define FGPIOE_PDOR		(*(volatile uint32_t *)0xF8000100) // Port Data Output Register
-#define FGPIOE_PSOR		(*(volatile uint32_t *)0xF8000104) // Port Set Output Register
-#define FGPIOE_PCOR		(*(volatile uint32_t *)0xF8000108) // Port Clear Output Register
-#define FGPIOE_PTOR		(*(volatile uint32_t *)0xF800010C) // Port Toggle Output Register
-#define FGPIOE_PDIR		(*(volatile uint32_t *)0xF8000110) // Port Data Input Register
-#define FGPIOE_PDDR		(*(volatile uint32_t *)0xF8000114) // Port Data Direction Register
-#endif
-
 // Touch sense input (TSI)
 
 #if defined(HAS_KINETIS_TSI)
@@ -5539,7 +4595,7 @@
 #ifdef KINETISK
 #define NVIC_TRIGGER_IRQ(n)	NVIC_STIR=(n)
 #else
-#define NVIC_TRIGGER_IRQ(n)	NVIC_SET_PENDING(n)
+#error
 #endif
 
 #define NVIC_ISER0		(*(volatile uint32_t *)0xE000E100)
@@ -5553,13 +4609,11 @@
 
 // 0 = highest priority
 // Cortex-M4: 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240
-// Cortex-M0: 0,64,128,192
 #ifdef KINETISK
 #define NVIC_SET_PRIORITY(irqnum, priority)  (*((volatile uint8_t *)0xE000E400 + (irqnum)) = (uint8_t)(priority))
 #define NVIC_GET_PRIORITY(irqnum) (*((volatile uint8_t *)0xE000E400 + (irqnum)))
 #else
-#define NVIC_SET_PRIORITY(irqnum, priority) (*((uint32_t *)0xE000E400 + ((irqnum) >> 2)) = (*((uint32_t *)0xE000E400 + ((irqnum) >> 2)) & (~(0xFF << (8 * ((irqnum) & 3))))) | (((priority) & 0xFF) << (8 * ((irqnum) & 3))))
-#define NVIC_GET_PRIORITY(irqnum) (*((uint32_t *)0xE000E400 + ((irqnum) >> 2)) >> (8 * ((irqnum) & 3)) & 255)
+#error
 #endif
 
 
diff --git a/motors/core/mk20dx128.c b/motors/core/mk20dx128.c
index d1a641d..495ace6 100644
--- a/motors/core/mk20dx128.c
+++ b/motors/core/mk20dx128.c
@@ -33,23 +33,14 @@
 #include <errno.h>
 #include <stdio.h>
 
-// Flash Security Setting. On Teensy 3.2, you can lock the MK20 chip to prevent
-// anyone from reading your code.  You CAN still reprogram your Teensy while
-// security is set, but the bootloader will be unable to respond to auto-reboot
-// requests from Arduino. Pressing the program button will cause a full chip
-// erase to gain access, because the bootloader chip is locked out.  Normally,
-// erase occurs when uploading begins, so if you press the Program button
-// accidentally, simply power cycling will run your program again.  When
-// security is locked, any Program button press causes immediate full erase.
-// Special care must be used with the Program button, because it must be made
-// accessible to initiate reprogramming, but it must not be accidentally
-// pressed when Teensy Loader is not being used to reprogram.  To set lock the
-// security change this to 0xDC.  Teensy 3.0 and 3.1 do not support security
-// lock.
-#define FSEC 0xDE
+#define FSEC                                   \
+  ((2 << 6) /* Enable backdoor key access */ | \
+   (1 << 4) /* Enable mass erase */ |          \
+   (3 << 2) /* Freescale access granted */ | (2 << 0) /* Not secured */)
 
-// Flash Options
-#define FOPT 0xF9
+#define FOPT                                                            \
+  ((0 << 2) /* NMI always blocked */ | (0 << 1) /* EzPort disabled */ | \
+   (1 << 0) /* Normal (not low-power) boot */)
 
 extern uint32_t __bss_ram_start__[];
 extern uint32_t __bss_ram_end__[];
@@ -397,13 +388,111 @@
     enet_tx_isr,       // 99 Ethernet Transmit
     enet_rx_isr,       // 100 Ethernet Receive
     enet_error_isr,    // 101 Ethernet Error
+#elif defined(__MK22FX512__)
+    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
+    dma_ch3_isr,       // 19 DMA channel 3 transfer complete
+    dma_ch4_isr,       // 20 DMA channel 4 transfer complete
+    dma_ch5_isr,       // 21 DMA channel 5 transfer complete
+    dma_ch6_isr,       // 22 DMA channel 6 transfer complete
+    dma_ch7_isr,       // 23 DMA channel 7 transfer complete
+    dma_ch8_isr,       // 24 DMA channel 8 transfer complete
+    dma_ch9_isr,       // 25 DMA channel 9 transfer complete
+    dma_ch10_isr,      // 26 DMA channel 10 transfer complete
+    dma_ch11_isr,      // 27 DMA channel 11 transfer complete
+    dma_ch12_isr,      // 28 DMA channel 12 transfer complete
+    dma_ch13_isr,      // 29 DMA channel 13 transfer complete
+    dma_ch14_isr,      // 30 DMA channel 14 transfer complete
+    dma_ch15_isr,      // 31 DMA channel 15 transfer complete
+    dma_error_isr,     // 32 DMA error interrupt channel
+    mcm_isr,           // 33 MCM
+    flash_cmd_isr,     // 34 Flash Memory Command complete
+    flash_error_isr,   // 35 Flash Read collision
+    low_voltage_isr,   // 36 Low-voltage detect/warning
+    wakeup_isr,        // 37 Low Leakage Wakeup
+    watchdog_isr,      // 38 Both EWM and WDOG interrupt
+    unused_isr,        // 39 --
+    i2c0_isr,          // 40 I2C0
+    i2c1_isr,          // 41 I2C1
+    spi0_isr,          // 42 SPI0
+    spi1_isr,          // 43 SPI1
+    i2s0_tx_isr,       // 44 I2S0 Transmit
+    i2s0_rx_isr,       // 45 I2S0 Receive
+    unused_isr,        // 46 --
+    uart0_status_isr,  // 47 UART0 status
+    uart0_error_isr,   // 48 UART0 error
+    uart1_status_isr,  // 49 UART1 status
+    uart1_error_isr,   // 50 UART1 error
+    uart2_status_isr,  // 51 UART2 status
+    uart2_error_isr,   // 52 UART2 error
+    uart3_status_isr,  // 53 UART3 status
+    uart3_error_isr,   // 54 UART3 error
+    adc0_isr,          // 55 ADC0
+    cmp0_isr,          // 56 CMP0
+    cmp1_isr,          // 57 CMP1
+    ftm0_isr,          // 58 FTM0
+    ftm1_isr,          // 59 FTM1
+    ftm2_isr,          // 60 FTM2
+    cmt_isr,           // 61 CMT
+    rtc_alarm_isr,     // 62 RTC Alarm interrupt
+    rtc_seconds_isr,   // 63 RTC Seconds interrupt
+    pit0_isr,          // 64 PIT Channel 0
+    pit1_isr,          // 65 PIT Channel 1
+    pit2_isr,          // 66 PIT Channel 2
+    pit3_isr,          // 67 PIT Channel 3
+    pdb_isr,           // 68 PDB Programmable Delay Block
+    usb_isr,           // 69 USB OTG
+    usb_charge_isr,    // 70 USB Charger Detect
+    unused_isr,        // 71 --
+    dac0_isr,          // 72 DAC0
+    mcg_isr,           // 73 MCG
+    lptmr_isr,         // 74 Low Power Timer
+    porta_isr,         // 75 Pin detect (Port A)
+    portb_isr,         // 76 Pin detect (Port B)
+    portc_isr,         // 77 Pin detect (Port C)
+    portd_isr,         // 78 Pin detect (Port D)
+    porte_isr,         // 79 Pin detect (Port E)
+    software_isr,      // 80 Software interrupt
+    unused_isr,        // 81 --
+    unused_isr,        // 82 --
+    unused_isr,        // 83 --
+    unused_isr,        // 84 --
+    unused_isr,        // 85 --
+    cmp2_isr,          // 86 CMP2
+    ftm3_isr,          // 87 FTM3
+    unused_isr,        // 88 --
+    adc1_isr,          // 89 ADC1
+    i2c2_isr,          // 90 I2C2
+    can0_message_isr,  // 91 CAN OR'ed Message buffer (0-15)
+    can0_bus_off_isr,  // 92 CAN Bus Off
+    can0_error_isr,    // 93 CAN Error
+    can0_tx_warn_isr,  // 94 CAN Transmit Warning
+    can0_rx_warn_isr,  // 95 CAN Receive Warning
+    can0_wakeup_isr,   // 96 CAN Wake Up
+    sdhc_isr,          // 97 SDHC
+#else
+#error
 #endif
 };
 
-__attribute__((section(".flashconfig"),
-               used)) const uint8_t flashconfigbytes[16] = {
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, FSEC, FOPT, 0xFF, 0xFF};
+__attribute__((section(".flashconfig"), used))
+const uint8_t flashconfigbytes[16] = {0xFF,
+                                      0xFF,
+                                      0xFF,
+                                      0xFF,
+                                      0xFF,
+                                      0xFF,
+                                      0xFF,
+                                      0xFF, /* Backdoor access key */
+                                      0xFF,
+                                      0xFF,
+                                      0xFF,
+                                      0xFF /* Program flash protection */,
+                                      FSEC,
+                                      FOPT,
+                                      0xFF /* FEPROT */,
+                                      0xFF /* PDPROT */};
 
 #ifdef __clang__
 // Clang seems to generate slightly larger code with Os than gcc
@@ -412,12 +501,10 @@
 __attribute__((section(".startup"), optimize("-Os")))
 #endif
 void ResetHandler(void) {
-  unsigned int i;
-
   WDOG_UNLOCK = WDOG_UNLOCK_SEQ1;
   WDOG_UNLOCK = WDOG_UNLOCK_SEQ2;
-  __asm__ volatile("nop");
-  __asm__ volatile("nop");
+  __asm__ __volatile__("nop" ::: "memory");
+  __asm__ __volatile__("nop" ::: "memory");
 
   WDOG_STCTRLH = WDOG_STCTRLH_ALLOWUPDATE;
 
@@ -426,13 +513,15 @@
   SIM_SCGC3 = SIM_SCGC3_ADC1 | SIM_SCGC3_FTM2;
   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(__MK64FX512__) || defined(__MK66FX1M0__)
+              SIM_SCGC6_FTF;
+#elif defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__MK22FX512__)
   SIM_SCGC3 = SIM_SCGC3_ADC1 | SIM_SCGC3_FTM2 | SIM_SCGC3_FTM3;
   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_FTF;
   SCB_CPACR = 0x00F00000;
+#else
+#error
 #endif
   // if the RTC oscillator isn't enabled, get it started early
   if (!(RTC_CR & RTC_CR_OSCE)) {
@@ -440,7 +529,9 @@
     RTC_CR = RTC_CR_SC16P | RTC_CR_SC4P | RTC_CR_OSCE;
   }
   // release I/O pins hold, if we woke up from VLLS mode
-  if (PMC_REGSC & PMC_REGSC_ACKISO) PMC_REGSC |= PMC_REGSC_ACKISO;
+  if (PMC_REGSC & PMC_REGSC_ACKISO) {
+    PMC_REGSC |= PMC_REGSC_ACKISO;
+  }
 
   // since this is a write once register, make it visible to all F_CPU's
   // so we can into other sleep modes in the future at any speed
@@ -461,9 +552,12 @@
   }
 
   // default all interrupts to medium priority level
-  for (i = 0; i < NVIC_NUM_INTERRUPTS + 16; i++)
+  for (int i = 0; i < NVIC_NUM_INTERRUPTS + 16; i++) {
     _VectorsRam[i] = _VectorsFlash[i];
-  for (i = 0; i < NVIC_NUM_INTERRUPTS; i++) NVIC_SET_PRIORITY(i, 128);
+  }
+  for (int i = 0; i < NVIC_NUM_INTERRUPTS; i++) {
+    NVIC_SET_PRIORITY(i, 128);
+  }
   SCB_VTOR = (uint32_t)_VectorsRam;  // use vector table in RAM
 
   // hardware always starts in FEI mode
@@ -518,14 +612,16 @@
   // now we're in PBE mode
   // now program the clock dividers
 #if F_CPU == 120000000
-  // config divisors: 120 MHz core, 60 MHz bus, 24 MHz flash, USB = 128 * 2 / 5
-  SIM_CLKDIV1 =
-      SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(1) | SIM_CLKDIV1_OUTDIV4(4);
+  // config divisors: 120 MHz core, 60 MHz bus, 40 MHz FlexBus, 24 MHz flash,
+  // USB = 120 * 2 / 5 = 48 MHz
+  SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(1) |
+                SIM_CLKDIV1_OUTDIV3(2) | SIM_CLKDIV1_OUTDIV4(4);
   SIM_CLKDIV2 = SIM_CLKDIV2_USBDIV(4) | SIM_CLKDIV2_USBFRAC;
 #elif F_CPU == 72000000
-  // config divisors: 72 MHz core, 36 MHz bus, 24 MHz flash, USB = 72 * 2 / 3
-  SIM_CLKDIV1 =
-      SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(1) | SIM_CLKDIV1_OUTDIV4(2);
+  // config divisors: 72 MHz core, 36 MHz bus, 36 MHz FlexBus, 24 MHz flash,
+  // USB = 72 * 2 / 3 = 48 MHz
+  SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(1) |
+                SIM_CLKDIV1_OUTDIV3(1) | SIM_CLKDIV1_OUTDIV4(2);
   SIM_CLKDIV2 = SIM_CLKDIV2_USBDIV(2) | SIM_CLKDIV2_USBFRAC;
 #else
 #error "Unsupported F_CPU"
@@ -565,8 +661,10 @@
 #define STACK_MARGIN 1024
 #elif defined(__MK20DX256__)
 #define STACK_MARGIN 4096
-#elif defined(__MK64FX512__) || defined(__MK66FX1M0__)
+#elif defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__MK22FX512__)
 #define STACK_MARGIN 8192
+#else
+#error
 #endif
 #endif
 
diff --git a/motors/fet12/fet12.cc b/motors/fet12/fet12.cc
index 6b48436..6fedeab 100644
--- a/motors/fet12/fet12.cc
+++ b/motors/fet12/fet12.cc
@@ -237,7 +237,7 @@
   PORTA_PCR12 = PORT_PCR_DSE | PORT_PCR_MUX(2);
   PORTA_PCR13 = PORT_PCR_DSE | PORT_PCR_MUX(2);
 
-  DMA_CR = DMA_CR_EMLM;
+  DMA.CR = M_DMA_EMLM;
 
   teensy::UsbDevice usb_device(0, 0x16c0, 0x0490);
   usb_device.SetManufacturer("FRC 971 Spartan Robotics");
diff --git a/motors/fet12/power_wheels.cc b/motors/fet12/power_wheels.cc
index 4920c9b..edfaf4e 100644
--- a/motors/fet12/power_wheels.cc
+++ b/motors/fet12/power_wheels.cc
@@ -113,7 +113,7 @@
   PORTA_PCR15 = PORT_PCR_DSE | PORT_PCR_MUX(1);
 #endif
 
-  DMA_CR = DMA_CR_EMLM;
+  DMA.CR = M_DMA_EMLM;
 
   teensy::UsbDevice usb_device(0, 0x16c0, 0x0490);
   usb_device.SetManufacturer("FRC 971 Spartan Robotics");
diff --git a/motors/peripheral/adc.cc b/motors/peripheral/adc.cc
index 756e166..6325f9f 100644
--- a/motors/peripheral/adc.cc
+++ b/motors/peripheral/adc.cc
@@ -22,12 +22,14 @@
     ADC##n##_##PM##G = variable;      \
   } while (0);
 
-#define ADC_INIT_SINGLE(n)                                                   \
+#define ADC_INIT_SINGLE(n, maybe_muxsel)                                     \
   do {                                                                       \
-    ADC##n##_CFG1 = ADC_CFG1_ADIV(2) /* Divide clock by 4 to get 15MHz. */ | \
-                    ADC_CFG1_MODE(1) /* 12 bit mode. */ |                    \
-                    ADC_CFG1_ADICLK(0) /* Use the bus clock (60MHz). */;     \
-    ADC##n##_CFG2 = ADC_CFG2_MUXSEL /* Use the b channels. */ |              \
+    ADC##n##_CFG1 =                                                          \
+        ADC_CFG1_ADIV(2) /* Divide clock by 4 to get 15MHz. */ |             \
+        0 /* !ADLSMP to sample faster */ |                                   \
+        ADC_CFG1_MODE(1) /* 12 bit single-ended or 13-bit differential. */ | \
+        ADC_CFG1_ADICLK(0) /* Use the bus clock (60MHz). */;                 \
+    ADC##n##_CFG2 = (maybe_muxsel) |                                         \
                     ADC_CFG2_ADHSC /* Support higher ADC clock speeds. */;   \
     ADC##n##_SC1A = 0; /* Clear SC1A's COCO flag. */                         \
     ADC##n##_SC2 = ADC_SC2_BASE;                                             \
@@ -46,12 +48,12 @@
 
 }  // namespace
 
-void AdcInitCommon() {
+void AdcInitCommon(AdcChannels adc0_channels, AdcChannels adc1_channels) {
   SIM_SCGC3 |= SIM_SCGC3_ADC1;
   SIM_SCGC6 |= SIM_SCGC6_ADC0;
   // TODO(Brian): Mess with SIM_SOPT7 to reconfigure ADC trigger input source?
-  ADC_INIT_SINGLE(0);
-  ADC_INIT_SINGLE(1);
+  ADC_INIT_SINGLE(0, (adc0_channels == AdcChannels::kB) ? ADC_CFG2_MUXSEL : 0);
+  ADC_INIT_SINGLE(1, (adc1_channels == AdcChannels::kB) ? ADC_CFG2_MUXSEL : 0);
 }
 
 }  // namespace motors
diff --git a/motors/peripheral/adc.h b/motors/peripheral/adc.h
index 9ca5506..c22a856 100644
--- a/motors/peripheral/adc.h
+++ b/motors/peripheral/adc.h
@@ -8,7 +8,12 @@
 namespace frc971 {
 namespace motors {
 
-void AdcInitCommon();
+enum class AdcChannels {
+  kA,
+  kB,
+};
+void AdcInitCommon(AdcChannels adc0_channels = AdcChannels::kB,
+                   AdcChannels adc1_channels = AdcChannels::kB);
 
 }  // namespace motors
 }  // namespace frc971
diff --git a/motors/pistol_grip/controller.cc b/motors/pistol_grip/controller.cc
index 9d8a1c8..8b842b7 100644
--- a/motors/pistol_grip/controller.cc
+++ b/motors/pistol_grip/controller.cc
@@ -719,7 +719,7 @@
 
   PORTA_PCR5 = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_MUX(1);
 
-  DMA_CR = DMA_CR_EMLM;
+  DMA.CR = M_DMA_EMLM;
 
   teensy::UsbDevice usb_device(0, 0x16c0, 0x0490);
   usb_device.SetManufacturer("FRC 971 Spartan Robotics");
diff --git a/motors/usb/usb.h b/motors/usb/usb.h
index 299df59..3b67a44 100644
--- a/motors/usb/usb.h
+++ b/motors/usb/usb.h
@@ -10,6 +10,7 @@
 #include "aos/common/macros.h"
 #include "motors/core/kinetis.h"
 #include "motors/usb/constants.h"
+#include "motors/util.h"
 
 namespace frc971 {
 namespace teensy {
@@ -17,9 +18,7 @@
 // A sufficient memory barrier between writing some data and telling the USB
 // hardware to read it or having the USB hardware say some data is readable and
 // actually reading it.
-static inline void dma_memory_barrier() {
-  __asm__ __volatile__("" :: : "memory");
-}
+static inline void dma_memory_barrier() { DmaMemoryBarrier(); }
 
 // Aligned for faster access via memcpy etc.
 //
diff --git a/motors/util.h b/motors/util.h
index 458cf20..110caed 100644
--- a/motors/util.h
+++ b/motors/util.h
@@ -23,6 +23,26 @@
   NVIC_SET_PRIORITY(irqnum, ((priority)&0xF) << 4)
 #define NVIC_GET_SANE_PRIORITY(irqnum) (NVIC_GET_PRIORITY(irqnum) >> 4)
 
+// A sufficient memory barrier between writing some data and telling the
+// hardware to read it or having the hardware say some data has been written and
+// actually reading it.
+static inline void DmaMemoryBarrier() {
+  // Cortex-M3 and Cortex-M4 don't reorder loads or stores, so no DMB is
+  // necessary here.
+  __asm__ __volatile__("" ::: "memory");
+}
+
+static inline void InterruptMemoryBarrier() {
+  // Cortex-M3 and Cortex-M4 don't reorder loads or stores, and evaluate
+  // interrupts between every instruction, so no DSB or ISB is necessary here.
+  // Note: up to two instructions may be executed after enabling/disabling an
+  // interrupt in the NVIC before taking the new value into account, so that
+  // would still require a DSB+ISB if we cared.
+  // Note: enabling interrupts might not recognize interrupts immediately
+  // without an ISB.
+  __asm__ __volatile__("" ::: "memory", "cc");
+}
+
 // Definitions for the bits in some registers that are missing.
 #define CAN_MCR_MDIS ((uint32_t)(1 << 31))
 #define CAN_MCR_FRZ ((uint32_t)(1 << 30))
@@ -125,21 +145,6 @@
 // Index-parameterized access to various registers from various peripherals.
 // This only includes ones somebody thought might be useful; add more if you
 // want them.
-#define DMA_TCDn_SADDR(n) DO_CONCATENATE(DMA_TCD, n, _SADDR)
-#define DMA_TCDn_SOFF(n) DO_CONCATENATE(DMA_TCD, n, _SOFF)
-#define DMA_TCDn_ATTR(n) DO_CONCATENATE(DMA_TCD, n, _ATTR)
-#define DMA_TCDn_NBYTES_MLNO(n) DO_CONCATENATE(DMA_TCD, n, _NBYTES_MLNO)
-#define DMA_TCDn_NBYTES_MLOFFNO(n) DO_CONCATENATE(DMA_TCD, n, _NBYTES_MLOFFNO)
-#define DMA_TCDn_NBYTES_MLOFFYES(n) DO_CONCATENATE(DMA_TCD, n, _NBYTES_MLOFFYES)
-#define DMA_TCDn_SLAST(n) DO_CONCATENATE(DMA_TCD, n, _SLAST)
-#define DMA_TCDn_DADDR(n) DO_CONCATENATE(DMA_TCD, n, _DADDR)
-#define DMA_TCDn_DOFF(n) DO_CONCATENATE(DMA_TCD, n, _DOFF)
-#define DMA_TCDn_CITER_ELINKYES(n) DO_CONCATENATE(DMA_TCD, n, _CITER_ELINKYES)
-#define DMA_TCDn_CITER_ELINKNO(n) DO_CONCATENATE(DMA_TCD, n, _CITER_ELINKNO)
-#define DMA_TCDn_DLASTSGA(n) DO_CONCATENATE(DMA_TCD, n, _DLASTSGA)
-#define DMA_TCDn_CSR(n) DO_CONCATENATE(DMA_TCD, n, _CSR)
-#define DMA_TCDn_BITER_ELINKYES(n) DO_CONCATENATE(DMA_TCD, n, _BITER_ELINKYES)
-#define DMA_TCDn_BITER_ELINKNO(n) DO_CONCATENATE(DMA_TCD, n, _BITER_ELINKNO)
 #define SPIn_MCR(n) DO_CONCATENATE(SPI, n, _MCR)
 #define SPIn_TCR(n) DO_CONCATENATE(SPI, n, _TCR)
 #define SPIn_CTAR0(n) DO_CONCATENATE(SPI, n, _CTAR0)
@@ -147,42 +152,12 @@
 #define SPIn_RSER(n) DO_CONCATENATE(SPI, n, _RSER)
 #define SPIn_PUSHR(n) DO_CONCATENATE(SPI, n, _PUSHR)
 #define SPIn_POPR(n) DO_CONCATENATE(SPI, n, _POPR)
-#define DMAMUX0_CHCFGn(n) DO_CONCATENATE(DMAMUX0, _CHCFG, n)
-#define DMAMUX_SOURCE_SPIn_RX(n) DO_CONCATENATE(DMAMUX_SOURCE_SPI, n, _RX)
-#define DMAMUX_SOURCE_SPIn_TX(n) DO_CONCATENATE(DMAMUX_SOURCE_SPI, n, _TX)
 #define dma_chN_isr(n) DO_CONCATENATE(dma_ch, n, _isr)
 #define IRQ_DMA_CHn(n) DO_CONCATENATE(IRQ_DMA, _CH, n)
 
 #define USB0_ENDPTn(n) (*(volatile uint8_t *)(0x400720C0 + ((n)*4)))
 
-#ifdef __cplusplus
-// RAII class to disable interrupts temporarily.
-class DisableInterrupts {
- public:
-  DisableInterrupts() { __disable_irq(); }
-  ~DisableInterrupts() { __enable_irq(); }
-
-  DisableInterrupts(const DisableInterrupts &) = delete;
-  DisableInterrupts &operator=(const DisableInterrupts &) = delete;
-};
-#endif  // __cplusplus
-
-typedef struct {
-	uint32_t saddr;
-	uint16_t soff;
-	uint16_t attr;
-	uint32_t nbytes_mlno;
-	uint32_t slast;
-	uint32_t daddr;
-	uint16_t doff;
-	uint16_t citer;
-	uint32_t dlastsga;
-	uint32_t _reserved;
-} DmaTcd __attribute__((aligned(0x20)));
-#ifdef __cplusplus
-static_assert(sizeof(DmaTcd) == 0x20, "DMA TCD is the wrong size");
-#endif
-
+// TODO(Brian): Just write the structs out, and do all this in kinetis.h.
 #define ALL_FTM_REGISTERS         \
   FOR_BOTH_FTM_REGISTER(SC)       \
   FOR_BOTH_FTM_REGISTER(CNT)      \
@@ -247,38 +222,40 @@
 #define FTM2 ((LittleFTM *)0x400B8000)
 #define FTM3 ((BigFTM *)0x400B9000)
 
-#ifdef __cplusplus
-#define FOR_BIG_FTM_REGISTER(name)                                           \
-  static_assert(offsetof(BigFTM, name) ==                                    \
-                    (reinterpret_cast<const volatile char *>(&FTM0_##name) - \
-                     reinterpret_cast<volatile char *>(FTM0)),               \
-                #name " is at the wrong place");                             \
-  static_assert(offsetof(BigFTM, name) ==                                    \
-                    (reinterpret_cast<const volatile char *>(&FTM3_##name) - \
-                     reinterpret_cast<volatile char *>(FTM3)),               \
-                #name " is at the wrong place");
-#define FOR_LITTLE_FTM_REGISTER(name)                                        \
-  static_assert(offsetof(LittleFTM, name) ==                                 \
-                    (reinterpret_cast<const volatile char *>(&FTM1_##name) - \
-                     reinterpret_cast<volatile char *>(FTM1)),               \
-                #name " is at the wrong place");                             \
-  static_assert(offsetof(LittleFTM, name) ==                                 \
-                    (reinterpret_cast<const volatile char *>(&FTM2_##name) - \
-                     reinterpret_cast<volatile char *>(FTM2)),               \
-                #name " is at the wrong place");
-#define FOR_BOTH_FTM_REGISTER(name) \
-  FOR_BIG_FTM_REGISTER(name)        \
-  FOR_LITTLE_FTM_REGISTER(name)
-ALL_FTM_REGISTERS
-#undef FOR_BIG_FTM_REGISTER
-#undef FOR_LITTLE_FTM_REGISTER
-#undef FOR_BOTH_FTM_REGISTER
-#endif
-
 #undef ALL_FTM_REGISTERS
 
 #ifdef __cplusplus
 }
 #endif
 
+#ifdef __cplusplus
+
+// RAII class to disable interrupts temporarily.
+class DisableInterrupts {
+ public:
+  DisableInterrupts() { __disable_irq(); }
+  ~DisableInterrupts() { __enable_irq(); }
+
+  DisableInterrupts(const DisableInterrupts &) = delete;
+  DisableInterrupts &operator=(const DisableInterrupts &) = delete;
+};
+
+// constexpr log base 2, which fails to compile for non-power-of-2 inputs.
+// This is a silly implementation to use at runtime.
+template<typename T>
+constexpr T ConstexprLog2(T i) {
+  if (i == 0) {
+    __builtin_abort();
+  }
+  if (i == 1) {
+    return 0;
+  }
+  if (i / 2 * 2 == i) {
+    return 1 + ConstexprLog2(i / 2);
+  }
+  __builtin_abort();
+}
+
+#endif  // __cplusplus
+
 #endif  // MOTORS_UTIL_H_