aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/ports
diff options
context:
space:
mode:
authorFabio Utzig <utzig@utzig.org>2016-04-05 23:42:39 +0000
committerFabio Utzig <utzig@utzig.org>2016-04-05 23:42:39 +0000
commitcbb80bb74db16889616917229cc6b4a5c37bcb19 (patch)
tree26186014c3278650c3e75a255cd0883c257488c1 /os/hal/ports
parentb3a8daf443ee8ed2401ec1b5490ce2fda1203446 (diff)
downloadChibiOS-cbb80bb74db16889616917229cc6b4a5c37bcb19.tar.gz
ChibiOS-cbb80bb74db16889616917229cc6b4a5c37bcb19.tar.bz2
ChibiOS-cbb80bb74db16889616917229cc6b4a5c37bcb19.zip
[KINETIS] Final removal (moved to contrib)
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9251 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/hal/ports')
-rw-r--r--os/hal/ports/KINETIS/K20x/gpt_lld.c372
-rw-r--r--os/hal/ports/KINETIS/K20x/gpt_lld.h292
-rw-r--r--os/hal/ports/KINETIS/K20x/hal_lld.c204
-rw-r--r--os/hal/ports/KINETIS/K20x/hal_lld.h269
-rw-r--r--os/hal/ports/KINETIS/K20x/kinetis_registry.h58
-rw-r--r--os/hal/ports/KINETIS/K20x/pal_lld.c241
-rw-r--r--os/hal/ports/KINETIS/K20x/pal_lld.h375
-rw-r--r--os/hal/ports/KINETIS/K20x/platform.dox365
-rw-r--r--os/hal/ports/KINETIS/K20x/platform.mk16
-rw-r--r--os/hal/ports/KINETIS/K20x/serial_lld.c327
-rw-r--r--os/hal/ports/KINETIS/K20x/serial_lld.h163
-rw-r--r--os/hal/ports/KINETIS/K20x/spi_lld.c418
-rw-r--r--os/hal/ports/KINETIS/K20x/spi_lld.h230
-rw-r--r--os/hal/ports/KINETIS/K20x/st_lld.c98
-rw-r--r--os/hal/ports/KINETIS/K20x/st_lld.h156
-rw-r--r--os/hal/ports/KINETIS/KL2x/hal_lld.c307
-rw-r--r--os/hal/ports/KINETIS/KL2x/hal_lld.h269
-rw-r--r--os/hal/ports/KINETIS/KL2x/kinetis_registry.h52
-rw-r--r--os/hal/ports/KINETIS/KL2x/kinetis_tpm.h120
-rw-r--r--os/hal/ports/KINETIS/KL2x/pal_lld.c225
-rw-r--r--os/hal/ports/KINETIS/KL2x/pal_lld.h331
-rw-r--r--os/hal/ports/KINETIS/KL2x/platform.mk15
-rw-r--r--os/hal/ports/KINETIS/KL2x/pwm_lld.c400
-rw-r--r--os/hal/ports/KINETIS/KL2x/pwm_lld.h243
-rw-r--r--os/hal/ports/KINETIS/KL2x/serial_lld.c353
-rw-r--r--os/hal/ports/KINETIS/KL2x/serial_lld.h163
-rw-r--r--os/hal/ports/KINETIS/KL2x/st_lld.c98
-rw-r--r--os/hal/ports/KINETIS/KL2x/st_lld.h156
-rw-r--r--os/hal/ports/KINETIS/LLD/adc_lld.c258
-rw-r--r--os/hal/ports/KINETIS/LLD/adc_lld.h360
-rw-r--r--os/hal/ports/KINETIS/LLD/ext_lld.c361
-rw-r--r--os/hal/ports/KINETIS/LLD/ext_lld.h188
-rw-r--r--os/hal/ports/KINETIS/LLD/i2c_lld.c415
-rw-r--r--os/hal/ports/KINETIS/LLD/i2c_lld.h208
34 files changed, 0 insertions, 8106 deletions
diff --git a/os/hal/ports/KINETIS/K20x/gpt_lld.c b/os/hal/ports/KINETIS/K20x/gpt_lld.c
deleted file mode 100644
index 09d759bb7..000000000
--- a/os/hal/ports/KINETIS/K20x/gpt_lld.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Derek Mulcahy
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/gpt_lld.c
- * @brief KINETIS GPT subsystem low level driver source.
- *
- * @addtogroup GPT
- * @{
- */
-
-#include "hal.h"
-
-#if HAL_USE_GPT || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-#define KINETIS_PIT0_HANDLER VectorB8
-#define KINETIS_PIT1_HANDLER VectorBC
-#define KINETIS_PIT2_HANDLER VectorC0
-#define KINETIS_PIT3_HANDLER VectorC4
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/**
- * @brief GPTD1 driver identifier.
- * @note The driver GPTD1 allocates the complex timer PIT0 when enabled.
- */
-#if KINETIS_GPT_USE_PIT0 || defined(__DOXYGEN__)
-GPTDriver GPTD1;
-#endif
-
-/**
- * @brief GPTD2 driver identifier.
- * @note The driver GPTD2 allocates the timer PIT1 when enabled.
- */
-#if KINETIS_GPT_USE_PIT1 || defined(__DOXYGEN__)
-GPTDriver GPTD2;
-#endif
-
-/**
- * @brief GPTD3 driver identifier.
- * @note The driver GPTD3 allocates the timer PIT2 when enabled.
- */
-#if KINETIS_GPT_USE_PIT2 || defined(__DOXYGEN__)
-GPTDriver GPTD3;
-#endif
-
-/**
- * @brief GPTD4 driver identifier.
- * @note The driver GPTD4 allocates the timer PIT3 when enabled.
- */
-#if KINETIS_GPT_USE_PIT3 || defined(__DOXYGEN__)
-GPTDriver GPTD4;
-#endif
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/**
- * @brief Shared IRQ handler.
- *
- * @param[in] gptp pointer to a @p GPTDriver object
- */
-static void gpt_lld_serve_interrupt(GPTDriver *gptp) {
-
- /* Clear the interrupt */
- gptp->channel->TFLG |= PIT_TCTRL_TIE;
-
- if (gptp->state == GPT_ONESHOT) {
- gptp->state = GPT_READY; /* Back in GPT_READY state. */
- gpt_lld_stop_timer(gptp); /* Timer automatically stopped. */
- }
- gptp->config->callback(gptp);
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-#if KINETIS_GPT_USE_PIT0
-#if !defined(KINETIS_PIT0_HANDLER)
-#error "KINETIS_PIT0_HANDLER not defined"
-#endif
-/**
- * @brief PIT1 interrupt handler.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(KINETIS_PIT0_HANDLER) {
-
- OSAL_IRQ_PROLOGUE();
-
- gpt_lld_serve_interrupt(&GPTD1);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_GPT_USE_PIT0 */
-
-#if KINETIS_GPT_USE_PIT1
-#if !defined(KINETIS_PIT1_HANDLER)
-#error "KINETIS_PIT1_HANDLER not defined"
-#endif
-/**
- * @brief PIT1 interrupt handler.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(KINETIS_PIT1_HANDLER) {
-
- OSAL_IRQ_PROLOGUE();
-
- gpt_lld_serve_interrupt(&GPTD2);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_GPT_USE_PIT1 */
-
-#if KINETIS_GPT_USE_PIT2
-#if !defined(KINETIS_PIT2_HANDLER)
-#error "KINETIS_PIT2_HANDLER not defined"
-#endif
-/**
- * @brief PIT2 interrupt handler.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(KINETIS_PIT2_HANDLER) {
-
- OSAL_IRQ_PROLOGUE();
-
- gpt_lld_serve_interrupt(&GPTD3);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_GPT_USE_PIT2 */
-
-#if KINETIS_GPT_USE_PIT3
-#if !defined(KINETIS_PIT3_HANDLER)
-#error "KINETIS_PIT3_HANDLER not defined"
-#endif
-/**
- * @brief PIT3 interrupt handler.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(KINETIS_PIT3_HANDLER) {
-
- OSAL_IRQ_PROLOGUE();
-
- gpt_lld_serve_interrupt(&GPTD4);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_GPT_USE_PIT3 */
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level GPT driver initialization.
- *
- * @notapi
- */
-void gpt_lld_init(void) {
-
-#if KINETIS_GPT_USE_PIT0
- /* Driver initialization.*/
- GPTD1.channel = &PIT->CHANNEL[0];
- gptObjectInit(&GPTD1);
-#endif
-
-#if KINETIS_GPT_USE_PIT1
- /* Driver initialization.*/
- GPTD2.channel = &PIT->CHANNEL[1];
- gptObjectInit(&GPTD2);
-#endif
-
-#if KINETIS_GPT_USE_PIT2
- /* Driver initialization.*/
- GPTD3.channel = &PIT->CHANNEL[2];
- gptObjectInit(&GPTD3);
-#endif
-
-#if KINETIS_GPT_USE_PIT3
- /* Driver initialization.*/
- GPTD4.channel = &PIT->CHANNEL[3];
- gptObjectInit(&GPTD4);
-#endif
-}
-
-/**
- * @brief Configures and activates the GPT peripheral.
- *
- * @param[in] gptp pointer to the @p GPTDriver object
- *
- * @notapi
- */
-void gpt_lld_start(GPTDriver *gptp) {
- uint16_t psc;
-
- if (gptp->state == GPT_STOP) {
- /* Clock activation.*/
- SIM->SCGC6 |= SIM_SCGC6_PIT;
- gptp->clock = KINETIS_SYSCLK_FREQUENCY;
-
-#if KINETIS_GPT_USE_PIT0
- if (&GPTD1 == gptp) {
- nvicEnableVector(PITChannel0_IRQn, KINETIS_GPT_PIT0_IRQ_PRIORITY);
- }
-#endif
-#if KINETIS_GPT_USE_PIT1
- if (&GPTD2 == gptp) {
- nvicEnableVector(PITChannel1_IRQn, KINETIS_GPT_PIT1_IRQ_PRIORITY);
- }
-#endif
-#if KINETIS_GPT_USE_PIT2
- if (&GPTD3 == gptp) {
- nvicEnableVector(PITChannel2_IRQn, KINETIS_GPT_PIT2_IRQ_PRIORITY);
- }
-#endif
-#if KINETIS_GPT_USE_PIT3
- if (&GPTD4 == gptp) {
- nvicEnableVector(PITChannel3_IRQn, KINETIS_GPT_PIT3_IRQ_PRIORITY);
- }
-#endif
-
- }
-
- /* Prescaler value calculation.*/
- psc = (uint16_t)((gptp->clock / gptp->config->frequency) - 1);
- osalDbgAssert(((uint32_t)(psc + 1) * gptp->config->frequency) == gptp->clock,
- "invalid frequency");
-
- /* Enable the PIT */
- PIT->MCR = 0;
-}
-
-/**
- * @brief Deactivates the GPT peripheral.
- *
- * @param[in] gptp pointer to the @p GPTDriver object
- *
- * @notapi
- */
-void gpt_lld_stop(GPTDriver *gptp) {
-
- if (gptp->state == GPT_READY) {
- SIM->SCGC6 &= ~SIM_SCGC6_PIT;
-
- /* Disable the channel */
- gptp->channel->TCTRL = 0;
-
- /* Clear pending interrupts */
- gptp->channel->TFLG |= PIT_TFLG_TIF;
-
-#if KINETIS_GPT_USE_PIT0
- if (&GPTD1 == gptp) {
- nvicDisableVector(PITChannel0_IRQn);
- }
-#endif
-#if KINETIS_GPT_USE_PIT1
- if (&GPTD2 == gptp) {
- nvicDisableVector(PITChannel1_IRQn);
- }
-#endif
-#if KINETIS_GPT_USE_PIT2
- if (&GPTD3 == gptp) {
- nvicDisableVector(PITChannel2_IRQn);
- }
-#endif
-#if KINETIS_GPT_USE_PIT3
- if (&GPTD4 == gptp) {
- nvicDisableVector(PITChannel3_IRQn);
- }
-#endif
- }
-}
-
-/**
- * @brief Starts the timer in continuous mode.
- *
- * @param[in] gptp pointer to the @p GPTDriver object
- * @param[in] interval period in ticks
- *
- * @notapi
- */
-void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t interval) {
-
- /* Clear pending interrupts */
- gptp->channel->TFLG |= PIT_TFLG_TIF;
-
- /* Set the interval */
- gptp->channel->LDVAL = (gptp->clock / gptp->config->frequency) * interval;
-
- /* Start the timer */
- gptp->channel->TCTRL |= PIT_TCTRL_TIE | PIT_TCTRL_TEN;
-}
-
-/**
- * @brief Stops the timer.
- *
- * @param[in] gptp pointer to the @p GPTDriver object
- *
- * @notapi
- */
-void gpt_lld_stop_timer(GPTDriver *gptp) {
-
- /* Stop the timer */
- gptp->channel->TCTRL = 0;
-}
-
-/**
- * @brief Starts the timer in one shot mode and waits for completion.
- * @details This function specifically polls the timer waiting for completion
- * in order to not have extra delays caused by interrupt servicing,
- * this function is only recommended for short delays.
- *
- * @param[in] gptp pointer to the @p GPTDriver object
- * @param[in] interval time interval in ticks
- *
- * @notapi
- */
-void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval) {
- struct PIT_CHANNEL *channel = gptp->channel;
-
- /* Disable timer and disable interrupts */
- channel->TCTRL = 0;
-
- /* Clear the interrupt flag */
- channel->TFLG |= PIT_TFLG_TIF;
-
- /* Set the interval */
- channel->LDVAL = (gptp->clock / gptp->config->frequency) * interval;
-
- /* Enable Timer but keep interrupts disabled */
- channel->TCTRL = PIT_TCTRL_TEN;
-
- /* Wait for the interrupt flag to be set */
- while (!(channel->TFLG & PIT_TFLG_TIF))
- ;
-
- /* Disable timer and disable interrupts */
- channel->TCTRL = 0;
-}
-
-#endif /* HAL_USE_GPT */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/gpt_lld.h b/os/hal/ports/KINETIS/K20x/gpt_lld.h
deleted file mode 100644
index 0e72309cd..000000000
--- a/os/hal/ports/KINETIS/K20x/gpt_lld.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Derek Mulcahy
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/gpt_lld.h
- * @brief KINETIS GPT subsystem low level driver header.
- *
- * @addtogroup GPT
- * @{
- */
-
-#ifndef _GPT_LLD_H_
-#define _GPT_LLD_H_
-
-#if HAL_USE_GPT || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief GPTD1 driver enable switch.
- * @details If set to @p TRUE the support for GPTD1 is included.
- * @note The default is @p TRUE.
- */
-#if !defined(KINETIS_GPT_USE_PIT0) || defined(__DOXYGEN__)
-#define KINETIS_GPT_USE_PIT0 FALSE
-#endif
-
-/**
- * @brief GPTD2 driver enable switch.
- * @details If set to @p TRUE the support for GPTD2 is included.
- * @note The default is @p TRUE.
- */
-#if !defined(KINETIS_GPT_USE_PIT1) || defined(__DOXYGEN__)
-#define KINETIS_GPT_USE_PIT1 FALSE
-#endif
-
-/**
- * @brief GPTD3 driver enable switch.
- * @details If set to @p TRUE the support for GPTD3 is included.
- * @note The default is @p TRUE.
- */
-#if !defined(KINETIS_GPT_USE_PIT2) || defined(__DOXYGEN__)
-#define KINETIS_GPT_USE_PIT2 FALSE
-#endif
-
-/**
- * @brief GPTD4 driver enable switch.
- * @details If set to @p TRUE the support for GPTD4 is included.
- * @note The default is @p TRUE.
- */
-#if !defined(KINETIS_GPT_USE_PIT3) || defined(__DOXYGEN__)
-#define KINETIS_GPT_USE_PIT3 FALSE
-#endif
-
-/**
- * @brief GPTD1 interrupt priority level setting.
- */
-#if !defined(KINETIS_GPT_PIT0_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_GPT_PIT0_IRQ_PRIORITY 7
-#endif
-
-/**
- * @brief GPTD2 interrupt priority level setting.
- */
-#if !defined(KINETIS_GPT_PIT1_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_GPT_PIT1_IRQ_PRIORITY 7
-#endif
-
-/**
- * @brief GPTD3 interrupt priority level setting.
- */
-#if !defined(KINETIS_GPT_PIT2_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_GPT_PIT2_IRQ_PRIORITY 7
-#endif
-
-/**
- * @brief GPTD4 interrupt priority level setting.
- */
-#if !defined(KINETIS_GPT_PIT3_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_GPT_PIT3_IRQ_PRIORITY 7
-#endif
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-#if KINETIS_GPT_USE_PIT0 && !KINETIS_HAS_PIT0
-#error "PIT0 not present in the selected device"
-#endif
-
-#if KINETIS_GPT_USE_PIT1 && !KINETIS_HAS_PIT1
-#error "PIT1 not present in the selected device"
-#endif
-
-#if KINETIS_GPT_USE_PIT2 && !KINETIS_HAS_PIT2
-#error "PIT2 not present in the selected device"
-#endif
-
-#if KINETIS_GPT_USE_PIT3 && !KINETIS_HAS_PIT3
-#error "PIT3 not present in the selected device"
-#endif
-
-#if !KINETIS_GPT_USE_PIT0 && !KINETIS_GPT_USE_PIT1 && \
- !KINETIS_GPT_USE_PIT2 && !KINETIS_GPT_USE_PIT3
-#error "GPT driver activated but no PIT peripheral assigned"
-#endif
-
-#if KINETIS_GPT_USE_PIT0 && \
- !OSAL_IRQ_IS_VALID_PRIORITY(KINETIS_GPT_PIT0_IRQ_PRIORITY)
-#error "Invalid IRQ priority assigned to PIT0"
-#endif
-
-#if KINETIS_GPT_USE_PIT1 && \
- !OSAL_IRQ_IS_VALID_PRIORITY(KINETIS_GPT_PIT1_IRQ_PRIORITY)
-#error "Invalid IRQ priority assigned to PIT1"
-#endif
-
-#if KINETIS_GPT_USE_PIT2 && \
- !OSAL_IRQ_IS_VALID_PRIORITY(KINETIS_GPT_PIT2_IRQ_PRIORITY)
-#error "Invalid IRQ priority assigned to PIT2"
-#endif
-
-#if KINETIS_GPT_USE_PIT3 && \
- !OSAL_IRQ_IS_VALID_PRIORITY(KINETIS_GPT_PIT3_IRQ_PRIORITY)
-#error "Invalid IRQ priority assigned to PIT3"
-#endif
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief GPT frequency type.
- */
-typedef uint32_t gptfreq_t;
-
-/**
- * @brief GPT counter type.
- */
-typedef uint32_t gptcnt_t;
-
-/**
- * @brief Driver configuration structure.
- * @note It could be empty on some architectures.
- */
-typedef struct {
- /**
- * @brief Timer clock in Hz.
- * @note The low level can use assertions in order to catch invalid
- * frequency specifications.
- */
- gptfreq_t frequency;
- /**
- * @brief Timer callback pointer.
- * @note This callback is invoked on GPT counter events.
- * @note This callback can be set to @p NULL but in that case the
- * one-shot mode cannot be used.
- */
- gptcallback_t callback;
- /* End of the mandatory fields.*/
-} GPTConfig;
-
-/**
- * @brief Structure representing a GPT driver.
- */
-struct GPTDriver {
- /**
- * @brief Driver state.
- */
- gptstate_t state;
- /**
- * @brief Current configuration data.
- */
- const GPTConfig *config;
-#if defined(GPT_DRIVER_EXT_FIELDS)
- GPT_DRIVER_EXT_FIELDS
-#endif
- /* End of the mandatory fields.*/
- /**
- * @brief Timer base clock.
- */
- uint32_t clock;
- /**
- * @brief Channel structure in PIT registers block.
- */
- struct PIT_CHANNEL *channel;
-};
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/**
- * @brief Changes the interval of GPT peripheral.
- * @details This function changes the interval of a running GPT unit.
- * @pre The GPT unit must be running in continuous mode.
- * @post The GPT unit interval is changed to the new value.
- * @note The function has effect at the next cycle start.
- *
- * @param[in] gptp pointer to a @p GPTDriver object
- * @param[in] interval new cycle time in timer ticks
- *
- * @notapi
- */
-#define gpt_lld_change_interval(gptp, interval) \
- ((gptp)->channel->LDVAL = (uint32_t)((interval)))
-
-/**
- * @brief Returns the interval of GPT peripheral.
- * @pre The GPT unit must be running in continuous mode.
- *
- * @param[in] gptp pointer to a @p GPTDriver object
- * @return The current interval.
- *
- * @notapi
- */
-#define gpt_lld_get_interval(gptp) ((gptcnt_t)(gptp)->pit->CHANNEL[gptp->channel].LDVAL)
-
-/**
- * @brief Returns the counter value of GPT peripheral.
- * @pre The GPT unit must be running in continuous mode.
- * @note The nature of the counter is not defined, it may count upward
- * or downward, it could be continuously running or not.
- *
- * @param[in] gptp pointer to a @p GPTDriver object
- * @return The current counter value.
- *
- * @notapi
- */
-#define gpt_lld_get_counter(gptp) ((gptcnt_t)(gptp)->pit->CHANNEL[gptp->channel].CVAL)
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if KINETIS_GPT_USE_PIT0 && !defined(__DOXYGEN__)
-extern GPTDriver GPTD1;
-#endif
-
-#if KINETIS_GPT_USE_PIT1 && !defined(__DOXYGEN__)
-extern GPTDriver GPTD2;
-#endif
-
-#if KINETIS_GPT_USE_PIT2 && !defined(__DOXYGEN__)
-extern GPTDriver GPTD3;
-#endif
-
-#if KINETIS_GPT_USE_PIT3 && !defined(__DOXYGEN__)
-extern GPTDriver GPTD4;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void gpt_lld_init(void);
- void gpt_lld_start(GPTDriver *gptp);
- void gpt_lld_stop(GPTDriver *gptp);
- void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t period);
- void gpt_lld_stop_timer(GPTDriver *gptp);
- void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_GPT */
-
-#endif /* _GPT_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/hal_lld.c b/os/hal/ports/KINETIS/K20x/hal_lld.c
deleted file mode 100644
index 1e102414e..000000000
--- a/os/hal/ports/KINETIS/K20x/hal_lld.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file templates/hal_lld.c
- * @brief HAL Driver subsystem low level driver source template.
- *
- * @addtogroup HAL
- * @{
- */
-
-#include "hal.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-#ifdef __CC_ARM
-__attribute__ ((section(".ARM.__at_0x400")))
-#else
-__attribute__ ((used, section(".cfmconfig")))
-#endif
-const uint8_t _cfm[0x10] = {
- 0xFF, /* NV_BACKKEY3: KEY=0xFF */
- 0xFF, /* NV_BACKKEY2: KEY=0xFF */
- 0xFF, /* NV_BACKKEY1: KEY=0xFF */
- 0xFF, /* NV_BACKKEY0: KEY=0xFF */
- 0xFF, /* NV_BACKKEY7: KEY=0xFF */
- 0xFF, /* NV_BACKKEY6: KEY=0xFF */
- 0xFF, /* NV_BACKKEY5: KEY=0xFF */
- 0xFF, /* NV_BACKKEY4: KEY=0xFF */
- 0xFF, /* NV_FPROT3: PROT=0xFF */
- 0xFF, /* NV_FPROT2: PROT=0xFF */
- 0xFF, /* NV_FPROT1: PROT=0xFF */
- 0xFF, /* NV_FPROT0: PROT=0xFF */
- 0x7E, /* NV_FSEC: KEYEN=1,MEEN=3,FSLACC=3,SEC=2 */
- 0xFF, /* NV_FOPT: ??=1,??=1,FAST_INIT=1,LPBOOT1=1,RESET_PIN_CFG=1,
- NMI_DIS=1,EZPORT_DIS=1,LPBOOT0=1 */
- 0xFF,
- 0xFF
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level HAL driver initialization.
- * @todo Use a macro to define the system clock frequency.
- *
- * @notapi
- */
-void hal_lld_init(void) {
-
-}
-
-/**
- * @brief MK20D5 clock initialization.
- * @note All the involved constants come from the file @p board.h.
- * @note This function is meant to be invoked early during the system
- * initialization, it is usually invoked from the file
- * @p board.c.
- * @todo This function needs to be more generic.
- *
- * @special
- */
-void mk20d50_clock_init(void) {
-#if !KINETIS_NO_INIT
-
-#if KINETIS_MCG_MODE == KINETIS_MCG_MODE_PEE
- uint32_t ratio, frdiv;
- uint32_t ratios[] = { 32, 64, 128, 256, 512, 1024, 1280, 1536 };
- int ratio_quantity = sizeof(ratios) / sizeof(ratios[0]);
- int i;
-#endif /* KINETIS_MCG_MODE == KINETIS_MCG_MODE_PEE */
-
- /* Disable the watchdog */
- WDOG->UNLOCK = 0xC520;
- WDOG->UNLOCK = 0xD928;
- WDOG->STCTRLH &= ~WDOG_STCTRLH_WDOGEN;
-
- SIM->SCGC5 |= SIM_SCGC5_PORTA |
- SIM_SCGC5_PORTB |
- SIM_SCGC5_PORTC |
- SIM_SCGC5_PORTD |
- SIM_SCGC5_PORTE;
-
-#if KINETIS_MCG_MODE == KINETIS_MCG_MODE_FEI
-
- /* Configure FEI mode */
- MCG->C4 = MCG_C4_DRST_DRS(KINETIS_MCG_FLL_DRS) |
- (KINETIS_MCG_FLL_DMX32 ? MCG_C4_DMX32 : 0);
-
-#endif /* KINETIS_MCG_MODE == KINETIS_MCG_MODE_FEI */
-
-#if KINETIS_MCG_MODE == KINETIS_MCG_MODE_PEE
-
- /* EXTAL0 and XTAL0 */
- PORTA->PCR[18] = 0;
- PORTA->PCR[19] = 0;
-
- /*
- * Start in FEI mode
- */
-
- /* Disable capacitors for crystal */
- OSC->CR = 0;
-
- /* TODO: need to add more flexible calculation, specially regarding
- * divisors which may not be available depending on the XTAL
- * frequency, which would required other registers to be modified.
- */
- /* Enable OSC, low power mode */
- MCG->C2 = MCG_C2_LOCRE0 | MCG_C2_EREFS0;
- if (KINETIS_XTAL_FREQUENCY > 8000000)
- MCG->C2 |= MCG_C2_RANGE0(2);
- else
- MCG->C2 |= MCG_C2_RANGE0(1);
-
- frdiv = 7;
- ratio = KINETIS_XTAL_FREQUENCY / 31250;
- for (i = 0; i < ratio_quantity; ++i) {
- if (ratio == ratios[i]) {
- frdiv = i;
- break;
- }
- }
-
- /* Switch to crystal as clock source, FLL input of 31.25 KHz */
- MCG->C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(frdiv);
-
- /* Wait for crystal oscillator to begin */
- while (!(MCG->S & MCG_S_OSCINIT0));
-
- /* Wait for the FLL to use the oscillator */
- while (MCG->S & MCG_S_IREFST);
-
- /* Wait for the MCGOUTCLK to use the oscillator */
- while ((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST(2));
-
- /*
- * Now in FBE mode
- */
-
- /* Config PLL input for 2 MHz */
- MCG->C5 = MCG_C5_PRDIV0((KINETIS_XTAL_FREQUENCY / 2000000) - 1);
-
- /* Config PLL for 96 MHz output */
- MCG->C6 = MCG_C6_PLLS | MCG_C6_VDIV0(0);
-
- /* Wait for PLL to start using crystal as its input */
- while (!(MCG->S & MCG_S_PLLST));
-
- /* Wait for PLL to lock */
- while (!(MCG->S & MCG_S_LOCK0));
-
- /*
- * Now in PBE mode
- */
-
- /* Switch to PLL as clock source */
- MCG->C1 = MCG_C1_CLKS(0);
-
- /* Wait for PLL clock to be used */
- while ((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST_PLL);
-
- /*
- * Now in PEE mode
- */
-#endif /* KINETIS_MCG_MODE == KINETIS_MCG_MODE_PEE */
-
-#endif /* !KINETIS_NO_INIT */
-}
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/hal_lld.h b/os/hal/ports/KINETIS/K20x/hal_lld.h
deleted file mode 100644
index 3544797d9..000000000
--- a/os/hal/ports/KINETIS/K20x/hal_lld.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/hal_lld.h
- * @brief Kinetis KL2x HAL subsystem low level driver header.
- *
- * @addtogroup HAL
- * @{
- */
-
-#ifndef _HAL_LLD_H_
-#define _HAL_LLD_H_
-
-#include "mk20d5.h"
-#include "kinetis_registry.h"
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/**
- * @brief Defines the support for realtime counters in the HAL.
- */
-#define HAL_IMPLEMENTS_COUNTERS FALSE
-
-/**
- * @name Platform identification
- * @{
- */
-#define PLATFORM_NAME "Kinetis"
-/** @} */
-
-/**
- * @brief Maximum system and core clock (f_SYS) frequency.
- */
-#define KINETIS_SYSCLK_MAX 48000000
-
-/**
- * @brief Maximum bus clock (f_BUS) frequency.
- */
-#define KINETIS_BUSCLK_MAX 24000000
-
-/**
- * @name Internal clock sources
- * @{
- */
-#define KINETIS_IRCLK_F 4000000 /**< Fast internal reference clock, factory trimmed. */
-#define KINETIS_IRCLK_S 32768 /**< Slow internal reference clock, factory trimmed. */
-/** @} */
-
-#define KINETIS_MCG_MODE_FEI 1 /**< FLL Engaged Internal. */
-#define KINETIS_MCG_MODE_FEE 2 /**< FLL Engaged External. */
-#define KINETIS_MCG_MODE_FBI 3 /**< FLL Bypassed Internal. */
-#define KINETIS_MCG_MODE_FBE 4 /**< FLL Bypassed External. */
-#define KINETIS_MCG_MODE_PEE 5 /**< PLL Engaged External. */
-#define KINETIS_MCG_MODE_PBE 6 /**< PLL Bypassed External. */
-#define KINETIS_MCG_MODE_BLPI 7 /**< Bypassed Low Power Internal. */
-#define KINETIS_MCG_MODE_BLPE 8 /**< Bypassed Low Power External. */
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief Disables the MCG/system clock initialization in the HAL.
- */
-#if !defined(KINETIS_NO_INIT) || defined(__DOXYGEN__)
-#define KINETIS_NO_INIT FALSE
-#endif
-
-/**
- * @brief MCG mode selection.
- */
-#if !defined(KINETIS_MCG_MODE) || defined(__DOXYGEN__)
-#define KINETIS_MCG_MODE KINETIS_MCG_MODE_PEE
-#endif
-
-/**
- * @brief Clock divider for core/system and bus/flash clocks (OUTDIV1).
- * @note The allowed range is 1...16.
- * @note The default value is calculated for a 48 MHz system clock
- * from a 96 MHz PLL output.
- */
-#if !defined(KINETIS_MCG_FLL_OUTDIV1) || defined(__DOXYGEN__)
-#define KINETIS_MCG_FLL_OUTDIV1 2
-#endif
-
-/**
- * @brief Additional clock divider bus/flash clocks (OUTDIV4).
- * @note The allowed range is 1...8.
- * @note This divider is on top of the OUTDIV1 divider.
- * @note The default value is calculated for 24 MHz bus/flash clocks
- * from a 96 MHz PLL output and 48 MHz core/system clock.
- */
-#if !defined(KINETIS_MCG_FLL_OUTDIV4) || defined(__DOXYGEN__)
-#define KINETIS_MCG_FLL_OUTDIV4 2
-#endif
-
-/**
- * @brief FLL DCO tuning enable for 32.768 kHz reference.
- * @note Set to 1 for fine-tuning DCO for maximum frequency with
- * a 32.768 kHz reference.
- * @note The default value is for a 32.768 kHz external crystal.
- */
-#if !defined(KINETIS_MCG_FLL_DMX32) || defined(__DOXYGEN__)
-#define KINETIS_MCG_FLL_DMX32 1
-#endif
-
-/**
- * @brief FLL DCO range selection.
- * @note The allowed range is 0...3.
- * @note The default value is calculated for 48 MHz FLL output
- * from a 32.768 kHz external crystal.
- * (DMX32 && DRST_DRS=1 => F=1464; 32.768 kHz * F ~= 48 MHz.)
- *
- */
-#if !defined(KINETIS_MCG_FLL_DRS) || defined(__DOXYGEN__)
-#define KINETIS_MCG_FLL_DRS 2
-#endif
-
-/**
- * @brief MCU system/core clock frequency.
- */
-#if !defined(KINETIS_SYSCLK_FREQUENCY) || defined(__DOXYGEN__)
-#define KINETIS_SYSCLK_FREQUENCY 48000000UL
-#endif
-
-/**
- * @brief MCU bus/flash clock frequency.
- */
-#if !defined(KINETIS_BUSCLK_FREQUENCY) || defined(__DOXYGEN__)
-#define KINETIS_BUSCLK_FREQUENCY (KINETIS_SYSCLK_FREQUENCY / KINETIS_MCG_FLL_OUTDIV4)
-#endif
-
-/**
- * @brief UART0 clock frequency.
- * @note The default value is based on 96 MHz PLL/2 source.
- * If you use a different source, such as the FLL,
- * you must set this properly.
- */
-#if !defined(KINETIS_UART0_CLOCK_FREQ) || defined(__DOXYGEN__)
-#define KINETIS_UART0_CLOCK_FREQ KINETIS_SYSCLK_FREQUENCY
-#endif
-
-/**
- * @brief UART0 clock source.
- * @note The default value is to use PLL/2 or FLL source.
- */
-#if !defined(KINETIS_UART0_CLOCK_SRC) || defined(__DOXYGEN__)
-#define KINETIS_UART0_CLOCK_SRC 1
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-#if !defined(KINETIS_SYSCLK_FREQUENCY)
-#error KINETIS_SYSCLK_FREQUENCY must be defined
-#endif
-
-#if KINETIS_SYSCLK_FREQUENCY <= 0 || KINETIS_SYSCLK_FREQUENCY > KINETIS_SYSCLK_MAX
-#error KINETIS_SYSCLK_FREQUENCY out of range
-#endif
-
-#if !defined(KINETIS_BUSCLK_FREQUENCY)
-#error KINETIS_BUSCLK_FREQUENCY must be defined
-#endif
-
-#if KINETIS_BUSCLK_FREQUENCY <= 0 || KINETIS_BUSCLK_FREQUENCY > KINETIS_BUSCLK_MAX
-#error KINETIS_BUSCLK_FREQUENCY out of range
-#endif
-
-#if !(defined(KINETIS_MCG_FLL_OUTDIV1) && \
- KINETIS_MCG_FLL_OUTDIV1 >= 1 && KINETIS_MCG_FLL_OUTDIV1 <= 16)
-#error KINETIS_MCG_FLL_OUTDIV1 must be 1 through 16
-#endif
-
-#if !(defined(KINETIS_MCG_FLL_OUTDIV4) && \
- KINETIS_MCG_FLL_OUTDIV4 >= 1 && KINETIS_MCG_FLL_OUTDIV4 <= 8)
-#error KINETIS_MCG_FLL_OUTDIV4 must be 1 through 8
-#endif
-
-#if !(KINETIS_MCG_FLL_DMX32 == 0 || KINETIS_MCG_FLL_DMX32 == 1)
-#error Invalid KINETIS_MCG_FLL_DMX32 value, must be 0 or 1
-#endif
-
-#if !(0 <= KINETIS_MCG_FLL_DRS && KINETIS_MCG_FLL_DRS <= 3)
-#error Invalid KINETIS_MCG_FLL_DRS value, must be 0...3
-#endif
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type representing a system clock frequency.
- */
-typedef uint32_t halclock_t;
-
-/**
- * @brief Type of the realtime free counter value.
- */
-typedef uint32_t halrtcnt_t;
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/**
- * @brief Returns the current value of the system free running counter.
- * @note This service is implemented by returning the content of the
- * DWT_CYCCNT register.
- *
- * @return The value of the system free running counter of
- * type halrtcnt_t.
- *
- * @notapi
- */
-#define hal_lld_get_counter_value() 0
-
-/**
- * @brief Realtime counter frequency.
- * @note The DWT_CYCCNT register is incremented directly by the system
- * clock so this function returns STM32_HCLK.
- *
- * @return The realtime counter frequency of type halclock_t.
- *
- * @notapi
- */
-#define hal_lld_get_counter_frequency() 0
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#include "nvic.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void hal_lld_init(void);
- void mk20d50_clock_init(void);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _HAL_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/kinetis_registry.h b/os/hal/ports/KINETIS/K20x/kinetis_registry.h
deleted file mode 100644
index 024a4242b..000000000
--- a/os/hal/ports/KINETIS/K20x/kinetis_registry.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Derek Mulcahy
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/kinetis_registry.h
- * @brief KL2x capabilities registry.
- *
- * @addtogroup HAL
- * @{
- */
-
-#ifndef _KINETIS_REGISTRY_H_
-#define _KINETIS_REGISTRY_H_
-
-/*===========================================================================*/
-/* Platform capabilities. */
-/*===========================================================================*/
-
-/**
- * @name KL2x capabilities
- * @{
- */
-/* EXT attributes.*/
-
-#define KINETIS_PORTA_IRQ_VECTOR VectorE0
-#define KINETIS_PORTB_IRQ_VECTOR VectorE4
-#define KINETIS_PORTC_IRQ_VECTOR VectorE8
-#define KINETIS_PORTD_IRQ_VECTOR VectorEC
-#define KINETIS_PORTE_IRQ_VECTOR VectorF0
-
-/* ADC attributes.*/
-#define KINETIS_HAS_ADC0 TRUE
-#define KINETIS_ADC0_IRQ_VECTOR Vector98
-
-/* I2C attributes.*/
-#define KINETIS_I2C0_IRQ_VECTOR Vector6C
-
-/* USB attributes */
-#define KINETIS_USB_IRQ_VECTOR VectorCC
-
-/** @} */
-
-#endif /* _KINETIS_REGISTRY_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/pal_lld.c b/os/hal/ports/KINETIS/K20x/pal_lld.c
deleted file mode 100644
index 101d5749e..000000000
--- a/os/hal/ports/KINETIS/K20x/pal_lld.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file MK20D5/pal_lld.c
- * @brief PAL subsystem low level driver.
- *
- * @addtogroup PAL
- * @{
- */
-
-#include "osal.h"
-#include "hal.h"
-
-#if HAL_USE_PAL || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/**
- * @brief Reads a logical state from an I/O pad.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @return The logical state.
- * @retval PAL_LOW low logical state.
- * @retval PAL_HIGH high logical state.
- *
- * @notapi
- */
-uint8_t _pal_lld_readpad(ioportid_t port,
- uint8_t pad) {
-
- return (port->PDIR & ((uint32_t) 1 << pad)) ? PAL_HIGH : PAL_LOW;
-}
-
-/**
- * @brief Writes a logical state on an output pad.
- * @note This function is not meant to be invoked directly by the
- * application code.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] bit logical value, the value must be @p PAL_LOW or
- * @p PAL_HIGH
- *
- * @notapi
- */
-void _pal_lld_writepad(ioportid_t port,
- uint8_t pad,
- uint8_t bit) {
-
- if (bit == PAL_HIGH)
- port->PDOR |= ((uint32_t) 1 << pad);
- else
- port->PDOR &= ~((uint32_t) 1 << pad);
-}
-
-/**
- * @brief Pad mode setup.
- * @details This function programs a pad with the specified mode.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- * @note Programming an unknown or unsupported mode is silently ignored.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] mode pad mode
- *
- * @notapi
- */
-void _pal_lld_setpadmode(ioportid_t port,
- uint8_t pad,
- iomode_t mode) {
-
- PORT_TypeDef *portcfg = NULL;
-
- chDbgAssert(pad <= 31, "pal_lld_setpadmode() #1, invalid pad");
-
- if (mode == PAL_MODE_OUTPUT_PUSHPULL)
- port->PDDR |= ((uint32_t) 1 << pad);
- else
- port->PDDR &= ~((uint32_t) 1 << pad);
-
- if (port == IOPORT1)
- portcfg = PORTA;
- else if (port == IOPORT2)
- portcfg = PORTB;
- else if (port == IOPORT3)
- portcfg = PORTC;
- else if (port == IOPORT4)
- portcfg = PORTD;
- else if (port == IOPORT5)
- portcfg = PORTE;
-
- chDbgAssert(portcfg != NULL, "pal_lld_setpadmode() #2, invalid port");
-
- switch (mode) {
- case PAL_MODE_RESET:
- case PAL_MODE_INPUT:
- case PAL_MODE_OUTPUT_PUSHPULL:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(1);
- break;
- case PAL_MODE_OUTPUT_OPENDRAIN:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(1) |
- PORTx_PCRn_ODE;
- break;
- case PAL_MODE_INPUT_PULLUP:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(1) |
- PORTx_PCRn_PE |
- PORTx_PCRn_PS;
- break;
- case PAL_MODE_INPUT_PULLDOWN:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(1) |
- PORTx_PCRn_PE;
- break;
- case PAL_MODE_UNCONNECTED:
- case PAL_MODE_INPUT_ANALOG:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(0);
- break;
- case PAL_MODE_ALTERNATIVE_1:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(1);
- break;
- case PAL_MODE_ALTERNATIVE_2:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(2);
- break;
- case PAL_MODE_ALTERNATIVE_3:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(3);
- break;
- case PAL_MODE_ALTERNATIVE_4:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(4);
- break;
- case PAL_MODE_ALTERNATIVE_5:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(5);
- break;
- case PAL_MODE_ALTERNATIVE_6:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(6);
- break;
- case PAL_MODE_ALTERNATIVE_7:
- portcfg->PCR[pad] = PIN_MUX_ALTERNATIVE(7);
- break;
- }
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Kinetis I/O ports configuration.
- * @details Ports A-E clocks enabled.
- *
- * @param[in] config the Kinetis ports configuration
- *
- * @notapi
- */
-void _pal_lld_init(const PALConfig *config) {
-
- int i, j;
-
- /* Enable clocking on all Ports */
- SIM->SCGC5 |= SIM_SCGC5_PORTA |
- SIM_SCGC5_PORTB |
- SIM_SCGC5_PORTC |
- SIM_SCGC5_PORTD |
- SIM_SCGC5_PORTE;
-
- /* Initial PORT and GPIO setup */
- for (i = 0; i < TOTAL_PORTS; i++) {
- for (j = 0; j < PADS_PER_PORT; j++) {
- pal_lld_setpadmode(config->ports[i].port,
- j,
- config->ports[i].pads[j]);
- }
- }
-}
-
-/**
- * @brief Pads mode setup.
- * @details This function programs a pads group belonging to the same port
- * with the specified mode.
- *
- * @param[in] port the port identifier
- * @param[in] mask the group mask
- * @param[in] mode the mode
- *
- * @notapi
- */
-void _pal_lld_setgroupmode(ioportid_t port,
- ioportmask_t mask,
- iomode_t mode) {
-
- int i;
-
- (void)mask;
-
- for (i = 0; i < PADS_PER_PORT; i++) {
- pal_lld_setpadmode(port, i, mode);
- }
-}
-
-#endif /* HAL_USE_PAL */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/pal_lld.h b/os/hal/ports/KINETIS/K20x/pal_lld.h
deleted file mode 100644
index 242583a86..000000000
--- a/os/hal/ports/KINETIS/K20x/pal_lld.h
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file MK20D5/pal_lld.h
- * @brief PAL subsystem low level driver header.
- *
- * @addtogroup PAL
- * @{
- */
-
-#ifndef _PAL_LLD_H_
-#define _PAL_LLD_H_
-
-#if HAL_USE_PAL || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Unsupported modes and specific modes */
-/*===========================================================================*/
-
-#define PAL_MODE_ALTERNATIVE_1 10
-#define PAL_MODE_ALTERNATIVE_2 11
-#define PAL_MODE_ALTERNATIVE_3 12
-#define PAL_MODE_ALTERNATIVE_4 13
-#define PAL_MODE_ALTERNATIVE_5 14
-#define PAL_MODE_ALTERNATIVE_6 15
-#define PAL_MODE_ALTERNATIVE_7 16
-
-#define PIN_MUX_ALTERNATIVE(x) PORTx_PCRn_MUX(x)
-
-/*===========================================================================*/
-/* I/O Ports Types and constants. */
-/*===========================================================================*/
-
-#define TOTAL_PORTS 5
-#define PADS_PER_PORT 32
-
-/**
- * @brief Width, in bits, of an I/O port.
- */
-#define PAL_IOPORTS_WIDTH 32
-
-/**
- * @brief Whole port mask.
- * @brief This macro specifies all the valid bits into a port.
- */
-#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFFFFF)
-
-/**
- * @brief Digital I/O port sized unsigned type.
- */
-typedef uint32_t ioportmask_t;
-
-/**
- * @brief Digital I/O modes.
- */
-typedef uint32_t iomode_t;
-
-/**
- * @brief Port Identifier.
- * @details This type can be a scalar or some kind of pointer, do not make
- * any assumption about it, use the provided macros when populating
- * variables of this type.
- */
-typedef GPIO_TypeDef *ioportid_t;
-
-/**
- * @brief Port Configuration.
- * @details This structure stores the configuration parameters of all pads
- * belonging to a port.
- */
-typedef struct {
- ioportid_t port;
- iomode_t pads[PADS_PER_PORT];
-} PortConfig;
-
-/**
- * @brief Generic I/O ports static initializer.
- * @details An instance of this structure must be passed to @p palInit() at
- * system startup time in order to initialized the digital I/O
- * subsystem. This represents only the initial setup, specific pads
- * or whole ports can be reprogrammed at later time.
- * @note Implementations may extend this structure to contain more,
- * architecture dependent, fields.
- */
-typedef struct {
- PortConfig ports[TOTAL_PORTS];
-} PALConfig;
-
-/*===========================================================================*/
-/* I/O Ports Identifiers. */
-/*===========================================================================*/
-
-/**
- * @brief GPIO port A identifier.
- */
-#define IOPORT1 GPIOA
-
-/**
- * @brief GPIO port B identifier.
- */
-#define IOPORT2 GPIOB
-
-/**
- * @brief GPIO port C identifier.
- */
-#define IOPORT3 GPIOC
-
-/**
- * @brief GPIO port D identifier.
- */
-#define IOPORT4 GPIOD
-
-/**
- * @brief GPIO port E identifier.
- */
-#define IOPORT5 GPIOE
-
-/*===========================================================================*/
-/* Implementation, some of the following macros could be implemented as */
-/* functions, if so please put them in pal_lld.c. */
-/*===========================================================================*/
-
-/**
- * @brief Low level PAL subsystem initialization.
- *
- * @param[in] config architecture-dependent ports configuration
- *
- * @notapi
- */
-#define pal_lld_init(config) _pal_lld_init(config)
-
-/**
- * @brief Reads the physical I/O port states.
- *
- * @param[in] port port identifier
- * @return The port bits.
- *
- * @notapi
- */
-#define pal_lld_readport(port) (port)->PDIR
-
-/**
- * @brief Reads the output latch.
- * @details The purpose of this function is to read back the latched output
- * value.
- *
- * @param[in] port port identifier
- * @return The latched logical states.
- *
- * @notapi
- */
-#define pal_lld_readlatch(port) (port)->PDOR
-
-/**
- * @brief Writes a bits mask on a I/O port.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be written on the specified port
- *
- * @notapi
- */
-#define pal_lld_writeport(port, bits) (port)->PDOR = (bits)
-
-/**
- * @brief Sets a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be ORed on the specified port
- *
- * @notapi
- */
-#define pal_lld_setport(port, bits) (port)->PSOR = (bits)
-
-/**
- * @brief Clears a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be cleared on the specified port
- *
- * @notapi
- */
-#define pal_lld_clearport(port, bits) (port)->PCOR = (bits)
-
-/**
- * @brief Toggles a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be toggled on the specified port
- *
- * @notapi
- */
-#define pal_lld_toggleport(port, bits) (port)->PTOR = (bits)
-
-/**
- * @brief Reads a group of bits.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @return The group logical states.
- *
- * @notapi
- */
-#define pal_lld_readgroup(port, mask, offset) 0
-
-/**
- * @brief Writes a group of bits.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @param[in] bits bits to be written. Values exceeding the group width
- * are masked.
- *
- * @notapi
- */
-#define pal_lld_writegroup(port, mask, offset, bits) (void)bits
-
-/**
- * @brief Pads group mode setup.
- * @details This function programs a pads group belonging to the same port
- * with the specified mode.
- * @note Programming an unknown or unsupported mode is silently ignored.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @param[in] mode group mode
- *
- * @notapi
- */
-#define pal_lld_setgroupmode(port, mask, offset, mode) \
- _pal_lld_setgroupmode(port, mask << offset, mode)
-
-/**
- * @brief Reads a logical state from an I/O pad.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @return The logical state.
- * @retval PAL_LOW low logical state.
- * @retval PAL_HIGH high logical state.
- *
- * @notapi
- */
-#define pal_lld_readpad(port, pad) _pal_lld_readpad(port, pad)
-
-/**
- * @brief Writes a logical state on an output pad.
- * @note This function is not meant to be invoked directly by the
- * application code.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] bit logical value, the value must be @p PAL_LOW or
- * @p PAL_HIGH
- *
- * @notapi
- */
-#define pal_lld_writepad(port, pad, bit) _pal_lld_writepad(port, pad, bit)
-
-/**
- * @brief Sets a pad logical state to @p PAL_HIGH.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
-#define pal_lld_setpad(port, pad) (port)->PSOR = ((uint32_t) 1 << (pad))
-
-/**
- * @brief Clears a pad logical state to @p PAL_LOW.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
-#define pal_lld_clearpad(port, pad) (port)->PCOR = ((uint32_t) 1 << (pad))
-
-/**
- * @brief Toggles a pad logical state.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
-#define pal_lld_togglepad(port, pad) (port)->PTOR = ((uint32_t) 1 << (pad))
-
-/**
- * @brief Pad mode setup.
- * @details This function programs a pad with the specified mode.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- * @note Programming an unknown or unsupported mode is silently ignored.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] mode pad mode
- *
- * @notapi
- */
-#define pal_lld_setpadmode(port, pad, mode) \
- _pal_lld_setpadmode(port, pad, mode)
-
-#if !defined(__DOXYGEN__)
-extern const PALConfig pal_default_config;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void _pal_lld_init(const PALConfig *config);
- void _pal_lld_setgroupmode(ioportid_t port,
- ioportmask_t mask,
- iomode_t mode);
- void _pal_lld_setpadmode(ioportid_t port,
- uint8_t pad,
- iomode_t mode);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_PAL */
-
-#endif /* _PAL_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/platform.dox b/os/hal/ports/KINETIS/K20x/platform.dox
deleted file mode 100644
index 3fb142d2c..000000000
--- a/os/hal/ports/KINETIS/K20x/platform.dox
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/* TODO Still need to edit this entire file */
-
-/**
- * @defgroup MK20D5_DRIVERS MK20D5 Drivers
- * @details This section describes all the supported drivers on the MK20D5
- * platform and the implementation details of the single drivers.
- *
- * @ingroup platforms
- */
-
-/**
- * @defgroup MK20D5_HAL MK20D5 Initialization Support
- * @details The MK20D5 HAL support is responsible for system initialization.
- *
- * @section mk20d5_hal_1 Supported HW resources
- * - PLL1.
- * - PLL2.
- * - RCC.
- * - Flash.
- * .
- * @section mk20d5_hal_2 MK20D5 HAL driver implementation features
- * - PLL startup and stabilization.
- * - Clock tree initialization.
- * - Clock source selection.
- * - Flash wait states initialization based on the selected clock options.
- * - SYSTICK initialization based on current clock and kernel required rate.
- * - DMA support initialization.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_ADC MK20D5 ADC Support
- * @details The MK20D5 ADC driver supports the ADC peripherals using DMA
- * channels for maximum performance.
- *
- * @section mk20d5_adc_1 Supported HW resources
- * - ADC1.
- * - ADC2.
- * - ADC3.
- * - DMA2.
- * .
- * @section mk20d5_adc_2 MK20D5 ADC driver implementation features
- * - Clock stop for reduced power usage when the driver is in stop state.
- * - Streaming conversion using DMA for maximum performance.
- * - Programmable ADC interrupt priority level.
- * - Programmable DMA bus priority for each DMA channel.
- * - Programmable DMA interrupt priority for each DMA channel.
- * - DMA and ADC errors detection.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_CAN MK20D5 CAN Support
- * @details The MK20D5 CAN driver uses the CAN peripherals.
- *
- * @section mk20d5_can_1 Supported HW resources
- * - bxCAN1.
- * .
- * @section mk20d5_can_2 MK20D5 CAN driver implementation features
- * - Clock stop for reduced power usage when the driver is in stop state.
- * - Support for bxCAN sleep mode.
- * - Programmable bxCAN interrupts priority level.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_EXT MK20D5 EXT Support
- * @details The MK20D5 EXT driver uses the EXTI peripheral.
- *
- * @section mk20d5_ext_1 Supported HW resources
- * - EXTI.
- * .
- * @section mk20d5_ext_2 MK20D5 EXT driver implementation features
- * - Each EXTI channel can be independently enabled and programmed.
- * - Programmable EXTI interrupts priority level.
- * - Capability to work as event sources (WFE) rather than interrupt sources.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_GPT MK20D5 GPT Support
- * @details The MK20D5 GPT driver uses the TIMx peripherals.
- *
- * @section mk20d5_gpt_1 Supported HW resources
- * - TIM1.
- * - TIM2.
- * - TIM3.
- * - TIM4.
- * - TIM5.
- * - TIM8.
- * .
- * @section mk20d5_gpt_2 MK20D5 GPT driver implementation features
- * - Each timer can be independently enabled and programmed. Unused
- * peripherals are left in low power mode.
- * - Programmable TIMx interrupts priority level.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_ICU MK20D5 ICU Support
- * @details The MK20D5 ICU driver uses the TIMx peripherals.
- *
- * @section mk20d5_icu_1 Supported HW resources
- * - TIM1.
- * - TIM2.
- * - TIM3.
- * - TIM4.
- * - TIM5.
- * - TIM8.
- * .
- * @section mk20d5_icu_2 MK20D5 ICU driver implementation features
- * - Each timer can be independently enabled and programmed. Unused
- * peripherals are left in low power mode.
- * - Programmable TIMx interrupts priority level.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_MAC MK20D5 MAC Support
- * @details The MK20D5 MAC driver supports the ETH peripheral.
- *
- * @section mk20d5_mac_1 Supported HW resources
- * - ETH.
- * - PHY (external).
- * .
- * @section mk20d5_mac_2 MK20D5 MAC driver implementation features
- * - Dedicated DMA operations.
- * - Support for checksum off-loading.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_PAL MK20D5 PAL Support
- * @details The MK20D5 PAL driver uses the GPIO peripherals.
- *
- * @section mk20d5_pal_1 Supported HW resources
- * - GPIOA.
- * - GPIOB.
- * - GPIOC.
- * - GPIOD.
- * - GPIOE.
- * - GPIOF.
- * - GPIOG.
- * - GPIOH.
- * - GPIOI.
- * .
- * @section mk20d5_pal_2 MK20D5 PAL driver implementation features
- * The PAL driver implementation fully supports the following hardware
- * capabilities:
- * - 16 bits wide ports.
- * - Atomic set/reset functions.
- * - Atomic set+reset function (atomic bus operations).
- * - Output latched regardless of the pad setting.
- * - Direct read of input pads regardless of the pad setting.
- * .
- * @section mk20d5_pal_3 Supported PAL setup modes
- * The MK20D5 PAL driver supports the following I/O modes:
- * - @p PAL_MODE_RESET.
- * - @p PAL_MODE_UNCONNECTED.
- * - @p PAL_MODE_INPUT.
- * - @p PAL_MODE_INPUT_PULLUP.
- * - @p PAL_MODE_INPUT_PULLDOWN.
- * - @p PAL_MODE_INPUT_ANALOG.
- * - @p PAL_MODE_OUTPUT_PUSHPULL.
- * - @p PAL_MODE_OUTPUT_OPENDRAIN.
- * - @p PAL_MODE_ALTERNATE (non standard).
- * .
- * Any attempt to setup an invalid mode is ignored.
- *
- * @section mk20d5_pal_4 Suboptimal behavior
- * The MK20D5 GPIO is less than optimal in several areas, the limitations
- * should be taken in account while using the PAL driver:
- * - Pad/port toggling operations are not atomic.
- * - Pad/group mode setup is not atomic.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_PWM MK20D5 PWM Support
- * @details The MK20D5 PWM driver uses the TIMx peripherals.
- *
- * @section mk20d5_pwm_1 Supported HW resources
- * - TIM1.
- * - TIM2.
- * - TIM3.
- * - TIM4.
- * - TIM5.
- * - TIM8.
- * .
- * @section mk20d5_pwm_2 MK20D5 PWM driver implementation features
- * - Each timer can be independently enabled and programmed. Unused
- * peripherals are left in low power mode.
- * - Four independent PWM channels per timer.
- * - Programmable TIMx interrupts priority level.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_SDC MK20D5 SDC Support
- * @details The MK20D5 SDC driver uses the SDIO peripheral.
- *
- * @section mk20d5_sdc_1 Supported HW resources
- * - SDIO.
- * - DMA2.
- * .
- * @section mk20d5_sdc_2 MK20D5 SDC driver implementation features
- * - Clock stop for reduced power usage when the driver is in stop state.
- * - Programmable interrupt priority.
- * - DMA is used for receiving and transmitting.
- * - Programmable DMA bus priority for each DMA channel.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_SERIAL MK20D5 Serial Support
- * @details The MK20D5 Serial driver uses the USART/UART peripherals in a
- * buffered, interrupt driven, implementation.
- *
- * @section mk20d5_serial_1 Supported HW resources
- * The serial driver can support any of the following hardware resources:
- * - USART1.
- * - USART2.
- * - USART3.
- * - UART4.
- * - UART5.
- * - USART6.
- * .
- * @section mk20d5_serial_2 MK20D5 Serial driver implementation features
- * - Clock stop for reduced power usage when the driver is in stop state.
- * - Each UART/USART can be independently enabled and programmed. Unused
- * peripherals are left in low power mode.
- * - Fully interrupt driven.
- * - Programmable priority levels for each UART/USART.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_SPI MK20D5 SPI Support
- * @details The SPI driver supports the MK20D5 SPI peripherals using DMA
- * channels for maximum performance.
- *
- * @section mk20d5_spi_1 Supported HW resources
- * - SPI1.
- * - SPI2.
- * - SPI3.
- * - DMA1.
- * - DMA2.
- * .
- * @section mk20d5_spi_2 MK20D5 SPI driver implementation features
- * - Clock stop for reduced power usage when the driver is in stop state.
- * - Each SPI can be independently enabled and programmed. Unused
- * peripherals are left in low power mode.
- * - Programmable interrupt priority levels for each SPI.
- * - DMA is used for receiving and transmitting.
- * - Programmable DMA bus priority for each DMA channel.
- * - Programmable DMA interrupt priority for each DMA channel.
- * - Programmable DMA error hook.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_UART MK20D5 UART Support
- * @details The UART driver supports the MK20D5 USART peripherals using DMA
- * channels for maximum performance.
- *
- * @section mk20d5_uart_1 Supported HW resources
- * The UART driver can support any of the following hardware resources:
- * - USART1.
- * - USART2.
- * - USART3.
- * - DMA1.
- * - DMA2.
- * .
- * @section mk20d5_uart_2 MK20D5 UART driver implementation features
- * - Clock stop for reduced power usage when the driver is in stop state.
- * - Each UART/USART can be independently enabled and programmed. Unused
- * peripherals are left in low power mode.
- * - Programmable interrupt priority levels for each UART/USART.
- * - DMA is used for receiving and transmitting.
- * - Programmable DMA bus priority for each DMA channel.
- * - Programmable DMA interrupt priority for each DMA channel.
- * - Programmable DMA error hook.
- * .
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_PLATFORM_DRIVERS MK20D5 Platform Drivers
- * @details Platform support drivers. Platform drivers do not implement HAL
- * standard driver templates, their role is to support platform
- * specific functionalities.
- *
- * @ingroup MK20D5_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_DMA MK20D5 DMA Support
- * @details This DMA helper driver is used by the other drivers in order to
- * access the shared DMA resources in a consistent way.
- *
- * @section mk20d5_dma_1 Supported HW resources
- * The DMA driver can support any of the following hardware resources:
- * - DMA1.
- * - DMA2.
- * .
- * @section mk20d5_dma_2 MK20D5 DMA driver implementation features
- * - Exports helper functions/macros to the other drivers that share the
- * DMA resource.
- * - Automatic DMA clock stop when not in use by any driver.
- * - DMA streams and interrupt vectors sharing among multiple drivers.
- * .
- * @ingroup MK20D5_PLATFORM_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_ISR MK20D5 ISR Support
- * @details This ISR helper driver is used by the other drivers in order to
- * map ISR names to physical vector names.
- *
- * @ingroup MK20D5_PLATFORM_DRIVERS
- */
-
-/**
- * @defgroup MK20D5_RCC MK20D5 RCC Support
- * @details This RCC helper driver is used by the other drivers in order to
- * access the shared RCC resources in a consistent way.
- *
- * @section mk20d5_rcc_1 Supported HW resources
- * - RCC.
- * .
- * @section mk20d5_rcc_2 MK20D5 RCC driver implementation features
- * - Peripherals reset.
- * - Peripherals clock enable.
- * - Peripherals clock disable.
- * .
- * @ingroup MK20D5_PLATFORM_DRIVERS
- */
diff --git a/os/hal/ports/KINETIS/K20x/platform.mk b/os/hal/ports/KINETIS/K20x/platform.mk
deleted file mode 100644
index c7ae92d95..000000000
--- a/os/hal/ports/KINETIS/K20x/platform.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# List of all platform files.
-PLATFORMSRC = ${CHIBIOS}/os/hal/ports/common/ARMCMx/nvic.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/K20x/hal_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/K20x/pal_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/K20x/serial_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/K20x/spi_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/LLD/i2c_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/LLD/ext_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/LLD/adc_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/K20x/gpt_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/K20x/st_lld.c
-
-# Required include directories
-PLATFORMINC = ${CHIBIOS}/os/hal/ports/common/ARMCMx \
- ${CHIBIOS}/os/hal/ports/KINETIS/K20x \
- ${CHIBIOS}/os/hal/ports/KINETIS/LLD
diff --git a/os/hal/ports/KINETIS/K20x/serial_lld.c b/os/hal/ports/KINETIS/K20x/serial_lld.c
deleted file mode 100644
index 3b5f053f3..000000000
--- a/os/hal/ports/KINETIS/K20x/serial_lld.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file K20x/serial_lld.c
- * @brief Kinetis K20x Serial Driver subsystem low level driver source.
- *
- * @addtogroup SERIAL
- * @{
- */
-
-#include "osal.h"
-#include "hal.h"
-
-#if HAL_USE_SERIAL || defined(__DOXYGEN__)
-
-#include "mk20d5.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/**
- * @brief SD1 driver identifier.
- */
-#if KINETIS_SERIAL_USE_UART0 || defined(__DOXYGEN__)
-SerialDriver SD1;
-#endif
-
-#if KINETIS_SERIAL_USE_UART1 || defined(__DOXYGEN__)
-SerialDriver SD2;
-#endif
-
-#if KINETIS_SERIAL_USE_UART2 || defined(__DOXYGEN__)
-SerialDriver SD3;
-#endif
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/**
- * @brief Driver default configuration.
- */
-static const SerialConfig default_config = {
- 38400
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/**
- * @brief Common IRQ handler.
- * @note Tries hard to clear all the pending interrupt sources, we don't
- * want to go through the whole ISR and have another interrupt soon
- * after.
- *
- * @param[in] u pointer to an UART I/O block
- * @param[in] sdp communication channel associated to the UART
- */
-static void serve_interrupt(SerialDriver *sdp) {
- UART_TypeDef *u = sdp->uart;
- uint8_t s1 = u->S1;
-
- if (s1 & UARTx_S1_RDRF) {
- osalSysLockFromISR();
- if (iqIsEmptyI(&sdp->iqueue))
- chnAddFlagsI(sdp, CHN_INPUT_AVAILABLE);
- if (iqPutI(&sdp->iqueue, u->D) < MSG_OK)
- chnAddFlagsI(sdp, SD_OVERRUN_ERROR);
- osalSysUnlockFromISR();
- }
-
- if (s1 & UARTx_S1_TDRE) {
- msg_t b;
-
- osalSysLockFromISR();
- b = oqGetI(&sdp->oqueue);
- osalSysUnlockFromISR();
-
- if (b < MSG_OK) {
- osalSysLockFromISR();
- chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
- osalSysUnlockFromISR();
- u->C2 &= ~UARTx_C2_TIE;
- } else {
- u->D = b;
- }
- }
-}
-
-/**
- * @brief Attempts a TX preload
- */
-static void preload(SerialDriver *sdp) {
- UART_TypeDef *u = sdp->uart;
-
- if (u->S1 & UARTx_S1_TDRE) {
- msg_t b = oqGetI(&sdp->oqueue);
- if (b < MSG_OK) {
- chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
- return;
- }
- u->D = b;
- u->C2 |= UARTx_C2_TIE;
- }
-}
-
-/**
- * @brief Driver output notification.
- */
-#if KINETIS_SERIAL_USE_UART0 || defined(__DOXYGEN__)
-static void notify1(io_queue_t *qp)
-{
- (void)qp;
- preload(&SD1);
-}
-#endif
-
-#if KINETIS_SERIAL_USE_UART1 || defined(__DOXYGEN__)
-static void notify2(io_queue_t *qp)
-{
- (void)qp;
- preload(&SD2);
-}
-#endif
-
-#if KINETIS_SERIAL_USE_UART2 || defined(__DOXYGEN__)
-static void notify3(io_queue_t *qp)
-{
- (void)qp;
- preload(&SD3);
-}
-#endif
-
-/**
- * @brief Common UART configuration.
- *
- */
-static void configure_uart(UART_TypeDef *uart, const SerialConfig *config)
-{
- uint32_t divisor = (KINETIS_SYSCLK_FREQUENCY * 2 + 1) / config->sc_speed;
-
- /* Disable UART while configuring */
- uart->C2 &= ~(UARTx_C2_RE | UARTx_C2_TE);
- uart->C1 = 0;
-
- uart->BDH = UARTx_BDH_SBR(divisor >> 13) | (uart->BDH & ~UARTx_BDH_SBR_MASK);
- uart->BDL = divisor >> 5;
- uart->C4 = UARTx_C4_BRFA(divisor) | (uart->C4 & ~UARTx_C4_BRFA_MASK);
-
- uart->C2 |= UARTx_C2_RE | UARTx_C2_RIE | UARTx_C2_TE;
- uart->C3 = UARTx_C3_ORIE | UARTx_C3_NEIE | UARTx_C3_FEIE | UARTx_C3_PEIE;
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/* TODO:
- * UART0_Error is Vector84
- * UART1_Error is Vector8C
- * UART2_Error is Vector94
- */
-
-#if KINETIS_SERIAL_USE_UART0 || defined(__DOXYGEN__)
-OSAL_IRQ_HANDLER(Vector80) {
-
- OSAL_IRQ_PROLOGUE();
- serve_interrupt(&SD1);
- OSAL_IRQ_EPILOGUE();
-}
-#endif
-
-#if KINETIS_SERIAL_USE_UART1 || defined(__DOXYGEN__)
-OSAL_IRQ_HANDLER(Vector88) {
-
- OSAL_IRQ_PROLOGUE();
- serve_interrupt(&SD2);
- OSAL_IRQ_EPILOGUE();
-}
-#endif
-
-#if KINETIS_SERIAL_USE_UART2 || defined(__DOXYGEN__)
-OSAL_IRQ_HANDLER(Vector90) {
-
- OSAL_IRQ_PROLOGUE();
- serve_interrupt(&SD3);
- OSAL_IRQ_EPILOGUE();
-}
-#endif
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level serial driver initialization.
- *
- * @notapi
- */
-void sd_lld_init(void) {
-
-#if KINETIS_SERIAL_USE_UART0
- /* Driver initialization.*/
- sdObjectInit(&SD1, NULL, notify1);
- SD1.uart = UART0;
-#endif
-
-#if KINETIS_SERIAL_USE_UART1
- /* Driver initialization.*/
- sdObjectInit(&SD2, NULL, notify2);
- SD2.uart = UART1;
-#endif
-
-#if KINETIS_SERIAL_USE_UART2
- /* Driver initialization.*/
- sdObjectInit(&SD3, NULL, notify3);
- SD3.uart = UART2;
-#endif
-}
-
-/**
- * @brief Low level serial driver configuration and (re)start.
- *
- * @param[in] sdp pointer to a @p SerialDriver object
- * @param[in] config the architecture-dependent serial driver configuration.
- * If this parameter is set to @p NULL then a default
- * configuration is used.
- *
- * @notapi
- */
-void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) {
-
- if (config == NULL)
- config = &default_config;
-
- if (sdp->state == SD_STOP) {
- /* Enables the peripheral.*/
-
-#if KINETIS_SERIAL_USE_UART0
- if (sdp == &SD1) {
- SIM->SCGC4 |= SIM_SCGC4_UART0;
- configure_uart(sdp->uart, config);
- nvicEnableVector(UART0Status_IRQn, KINETIS_SERIAL_UART0_PRIORITY);
- }
-#endif /* KINETIS_SERIAL_USE_UART0 */
-
-#if KINETIS_SERIAL_USE_UART1
- if (sdp == &SD2) {
- SIM->SCGC4 |= SIM_SCGC4_UART1;
- configure_uart(sdp->uart, config);
- nvicEnableVector(UART1Status_IRQn, KINETIS_SERIAL_UART1_PRIORITY);
- }
-#endif /* KINETIS_SERIAL_USE_UART1 */
-
-#if KINETIS_SERIAL_USE_UART2
- if (sdp == &SD3) {
- SIM->SCGC4 |= SIM_SCGC4_UART2;
- configure_uart(sdp->uart, config);
- nvicEnableVector(UART2Status_IRQn, KINETIS_SERIAL_UART2_PRIORITY);
- }
-#endif /* KINETIS_SERIAL_USE_UART2 */
-
- }
- /* Configures the peripheral.*/
-
-}
-
-/**
- * @brief Low level serial driver stop.
- * @details De-initializes the USART, stops the associated clock, resets the
- * interrupt vector.
- *
- * @param[in] sdp pointer to a @p SerialDriver object
- *
- * @notapi
- */
-void sd_lld_stop(SerialDriver *sdp) {
-
- if (sdp->state == SD_READY) {
- /* TODO: Resets the peripheral.*/
-
-#if KINETIS_SERIAL_USE_UART0
- if (sdp == &SD1) {
- nvicDisableVector(UART0Status_IRQn);
- SIM->SCGC4 &= ~SIM_SCGC4_UART0;
- }
-#endif
-
-#if KINETIS_SERIAL_USE_UART1
- if (sdp == &SD2) {
- nvicDisableVector(UART1Status_IRQn);
- SIM->SCGC4 &= ~SIM_SCGC4_UART1;
- }
-#endif
-
-#if KINETIS_SERIAL_USE_UART2
- if (sdp == &SD3) {
- nvicDisableVector(UART2Status_IRQn);
- SIM->SCGC4 &= ~SIM_SCGC4_UART2;
- }
-#endif
- }
-}
-
-#endif /* HAL_USE_SERIAL */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/serial_lld.h b/os/hal/ports/KINETIS/K20x/serial_lld.h
deleted file mode 100644
index 736cfe3ce..000000000
--- a/os/hal/ports/KINETIS/K20x/serial_lld.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file K20x/serial_lld.h
- * @brief Kinetis K20x Serial Driver subsystem low level driver header.
- *
- * @addtogroup SERIAL
- * @{
- */
-
-#ifndef _SERIAL_LLD_H_
-#define _SERIAL_LLD_H_
-
-#if HAL_USE_SERIAL || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief SD1 driver enable switch.
- * @details If set to @p TRUE the support for SD1 is included.
- */
-#if !defined(KINETIS_SERIAL_USE_UART0) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_USE_UART0 FALSE
-#endif
-/**
- * @brief SD2 driver enable switch.
- * @details If set to @p TRUE the support for SD2 is included.
- */
-#if !defined(KINETIS_SERIAL_USE_UART1) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_USE_UART1 FALSE
-#endif
-/**
- * @brief SD3 driver enable switch.
- * @details If set to @p TRUE the support for SD3 is included.
- */
-#if !defined(KINETIS_SERIAL_USE_UART2) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_USE_UART2 FALSE
-#endif
-
-/**
- * @brief UART0 interrupt priority level setting.
- */
-#if !defined(KINETIS_SERIAL_UART0_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_UART0_PRIORITY 12
-#endif
-
-/**
- * @brief UART1 interrupt priority level setting.
- */
-#if !defined(KINETIS_SERIAL_UART1_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_UART1_PRIORITY 12
-#endif
-
-/**
- * @brief UART2 interrupt priority level setting.
- */
-#if !defined(KINETIS_SERIAL_UART2_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_UART2_PRIORITY 12
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief Generic Serial Driver configuration structure.
- * @details An instance of this structure must be passed to @p sdStart()
- * in order to configure and start a serial driver operations.
- * @note Implementations may extend this structure to contain more,
- * architecture dependent, fields.
- */
-typedef struct {
- /**
- * @brief Bit rate.
- */
- uint32_t sc_speed;
- /* End of the mandatory fields.*/
-} SerialConfig;
-
-/**
- * @brief @p SerialDriver specific data.
- */
-#define _serial_driver_data \
- _base_asynchronous_channel_data \
- /* Driver state.*/ \
- sdstate_t state; \
- /* Input queue.*/ \
- input_queue_t iqueue; \
- /* Output queue.*/ \
- output_queue_t oqueue; \
- /* Input circular buffer.*/ \
- uint8_t ib[SERIAL_BUFFERS_SIZE]; \
- /* Output circular buffer.*/ \
- uint8_t ob[SERIAL_BUFFERS_SIZE]; \
- /* End of the mandatory fields.*/ \
- /* Pointer to the UART registers block.*/ \
- UART_TypeDef *uart;
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if KINETIS_SERIAL_USE_UART0 && !defined(__DOXYGEN__)
-extern SerialDriver SD1;
-#endif
-
-#if KINETIS_SERIAL_USE_UART1 && !defined(__DOXYGEN__)
-extern SerialDriver SD2;
-#endif
-
-#if KINETIS_SERIAL_USE_UART2 && !defined(__DOXYGEN__)
-extern SerialDriver SD3;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void sd_lld_init(void);
- void sd_lld_start(SerialDriver *sdp, const SerialConfig *config);
- void sd_lld_stop(SerialDriver *sdp);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_SERIAL */
-
-#endif /* _SERIAL_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/spi_lld.c b/os/hal/ports/KINETIS/K20x/spi_lld.c
deleted file mode 100644
index 132580f21..000000000
--- a/os/hal/ports/KINETIS/K20x/spi_lld.c
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/spi_lld.c
- * @brief KINETIS SPI subsystem low level driver source.
- *
- * @addtogroup SPI
- * @{
- */
-
-#include "hal.h"
-
-#if HAL_USE_SPI || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-#if !defined(KINETIS_SPI_USE_SPI0)
-#define KINETIS_SPI_USE_SPI0 TRUE
-#endif
-
-#if !defined(KINETIS_SPI0_RX_DMA_IRQ_PRIORITY)
-#define KINETIS_SPI0_RX_DMA_IRQ_PRIORITY 8
-#endif
-
-#if !defined(KINETIS_SPI0_RX_DMAMUX_CHANNEL)
-#define KINETIS_SPI0_RX_DMAMUX_CHANNEL 0
-#endif
-
-#if !defined(KINETIS_SPI0_RX_DMA_CHANNEL)
-#define KINETIS_SPI0_RX_DMA_CHANNEL 0
-#endif
-
-#if !defined(KINETIS_SPI0_TX_DMAMUX_CHANNEL)
-#define KINETIS_SPI0_TX_DMAMUX_CHANNEL 1
-#endif
-
-#if !defined(KINETIS_SPI0_TX_DMA_CHANNEL)
-#define KINETIS_SPI0_TX_DMA_CHANNEL 1
-#endif
-
-#define DMAMUX_SPI_RX_SOURCE 16
-#define DMAMUX_SPI_TX_SOURCE 17
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/** @brief SPI0 driver identifier.*/
-#if KINETIS_SPI_USE_SPI0 || defined(__DOXYGEN__)
-SPIDriver SPID1;
-#endif
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/* Use a dummy byte as the source/destination when a buffer is not provided */
-/* Note: The MMC driver relies on 0xFF being sent for dummy bytes. */
-static volatile uint16_t dmaRxDummy;
-static uint16_t dmaTxDummy = 0xFFFF;
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static void spi_start_xfer(SPIDriver *spip, bool polling)
-{
- /*
- * Enable the DSPI peripheral in master mode.
- * Clear the TX and RX FIFOs.
- * */
- spip->spi->MCR = SPIx_MCR_MSTR | SPIx_MCR_CLR_TXF | SPIx_MCR_CLR_RXF;
-
- /* If we are not polling then enable DMA */
- if (!polling) {
-
- /* Enable receive dma and transmit dma */
- spip->spi->RSER = SPIx_RSER_RFDF_DIRS | SPIx_RSER_RFDF_RE |
- SPIx_RSER_TFFF_RE | SPIx_RSER_TFFF_DIRS;
-
- /* Configure RX DMA */
- if (spip->rxbuf) {
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].DADDR = (uint32_t)spip->rxbuf;
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].DOFF = spip->word_size;
- } else {
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].DADDR = (uint32_t)&dmaRxDummy;
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].DOFF = 0;
- }
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].BITER_ELINKNO = spip->count;
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].CITER_ELINKNO = spip->count;
-
- /* Enable Request Register (ERQ) for RX by writing 0 to SERQ */
- DMA->SERQ = KINETIS_SPI0_RX_DMA_CHANNEL;
-
- /* Configure TX DMA */
- if (spip->txbuf) {
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].SADDR = (uint32_t)spip->txbuf;
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].SOFF = spip->word_size;
- } else {
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].SADDR = (uint32_t)&dmaTxDummy;
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].SOFF = 0;
- }
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].BITER_ELINKNO = spip->count;
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].CITER_ELINKNO = spip->count;
-
- /* Enable Request Register (ERQ) for TX by writing 1 to SERQ */
- DMA->SERQ = KINETIS_SPI0_TX_DMA_CHANNEL;
- }
-}
-
-static void spi_stop_xfer(SPIDriver *spip)
-{
- /* Halt the DSPI peripheral */
- spip->spi->MCR = SPIx_MCR_MSTR | SPIx_MCR_HALT;
-
- /* Clear all the flags which are currently set. */
- spip->spi->SR |= spip->spi->SR;
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-OSAL_IRQ_HANDLER(Vector40) {
- OSAL_IRQ_PROLOGUE();
-
- /* Clear bit 0 in Interrupt Request Register (INT) by writing 0 to CINT */
- DMA->CINT = KINETIS_SPI0_RX_DMA_CHANNEL;
-
- spi_stop_xfer(&SPID1);
-
- _spi_isr_code(&SPID1);
-
- OSAL_IRQ_EPILOGUE();
-}
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level SPI driver initialization.
- *
- * @notapi
- */
-void spi_lld_init(void) {
-#if KINETIS_SPI_USE_SPI0
- spiObjectInit(&SPID1);
-#endif
-}
-
-/**
- * @brief Configures and activates the SPI peripheral.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- *
- * @notapi
- */
-void spi_lld_start(SPIDriver *spip) {
-
- /* If in stopped state then enables the SPI and DMA clocks.*/
- if (spip->state == SPI_STOP) {
-
-#if KINETIS_SPI_USE_SPI0
- if (&SPID1 == spip) {
-
- /* Enable the clock for SPI0 */
- SIM->SCGC6 |= SIM_SCGC6_SPI0;
-
- SPID1.spi = SPI0;
-
- if (spip->config->tar0) {
- spip->spi->CTAR[0] = spip->config->tar0;
- } else {
- spip->spi->CTAR[0] = KINETIS_SPI_TAR0_DEFAULT;
- }
- }
-#endif
-
- nvicEnableVector(DMA0_IRQn, KINETIS_SPI0_RX_DMA_IRQ_PRIORITY);
-
- SIM->SCGC6 |= SIM_SCGC6_DMAMUX;
- SIM->SCGC7 |= SIM_SCGC7_DMA;
-
- /* Clear DMA error flags */
- DMA->ERR = 0x0F;
-
- /* Rx, select SPI Rx FIFO */
- DMAMUX->CHCFG[KINETIS_SPI0_RX_DMAMUX_CHANNEL] = DMAMUX_CHCFGn_ENBL |
- DMAMUX_CHCFGn_SOURCE(DMAMUX_SPI_RX_SOURCE);
-
- /* Tx, select SPI Tx FIFO */
- DMAMUX->CHCFG[KINETIS_SPI0_TX_DMAMUX_CHANNEL] = DMAMUX_CHCFGn_ENBL |
- DMAMUX_CHCFGn_SOURCE(DMAMUX_SPI_TX_SOURCE);
-
- /* Extract the frame size from the TAR */
- uint16_t frame_size = ((spip->spi->CTAR[0] >> SPIx_CTARn_FMSZ_SHIFT) &
- SPIx_CTARn_FMSZ_MASK) + 1;
-
- /* DMA transfer size is 16 bits for a frame size > 8 bits */
- uint16_t dma_size = frame_size > 8 ? 1 : 0;
-
- /* DMA word size is 2 for a 16 bit frame size */
- spip->word_size = frame_size > 8 ? 2 : 1;
-
- /* configure DMA RX fixed values */
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].SADDR = (uint32_t)&SPI0->POPR;
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].SOFF = 0;
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].SLAST = 0;
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].DLASTSGA = 0;
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].ATTR = DMA_ATTR_SSIZE(dma_size) |
- DMA_ATTR_DSIZE(dma_size);
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].NBYTES_MLNO = spip->word_size;
- DMA->TCD[KINETIS_SPI0_RX_DMA_CHANNEL].CSR = DMA_CSR_DREQ_MASK |
- DMA_CSR_INTMAJOR_MASK;
-
- /* configure DMA TX fixed values */
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].SLAST = 0;
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].DADDR = (uint32_t)&SPI0->PUSHR;
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].DOFF = 0;
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].DLASTSGA = 0;
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].ATTR = DMA_ATTR_SSIZE(dma_size) |
- DMA_ATTR_DSIZE(dma_size);
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].NBYTES_MLNO = spip->word_size;
- DMA->TCD[KINETIS_SPI0_TX_DMA_CHANNEL].CSR = DMA_CSR_DREQ_MASK;
- }
-}
-
-/**
- * @brief Deactivates the SPI peripheral.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- *
- * @notapi
- */
-void spi_lld_stop(SPIDriver *spip) {
-
- /* If in ready state then disables the SPI clock.*/
- if (spip->state == SPI_READY) {
-
- nvicDisableVector(DMA0_IRQn);
-
- SIM->SCGC7 &= ~SIM_SCGC7_DMA;
- SIM->SCGC6 &= ~SIM_SCGC6_DMAMUX;
-
-#if KINETIS_SPI_USE_SPI0
- if (&SPID1 == spip) {
- /* SPI halt.*/
- spip->spi->MCR |= SPIx_MCR_HALT;
- }
-#endif
-
- /* Disable the clock for SPI0 */
- SIM->SCGC6 &= ~SIM_SCGC6_SPI0;
- }
-}
-
-/**
- * @brief Asserts the slave select signal and prepares for transfers.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- *
- * @notapi
- */
-void spi_lld_select(SPIDriver *spip) {
-
- palClearPad(spip->config->ssport, spip->config->sspad);
-}
-
-/**
- * @brief Deasserts the slave select signal.
- * @details The previously selected peripheral is unselected.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- *
- * @notapi
- */
-void spi_lld_unselect(SPIDriver *spip) {
-
- palSetPad(spip->config->ssport, spip->config->sspad);
-}
-
-/**
- * @brief Ignores data on the SPI bus.
- * @details This asynchronous function starts the transmission of a series of
- * idle words on the SPI bus and ignores the received data.
- * @post At the end of the operation the configured callback is invoked.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- * @param[in] n number of words to be ignored
- *
- * @notapi
- */
-void spi_lld_ignore(SPIDriver *spip, size_t n) {
-
- spip->count = n;
- spip->rxbuf = NULL;
- spip->txbuf = NULL;
-
- spi_start_xfer(spip, false);
-}
-
-/**
- * @brief Exchanges data on the SPI bus.
- * @details This asynchronous function starts a simultaneous transmit/receive
- * operation.
- * @post At the end of the operation the configured callback is invoked.
- * @note The buffers are organized as uint8_t arrays for data sizes below or
- * equal to 8 bits else it is organized as uint16_t arrays.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- * @param[in] n number of words to be exchanged
- * @param[in] txbuf the pointer to the transmit buffer
- * @param[out] rxbuf the pointer to the receive buffer
- *
- * @notapi
- */
-void spi_lld_exchange(SPIDriver *spip, size_t n,
- const void *txbuf, void *rxbuf) {
-
- spip->count = n;
- spip->rxbuf = rxbuf;
- spip->txbuf = txbuf;
-
- spi_start_xfer(spip, false);
-}
-
-/**
- * @brief Sends data over the SPI bus.
- * @details This asynchronous function starts a transmit operation.
- * @post At the end of the operation the configured callback is invoked.
- * @note The buffers are organized as uint8_t arrays for data sizes below or
- * equal to 8 bits else it is organized as uint16_t arrays.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- * @param[in] n number of words to send
- * @param[in] txbuf the pointer to the transmit buffer
- *
- * @notapi
- */
-void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) {
-
- spip->count = n;
- spip->rxbuf = NULL;
- spip->txbuf = (void *)txbuf;
-
- spi_start_xfer(spip, false);
-}
-
-/**
- * @brief Receives data from the SPI bus.
- * @details This asynchronous function starts a receive operation.
- * @post At the end of the operation the configured callback is invoked.
- * @note The buffers are organized as uint8_t arrays for data sizes below or
- * equal to 8 bits else it is organized as uint16_t arrays.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- * @param[in] n number of words to receive
- * @param[out] rxbuf the pointer to the receive buffer
- *
- * @notapi
- */
-void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) {
-
- spip->count = n;
- spip->rxbuf = rxbuf;
- spip->txbuf = NULL;
-
- spi_start_xfer(spip, false);
-}
-
-/**
- * @brief Exchanges one frame using a polled wait.
- * @details This synchronous function exchanges one frame using a polled
- * synchronization method. This function is useful when exchanging
- * small amount of data on high speed channels, usually in this
- * situation is much more efficient just wait for completion using
- * polling than suspending the thread waiting for an interrupt.
- *
- * @param[in] spip pointer to the @p SPIDriver object
- * @param[in] frame the data frame to send over the SPI bus
- * @return The received data frame from the SPI bus.
- */
-uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) {
-
- spi_start_xfer(spip, true);
-
- spip->spi->PUSHR = SPIx_PUSHR_TXDATA(frame);
-
- while ((spip->spi->SR & SPIx_SR_RFDF) == 0)
- ;
-
- frame = spip->spi->POPR;
-
- spi_stop_xfer(spip);
-
- return frame;
-}
-
-#endif /* HAL_USE_SPI */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/spi_lld.h b/os/hal/ports/KINETIS/K20x/spi_lld.h
deleted file mode 100644
index 23c6812b5..000000000
--- a/os/hal/ports/KINETIS/K20x/spi_lld.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/spi_lld.h
- * @brief KINETIS SPI subsystem low level driver header.
- *
- * @addtogroup SPI
- * @{
- */
-
-#ifndef _SPI_LLD_H_
-#define _SPI_LLD_H_
-
-#if HAL_USE_SPI || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief SPI0 driver enable switch.
- * @details If set to @p TRUE the support for SPI0 is included.
- * @note The default is @p FALSE.
- */
-#if !defined(KINETIS_SPI_USE_SPI0) || defined(__DOXYGEN__)
-#define KINETIS_SPI_USE_SPI0 FALSE
-#endif
-
-/**
- * @brief SPI0 interrupt priority level setting.
- */
-#if !defined(KINETIS_SPI_SPI0_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_SPI_SPI0_IRQ_PRIORITY 10
-#endif
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-#define KINETIS_HAS_SPI0 TRUE
-
-#if KINETIS_SPI_USE_SPI0 && !KINETIS_HAS_SPI0
-#error "SPI0 not present in the selected device"
-#endif
-
-#if !KINETIS_SPI_USE_SPI0
-#error "SPI driver activated but no SPI peripheral assigned"
-#endif
-
-#if KINETIS_SPI_USE_SPI0 && \
- !OSAL_IRQ_IS_VALID_PRIORITY(KINETIS_SPI_SPI0_IRQ_PRIORITY)
-#error "Invalid IRQ priority assigned to SPI0"
-#endif
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type of a structure representing an SPI driver.
- */
-typedef struct SPIDriver SPIDriver;
-
-/**
- * @brief SPI notification callback type.
- *
- * @param[in] spip pointer to the @p SPIDriver object triggering the
- * callback
- */
-typedef void (*spicallback_t)(SPIDriver *spip);
-
-/**
- * @brief Driver configuration structure.
- */
-typedef struct {
- /**
- * @brief Operation complete callback or @p NULL.
- */
- spicallback_t end_cb;
- /* End of the mandatory fields.*/
- /**
- * @brief The chip select line port - when not using pcs.
- */
- ioportid_t ssport;
- /**
- * @brief The chip select line pad number - when not using pcs.
- */
- uint16_t sspad;
- /**
- * @brief SPI initialization data.
- */
- uint32_t tar0;
-} SPIConfig;
-
-/**
- * @brief Structure representing a SPI driver.
- */
-struct SPIDriver {
- /**
- * @brief Driver state.
- */
- spistate_t state;
- /**
- * @brief Current configuration data.
- */
- const SPIConfig *config;
-#if SPI_USE_WAIT || defined(__DOXYGEN__)
- /**
- * @brief Waiting thread.
- */
- thread_reference_t thread;
-#endif /* SPI_USE_WAIT */
-#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__)
- /**
- * @brief Mutex protecting the bus.
- */
- mutex_t mutex;
-#endif /* SPI_USE_MUTUAL_EXCLUSION */
-#if defined(SPI_DRIVER_EXT_FIELDS)
- SPI_DRIVER_EXT_FIELDS
-#endif
- /* End of the mandatory fields.*/
- /**
- * @brief Pointer to the SPIx registers block.
- */
- SPI_TypeDef *spi;
- /**
- * @brief Number of bytes/words of data to transfer.
- */
- size_t count;
- /**
- * @brief Word size in bytes.
- */
- size_t word_size;
- /**
- * @brief Pointer to the buffer with data to send.
- */
- const uint8_t *txbuf;
- /**
- * @brief Pointer to the buffer to put received data.
- */
- uint8_t *rxbuf;
-};
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/* TAR settings for n bits at SYSCLK / 2 */
-#define KINETIS_SPI_TAR_SYSCLK_DIV_2(n)\
- SPIx_CTARn_FMSZ((n) - 1) | \
- SPIx_CTARn_CPOL | \
- SPIx_CTARn_CPHA | \
- SPIx_CTARn_DBR | \
- SPIx_CTARn_PBR(0) | \
- SPIx_CTARn_BR(0) | \
- SPIx_CTARn_CSSCK(0) | \
- SPIx_CTARn_ASC(0) | \
- SPIx_CTARn_DT(0)
-
-/* TAR settings for n bits at SYSCLK / 4096 for debugging */
-#define KINETIS_SPI_TAR_SYSCLK_DIV_4096(n) \
- SPIx_CTARn_FMSZ(((n) - 1)) | \
- SPIx_CTARn_CPOL | \
- SPIx_CTARn_CPHA | \
- SPIx_CTARn_PBR(0) | \
- SPIx_CTARn_BR(0xB) | \
- SPIx_CTARn_CSSCK(0xB) | \
- SPIx_CTARn_ASC(0x7) | \
- SPIx_CTARn_DT(0xB)
-
-#define KINETIS_SPI_TAR_8BIT_FAST KINETIS_SPI_TAR_SYSCLK_DIV_2(8)
-#define KINETIS_SPI_TAR_8BIT_SLOW KINETIS_SPI_TAR_SYSCLK_DIV_4096(8)
-
-#define KINETIS_SPI_TAR0_DEFAULT KINETIS_SPI_TAR_SYSCLK_DIV_2(8)
-#define KINETIS_SPI_TAR1_DEFAULT KINETIS_SPI_TAR_SYSCLK_DIV_2(8)
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if KINETIS_SPI_USE_SPI0 && !defined(__DOXYGEN__)
-extern SPIDriver SPID1;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void spi_lld_init(void);
- void spi_lld_start(SPIDriver *spip);
- void spi_lld_stop(SPIDriver *spip);
- void spi_lld_select(SPIDriver *spip);
- void spi_lld_unselect(SPIDriver *spip);
- void spi_lld_ignore(SPIDriver *spip, size_t n);
- void spi_lld_exchange(SPIDriver *spip, size_t n,
- const void *txbuf, void *rxbuf);
- void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf);
- void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf);
- uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_SPI */
-
-#endif /* _SPI_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/st_lld.c b/os/hal/ports/KINETIS/K20x/st_lld.c
deleted file mode 100644
index 1f8cb6320..000000000
--- a/os/hal/ports/KINETIS/K20x/st_lld.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/KL2x/st_lld.c
- * @brief ST Driver subsystem low level driver code.
- *
- * @addtogroup ST
- * @{
- */
-
-#include "hal.h"
-
-#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-#if (OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC) || defined(__DOXYGEN__)
-/**
- * @brief System Timer vector.
- * @details This interrupt is used for system tick in periodic mode.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(SysTick_Handler) {
-
- OSAL_IRQ_PROLOGUE();
-
- osalSysLockFromISR();
- osalOsTimerHandlerI();
- osalSysUnlockFromISR();
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level ST driver initialization.
- *
- * @notapi
- */
-void st_lld_init(void) {
-#if OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC
- /* Periodic systick mode, the Cortex-Mx internal systick timer is used
- in this mode.*/
- SysTick->LOAD = (KINETIS_SYSCLK_FREQUENCY / OSAL_ST_FREQUENCY) - 1;
- SysTick->VAL = 0;
- SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
- SysTick_CTRL_ENABLE_Msk |
- SysTick_CTRL_TICKINT_Msk;
-
- /* IRQ enabled.*/
- nvicSetSystemHandlerPriority(HANDLER_SYSTICK, KINETIS_ST_IRQ_PRIORITY);
-#endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */
-}
-
-#endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/K20x/st_lld.h b/os/hal/ports/KINETIS/K20x/st_lld.h
deleted file mode 100644
index 24044e5f7..000000000
--- a/os/hal/ports/KINETIS/K20x/st_lld.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/st_lld.h
- * @brief ST Driver subsystem low level driver header.
- * @details This header is designed to be include-able without having to
- * include other files from the HAL.
- *
- * @addtogroup ST
- * @{
- */
-
-#ifndef _ST_LLD_H_
-#define _ST_LLD_H_
-
-#include "mcuconf.h"
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief SysTick timer IRQ priority.
- */
-#if !defined(KINETIS_ST_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_ST_IRQ_PRIORITY 8
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void st_lld_init(void);
-#ifdef __cplusplus
-}
-#endif
-
-/*===========================================================================*/
-/* Driver inline functions. */
-/*===========================================================================*/
-
-/**
- * @brief Returns the time counter value.
- *
- * @return The counter value.
- *
- * @notapi
- */
-static inline systime_t st_lld_get_counter(void) {
-
- return (systime_t)0;
-}
-
-/**
- * @brief Starts the alarm.
- * @note Makes sure that no spurious alarms are triggered after
- * this call.
- *
- * @param[in] time the time to be set for the first alarm
- *
- * @notapi
- */
-static inline void st_lld_start_alarm(systime_t time) {
-
- (void)time;
-}
-
-/**
- * @brief Stops the alarm interrupt.
- *
- * @notapi
- */
-static inline void st_lld_stop_alarm(void) {
-
-}
-
-/**
- * @brief Sets the alarm time.
- *
- * @param[in] time the time to be set for the next alarm
- *
- * @notapi
- */
-static inline void st_lld_set_alarm(systime_t time) {
-
- (void)time;
-}
-
-/**
- * @brief Returns the current alarm time.
- *
- * @return The currently set alarm time.
- *
- * @notapi
- */
-static inline systime_t st_lld_get_alarm(void) {
-
- return (systime_t)0;
-}
-
-/**
- * @brief Determines if the alarm is active.
- *
- * @return The alarm status.
- * @retval false if the alarm is not active.
- * @retval true is the alarm is active
- *
- * @notapi
- */
-static inline bool st_lld_is_alarm_active(void) {
-
- return false;
-}
-
-#endif /* _ST_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/hal_lld.c b/os/hal/ports/KINETIS/KL2x/hal_lld.c
deleted file mode 100644
index dce158811..000000000
--- a/os/hal/ports/KINETIS/KL2x/hal_lld.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2013-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/hal_lld.c
- * @brief Kinetis KL2x HAL Driver subsystem low level driver source.
- *
- * @addtogroup HAL
- * @{
- */
-
-#include "osal.h"
-#include "hal.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-#ifdef __CC_ARM
-__attribute__ ((section(".ARM.__at_0x400")))
-#else
-__attribute__ ((used, section(".cfmconfig")))
-#endif
-const uint8_t _cfm[0x10] = {
- 0xFF, /* NV_BACKKEY3: KEY=0xFF */
- 0xFF, /* NV_BACKKEY2: KEY=0xFF */
- 0xFF, /* NV_BACKKEY1: KEY=0xFF */
- 0xFF, /* NV_BACKKEY0: KEY=0xFF */
- 0xFF, /* NV_BACKKEY7: KEY=0xFF */
- 0xFF, /* NV_BACKKEY6: KEY=0xFF */
- 0xFF, /* NV_BACKKEY5: KEY=0xFF */
- 0xFF, /* NV_BACKKEY4: KEY=0xFF */
- 0xFF, /* NV_FPROT3: PROT=0xFF */
- 0xFF, /* NV_FPROT2: PROT=0xFF */
- 0xFF, /* NV_FPROT1: PROT=0xFF */
- 0xFF, /* NV_FPROT0: PROT=0xFF */
- 0x7E, /* NV_FSEC: KEYEN=1,MEEN=3,FSLACC=3,SEC=2 */
- 0xFF, /* NV_FOPT: ??=1,??=1,FAST_INIT=1,LPBOOT1=1,RESET_PIN_CFG=1,
- NMI_DIS=1,EZPORT_DIS=1,LPBOOT0=1 */
- 0xFF,
- 0xFF
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level HAL driver initialization.
- *
- * @notapi
- */
-void hal_lld_init(void) {
-}
-
-/**
- * @brief KL2x clocks and PLL initialization.
- * @note All the involved constants come from the file @p board.h.
- * @note This function should be invoked just after the system reset.
- *
- * @special
- */
-void kl2x_clock_init(void) {
-#if !KINETIS_NO_INIT
- /* Disable COP watchdog */
- SIM->COPC = 0;
-
- /* Enable PORTA */
- SIM->SCGC5 |= SIM_SCGC5_PORTA;
-
- /* --- MCG mode: FEI (default out of reset) ---
- f_MCGOUTCLK = f_int * F
- F is the FLL factor selected by C4[DRST_DRS] and C4[DMX32] bits.
- Typical f_MCGOUTCLK = 21 MHz immediately after reset.
- C4[DMX32]=0 and C4[DRST_DRS]=00 => FLL factor=640.
- C3[SCTRIM] and C4[SCFTRIM] factory trim values apply to f_int. */
-
- /* System oscillator drives 32 kHz clock (OSC32KSEL=0) */
- SIM->SOPT1 &= ~SIM_SOPT1_OSC32KSEL_MASK;
-
-#if KINETIS_MCG_MODE == KINETIS_MCG_MODE_FEI
- /* This is the default mode at reset. */
- /* The MCGOUTCLK is divided by OUTDIV1 and OUTDIV4:
- * OUTDIV1 (divider for core/system and bus/flash clock)
- * OUTDIV4 (additional divider for bus/flash clock) */
- SIM->CLKDIV1 =
- SIM_CLKDIV1_OUTDIV1(1) | /* OUTDIV1 = divide-by-2 => 24 MHz */
- SIM_CLKDIV1_OUTDIV4(0); /* OUTDIV4 = divide-by-1 => 24 MHz */
-
-#elif KINETIS_MCG_MODE == KINETIS_MCG_MODE_FEE
- /*
- * FLL Enabled External (FEE) MCG Mode
- * 24 MHz core, 12 MHz bus - using 32.768 kHz crystal with FLL.
- * f_MCGOUTCLK = (f_ext / FLL_R) * F
- * = (32.768 kHz ) *
- * FLL_R is the reference divider selected by C1[FRDIV]
- * F is the FLL factor selected by C4[DRST_DRS] and C4[DMX32].
- *
- * Then the core/system and bus/flash clocks are divided:
- * f_SYS = f_MCGOUTCLK / OUTDIV1 = 48 MHz / 1 = 48 MHz
- * f_BUS = f_MCGOUTCLK / OUTDIV1 / OUTDIV4 = MHz / 4 = 24 MHz
- */
-
- SIM->SOPT2 =
- SIM_SOPT2_TPMSRC(1); /* MCGFLLCLK clock or MCGPLLCLK/2 */
- /* PLLFLLSEL=0 -> MCGFLLCLK */
-
- /* The MCGOUTCLK is divided by OUTDIV1 and OUTDIV4:
- * OUTDIV1 (divider for core/system and bus/flash clock)
- * OUTDIV4 (additional divider for bus/flash clock) */
- SIM->CLKDIV1 =
- SIM_CLKDIV1_OUTDIV1(KINETIS_MCG_FLL_OUTDIV1 - 1) |
- SIM_CLKDIV1_OUTDIV4(KINETIS_MCG_FLL_OUTDIV4 - 1);
-
- /* EXTAL0 and XTAL0 */
- PORTA->PCR[18] &= ~0x01000700; /* Set PA18 to analog (default) */
- PORTA->PCR[19] &= ~0x01000700; /* Set PA19 to analog (default) */
-
- OSC0->CR = 0;
-
- /* From KL25P80M48SF0RM section 24.5.1.1 "Initializing the MCG". */
- /* To change from FEI mode to FEE mode: */
- /* (1) Select the external clock source in C2 register.
- Use low-power OSC mode (HGO0=0) which enables internal feedback
- resistor, for 32.768 kHz crystal configuration. */
- MCG->C2 =
- MCG_C2_RANGE0(0) | /* low frequency range (<= 40 kHz) */
- MCG_C2_EREFS0; /* external reference (using a crystal) */
- /* (2) Write to C1 to select the clock mode. */
- MCG->C1 = /* Clear the IREFS bit to switch to the external reference. */
- MCG_C1_CLKS_FLLPLL | /* Use FLL for system clock, MCGCLKOUT. */
- MCG_C1_FRDIV(0); /* Don't divide 32kHz ERCLK FLL reference. */
- MCG->C6 = 0; /* PLLS=0: Select FLL as MCG source, not PLL */
-
- /* Loop until S[OSCINIT0] is 1, indicating the
- crystal selected by C2[EREFS0] has been initialized. */
- while ((MCG->S & MCG_S_OSCINIT0) == 0)
- ;
- /* Loop until S[IREFST] is 0, indicating the
- external reference is the current reference clock source. */
- while ((MCG->S & MCG_S_IREFST) != 0)
- ; /* Wait until external reference clock is FLL reference. */
- /* (1)(e) Loop until S[CLKST] indicates FLL feeds MCGOUTCLK. */
- while ((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST_FLL)
- ; /* Wait until FLL has been selected. */
-
- /* --- MCG mode: FEE --- */
- /* Set frequency range for DCO output (MCGFLLCLK). */
- MCG->C4 = (KINETIS_MCG_FLL_DMX32 ? MCG_C4_DMX32 : 0) |
- MCG_C4_DRST_DRS(KINETIS_MCG_FLL_DRS);
-
- /* Wait for the FLL lock time; t[fll_acquire][max] = 1 ms */
- /* TODO - not implemented - is it required? Freescale example code
- seems to omit it. */
-
-#elif KINETIS_MCG_MODE == KINETIS_MCG_MODE_PEE
- /*
- * PLL Enabled External (PEE) MCG Mode
- * 48 MHz core, 24 MHz bus - using 8 MHz crystal with PLL.
- * f_MCGOUTCLK = (OSCCLK / PLL_R) * M
- * = 8 MHz / 2 * 24 = 96 MHz
- * PLL_R is the reference divider selected by C5[PRDIV0]
- * M is the multiplier selected by C6[VDIV0]
- *
- * Then the core/system and bus/flash clocks are divided:
- * f_SYS = f_MCGOUTCLK / OUTDIV1 = 96 MHz / 2 = 48 MHz
- * f_BUS = f_MCGOUTCLK / OUTDIV1 / OUTDIV4 = 96 MHz / 4 = 24 MHz
- */
-
- /* The MCGOUTCLK is divided by OUTDIV1 and OUTDIV4:
- * OUTDIV1 (divider for core/system and bus/flash clock)
- * OUTDIV4 (additional divider for bus/flash clock) */
- SIM->CLKDIV1 =
- SIM_CLKDIV1_OUTDIV1(1) | /* OUTDIV1 = divide-by-2 => 48 MHz */
- SIM_CLKDIV1_OUTDIV4(1); /* OUTDIV4 = divide-by-2 => 24 MHz */
-
- SIM->SOPT2 =
- SIM_SOPT2_TPMSRC(1) | /* MCGFLLCLK clock or MCGPLLCLK/2 */
- SIM_SOPT2_PLLFLLSEL; /* PLLFLLSEL=MCGPLLCLK/2 */
-
- /* EXTAL0 and XTAL0 */
- PORTA->PCR[18] &= ~0x01000700; /* Set PA18 to analog (default) */
- PORTA->PCR[19] &= ~0x01000700; /* Set PA19 to analog (default) */
-
- OSC0->CR = 0;
-
- /* From KL25P80M48SF0RM section 24.5.1.1 "Initializing the MCG". */
- /* To change from FEI mode to FBE mode: */
- /* (1) Select the external clock source in C2 register.
- Use low-power OSC mode (HGO0=0) which enables internal feedback
- resistor since FRDM-KL25Z has feedback resistor R25 unpopulated.
- Use high-gain mode by setting C2[HGO0] instead if external
- feedback resistor Rf is installed. */
- MCG->C2 =
- MCG_C2_RANGE0(2) | /* very high frequency range */
- MCG_C2_EREFS0; /* external reference (using a crystal) */
- /* (2) Write to C1 to select the clock mode. */
- MCG->C1 = /* Clear the IREFS bit to switch to the external reference. */
- MCG_C1_CLKS_ERCLK | /* Use ERCLK for system clock, MCGCLKOUT. */
- MCG_C1_FRDIV(3); /* Divide ERCLK / 256 for FLL reference. */
- /* Note: FLL reference frequency must be 31.25 kHz to 39.0625 kHz.
- 8 MHz / 256 = 31.25 kHz. */
- MCG->C4 &= ~(MCG_C4_DMX32 | MCG_C4_DRST_DRS_MASK);
- MCG->C6 = 0; /* PLLS=0: Select FLL as MCG source, not PLL */
-
- /* (3) Once configuration is set, wait for MCG mode change. */
-
- /* From KL25P80M48SF0RM section 24.5.31: */
- /* (1)(c) Loop until S[OSCINIT0] is 1, indicating the
- crystal selected by C2[EREFS0] has been initialized. */
- while ((MCG->S & MCG_S_OSCINIT0) == 0)
- ;
- /* (1)(d) Loop until S[IREFST] is 0, indicating the
- external reference is the current reference clock source. */
- while ((MCG->S & MCG_S_IREFST) != 0)
- ; /* Wait until external reference clock is FLL reference. */
- /* (1)(e) Loop until S[CLKST] is 2'b10, indicating
- the external reference clock is selected to feed MCGOUTCLK. */
- while ((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST_ERCLK)
- ; /* Wait until external reference clock has been selected. */
-
- /* --- MCG mode: FBE (FLL bypassed, external crystal) ---
- Now the MCG is in FBE mode.
- Although the FLL is bypassed, it is still on. */
-
- /* (2) Then configure C5[PRDIV0] to generate the
- correct PLL reference frequency. */
- MCG->C5 = MCG_C5_PRDIV0(1); /* PLL External Reference Divide by 2 */
- /* (3) Then from FBE transition to PBE mode. */
- /* (3)(b) C6[PLLS]=1 to select PLL. */
- /* (3)(b) C6[VDIV0]=5'b0000 (x24) 2 MHz * 24 = 48 MHz. */
- MCG->C6 = MCG_C6_PLLS | MCG_C6_VDIV0(0);
- /* (3)(d) Loop until S[PLLST], indicating PLL
- is the PLLS clock source. */
- while ((MCG->S & MCG_S_PLLST) == 0)
- ; /* wait until PLL is the PLLS clock source. */
- /* (3)(e) Loop until S[LOCK0] is set, indicating the PLL has acquired lock. */
- /* PLL selected as MCG source. VDIV0=00000 (Multiply=24). */
- while ((MCG->S & MCG_S_LOCK0) == 0)
- ; /* wait until PLL locked */
-
- /* --- MCG mode: PBE (PLL bypassed, external crystal) --- */
-
- /* (4) Transition from PBE mode to PEE mode. */
- /* (4)(a) C1[CLKS] = 2'b00 to select PLL output as system clock source. */
- // Switch to PEE mode
- // Select PLL output (CLKS=0)
- // FLL external reference divider (FRDIV=3)
- // External reference clock for FLL (IREFS=0)
- MCG->C1 = MCG_C1_CLKS(0) |
- MCG_C1_FRDIV(3);
- /* (4)(b) Loop until S[CLKST] are 2'b11, indicating the PLL output is selected for MCGOUTCLK. */
- while ((MCG->S & MCG_S_CLKST_MASK) != MCG_S_CLKST_PLL)
- ; /* wait until clock switched to PLL output */
-
- /* --- MCG mode: PEE (PLL enabled, external crystal) --- */
-
-#else /* KINETIS_MCG_MODE != KINETIS_MCG_MODE_PEE */
-#error Unimplemented KINETIS_MCG_MODE
-#endif /* KINETIS_MCG_MODE != KINETIS_MCG_MODE_PEE */
-
-#endif /* !KINETIS_NO_INIT */
-}
-
-/**
- * @brief Platform early initialization.
- * @note All the involved constants come from the file @p board.h.
- * @note This function is meant to be invoked early during the system
- * initialization, it is usually invoked from the file
- * @p board.c.
- *
- * @special
- */
-void platform_early_init(void) {
-
-}
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/hal_lld.h b/os/hal/ports/KINETIS/KL2x/hal_lld.h
deleted file mode 100644
index f93d920b6..000000000
--- a/os/hal/ports/KINETIS/KL2x/hal_lld.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2013-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/hal_lld.h
- * @brief Kinetis KL2x HAL subsystem low level driver header.
- *
- * @addtogroup HAL
- * @{
- */
-
-#ifndef _HAL_LLD_H_
-#define _HAL_LLD_H_
-
-#include "kl25z.h"
-#include "kinetis_registry.h"
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/**
- * @brief Defines the support for realtime counters in the HAL.
- */
-#define HAL_IMPLEMENTS_COUNTERS FALSE
-
-/**
- * @name Platform identification
- * @{
- */
-#define PLATFORM_NAME "Kinetis"
-/** @} */
-
-/**
- * @brief Maximum system and core clock (f_SYS) frequency.
- */
-#define KINETIS_SYSCLK_MAX 48000000
-
-/**
- * @brief Maximum bus clock (f_BUS) frequency.
- */
-#define KINETIS_BUSCLK_MAX 24000000
-
-/**
- * @name Internal clock sources
- * @{
- */
-#define KINETIS_IRCLK_F 4000000 /**< Fast internal reference clock, factory trimmed. */
-#define KINETIS_IRCLK_S 32768 /**< Slow internal reference clock, factory trimmed. */
-/** @} */
-
-#define KINETIS_MCG_MODE_FEI 1 /**< FLL Engaged Internal. */
-#define KINETIS_MCG_MODE_FEE 2 /**< FLL Engaged External. */
-#define KINETIS_MCG_MODE_FBI 3 /**< FLL Bypassed Internal. */
-#define KINETIS_MCG_MODE_FBE 4 /**< FLL Bypassed External. */
-#define KINETIS_MCG_MODE_PEE 5 /**< PLL Engaged External. */
-#define KINETIS_MCG_MODE_PBE 6 /**< PLL Bypassed External. */
-#define KINETIS_MCG_MODE_BLPI 7 /**< Bypassed Low Power Internal. */
-#define KINETIS_MCG_MODE_BLPE 8 /**< Bypassed Low Power External. */
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief Disables the MCG/system clock initialization in the HAL.
- */
-#if !defined(KINETIS_NO_INIT) || defined(__DOXYGEN__)
-#define KINETIS_NO_INIT FALSE
-#endif
-
-/**
- * @brief MCG mode selection.
- */
-#if !defined(KINETIS_MCG_MODE) || defined(__DOXYGEN__)
-#define KINETIS_MCG_MODE KINETIS_MCG_MODE_PEE
-#endif
-
-/**
- * @brief Clock divider for core/system and bus/flash clocks (OUTDIV1).
- * @note The allowed range is 1...16.
- * @note The default value is calculated for a 48 MHz system clock
- * from a 96 MHz PLL output.
- */
-#if !defined(KINETIS_MCG_FLL_OUTDIV1) || defined(__DOXYGEN__)
-#define KINETIS_MCG_FLL_OUTDIV1 2
-#endif
-
-/**
- * @brief Additional clock divider bus/flash clocks (OUTDIV4).
- * @note The allowed range is 1...8.
- * @note This divider is on top of the OUTDIV1 divider.
- * @note The default value is calculated for 24 MHz bus/flash clocks
- * from a 96 MHz PLL output and 48 MHz core/system clock.
- */
-#if !defined(KINETIS_MCG_FLL_OUTDIV4) || defined(__DOXYGEN__)
-#define KINETIS_MCG_FLL_OUTDIV4 2
-#endif
-
-/**
- * @brief FLL DCO tuning enable for 32.768 kHz reference.
- * @note Set to 1 for fine-tuning DCO for maximum frequency with
- * a 32.768 kHz reference.
- * @note The default value is for a 32.768 kHz external crystal.
- */
-#if !defined(KINETIS_MCG_FLL_DMX32) || defined(__DOXYGEN__)
-#define KINETIS_MCG_FLL_DMX32 1
-#endif
-
-/**
- * @brief FLL DCO range selection.
- * @note The allowed range is 0...3.
- * @note The default value is calculated for 48 MHz FLL output
- * from a 32.768 kHz external crystal.
- * (DMX32 && DRST_DRS=1 => F=1464; 32.768 kHz * F ~= 48 MHz.)
- *
- */
-#if !defined(KINETIS_MCG_FLL_DRS) || defined(__DOXYGEN__)
-#define KINETIS_MCG_FLL_DRS 2
-#endif
-
-/**
- * @brief MCU system/core clock frequency.
- */
-#if !defined(KINETIS_SYSCLK_FREQUENCY) || defined(__DOXYGEN__)
-#define KINETIS_SYSCLK_FREQUENCY 48000000UL
-#endif
-
-/**
- * @brief MCU bus/flash clock frequency.
- */
-#if !defined(KINETIS_BUSCLK_FREQUENCY) || defined(__DOXYGEN__)
-#define KINETIS_BUSCLK_FREQUENCY (KINETIS_SYSCLK_FREQUENCY / KINETIS_MCG_FLL_OUTDIV4)
-#endif
-
-/**
- * @brief UART0 clock frequency.
- * @note The default value is based on 96 MHz PLL/2 source.
- * If you use a different source, such as the FLL,
- * you must set this properly.
- */
-#if !defined(KINETIS_UART0_CLOCK_FREQ) || defined(__DOXYGEN__)
-#define KINETIS_UART0_CLOCK_FREQ KINETIS_SYSCLK_FREQUENCY
-#endif
-
-/**
- * @brief UART0 clock source.
- * @note The default value is to use PLL/2 or FLL source.
- */
-#if !defined(KINETIS_UART0_CLOCK_SRC) || defined(__DOXYGEN__)
-#define KINETIS_UART0_CLOCK_SRC 1
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-#if !defined(KINETIS_SYSCLK_FREQUENCY)
-#error KINETIS_SYSCLK_FREQUENCY must be defined
-#endif
-
-#if KINETIS_SYSCLK_FREQUENCY <= 0 || KINETIS_SYSCLK_FREQUENCY > KINETIS_SYSCLK_MAX
-#error KINETIS_SYSCLK_FREQUENCY out of range
-#endif
-
-#if !defined(KINETIS_BUSCLK_FREQUENCY)
-#error KINETIS_BUSCLK_FREQUENCY must be defined
-#endif
-
-#if KINETIS_BUSCLK_FREQUENCY <= 0 || KINETIS_BUSCLK_FREQUENCY > KINETIS_BUSCLK_MAX
-#error KINETIS_BUSCLK_FREQUENCY out of range
-#endif
-
-#if !(defined(KINETIS_MCG_FLL_OUTDIV1) && \
- KINETIS_MCG_FLL_OUTDIV1 >= 1 && KINETIS_MCG_FLL_OUTDIV1 <= 16)
-#error KINETIS_MCG_FLL_OUTDIV1 must be 1 through 16
-#endif
-
-#if !(defined(KINETIS_MCG_FLL_OUTDIV4) && \
- KINETIS_MCG_FLL_OUTDIV4 >= 1 && KINETIS_MCG_FLL_OUTDIV4 <= 8)
-#error KINETIS_MCG_FLL_OUTDIV4 must be 1 through 8
-#endif
-
-#if !(KINETIS_MCG_FLL_DMX32 == 0 || KINETIS_MCG_FLL_DMX32 == 1)
-#error Invalid KINETIS_MCG_FLL_DMX32 value, must be 0 or 1
-#endif
-
-#if !(0 <= KINETIS_MCG_FLL_DRS && KINETIS_MCG_FLL_DRS <= 3)
-#error Invalid KINETIS_MCG_FLL_DRS value, must be 0...3
-#endif
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type representing a system clock frequency.
- */
-typedef uint32_t halclock_t;
-
-/**
- * @brief Type of the realtime free counter value.
- */
-typedef uint32_t halrtcnt_t;
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/**
- * @brief Returns the current value of the system free running counter.
- * @note This service is implemented by returning the content of the
- * DWT_CYCCNT register.
- *
- * @return The value of the system free running counter of
- * type halrtcnt_t.
- *
- * @notapi
- */
-#define hal_lld_get_counter_value() 0
-
-/**
- * @brief Realtime counter frequency.
- * @note The DWT_CYCCNT register is incremented directly by the system
- * clock so this function returns STM32_HCLK.
- *
- * @return The realtime counter frequency of type halclock_t.
- *
- * @notapi
- */
-#define hal_lld_get_counter_frequency() 0
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#include "nvic.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void hal_lld_init(void);
- void kl2x_clock_init(void);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _HAL_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/kinetis_registry.h b/os/hal/ports/KINETIS/KL2x/kinetis_registry.h
deleted file mode 100644
index dcf357659..000000000
--- a/os/hal/ports/KINETIS/KL2x/kinetis_registry.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Derek Mulcahy
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/kinetis_registry.h
- * @brief KL2x capabilities registry.
- *
- * @addtogroup HAL
- * @{
- */
-
-#ifndef _KINETIS_REGISTRY_H_
-#define _KINETIS_REGISTRY_H_
-
-/*===========================================================================*/
-/* Platform capabilities. */
-/*===========================================================================*/
-
-/**
- * @name KL2x capabilities
- * @{
- */
-
-/* EXT attributes.*/
-#define KINETIS_PORTA_IRQ_VECTOR VectorB8
-#define KINETIS_PORTD_IRQ_VECTOR VectorBC
-
-/* ADC attributes.*/
-#define KINETIS_HAS_ADC0 TRUE
-#define KINETIS_ADC0_IRQ_VECTOR Vector7C
-
-/* I2C attributes.*/
-#define KINETIS_I2C0_IRQ_VECTOR Vector60
-
-/** @} */
-
-#endif /* _KINETIS_REGISTRY_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/kinetis_tpm.h b/os/hal/ports/KINETIS/KL2x/kinetis_tpm.h
deleted file mode 100644
index 99ffc9cbf..000000000
--- a/os/hal/ports/KINETIS/KL2x/kinetis_tpm.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Adam J. Porter
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/kinetis_tpm.h
- * @brief Kinetis TPM registers layout header.
- *
- * @addtogroup HAL
- * @{
- */
-
-#ifndef _KINETIS_TPM_H_
-#define _KINETIS_TPM_H_
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/**
- * @name TPM_SC register
- * @{
- */
-#define TPM_SC_CMOD_DISABLE (0 << 3)
-#define TPM_SC_CMOD_LPTPM_CLK (1 << 3)
-#define TPM_SC_CMOD_LPTPM_EXTCLK (2 << 3)
-#define TPM_SC_CPWMS (1 << 5)
-#define TPM_SC_TOIE (1 << 6)
-#define TPM_SC_TOF (1 << 7)
-#define TPM_SC_DMA (1 << 8)
-/** @} */
-
-/**
- * @name TPM_MOD register
- * @{
- */
-#define TPM_MOD_MASK (0xFFFF)
-/** @} */
-
-/**
- * @name TPM_CnSC register
- * @{
- */
-#define TPM_CnSC_DMA (1 << 0)
-#define TPM_CnSC_ELSA (1 << 2)
-#define TPM_CnSC_ELSB (1 << 3)
-#define TPM_CnSC_MSA (1 << 4)
-#define TPM_CnSC_MSB (1 << 5)
-#define TPM_CnSC_CHIE (1 << 6)
-#define TPM_CnSC_CHF (1 << 7)
-/** @} */
-
-/**
- * @name TPM_CnV register
- * @{
- */
-#define TPM_CnV_VAL_MASK (0xFFFF)
-/** @} */
-
-/**
- * @name TPM_STATUS register
- * @{
- */
-#define TPM_STATUS_CH0F (1 << 0)
-#define TPM_STATUS_CH1F (1 << 1)
-#define TPM_STATUS_CH2F (1 << 2)
-#define TPM_STATUS_CH3F (1 << 3)
-#define TPM_STATUS_CH4F (1 << 4)
-#define TPM_STATUS_CH5F (1 << 5)
-#define TPM_STATUS_TOF (1 << 8)
-/** @} */
-
-/**
- * @name TPM_CONF register
- * @{
- */
-#define TPM_CONF_DOZEEN (1 << 5)
-#define TPM_CONF_DBGMODE_CONT (3 << 6)
-#define TPM_CONF_DBGMODE_PAUSE (0 << 6)
-#define TPM_CONF_GTBEEN (1 << 9)
-#define TPM_CONF_CSOT (1 << 16)
-#define TPM_CONF_CSOO (1 << 17)
-#define TPM_CONF_CROT (1 << 18)
-#define TPM_CONF_TRGSEL(n) ((n) << 24)
-/** @{ */
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-#endif /* _KINETIS_TPM_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/pal_lld.c b/os/hal/ports/KINETIS/KL2x/pal_lld.c
deleted file mode 100644
index a894c6a28..000000000
--- a/os/hal/ports/KINETIS/KL2x/pal_lld.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2013..2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/pal_lld.c
- * @brief Kinetis KL2x PAL subsystem low level driver.
- *
- * @addtogroup PAL
- * @{
- */
-
-#include "osal.h"
-#include "hal.h"
-
-#if HAL_USE_PAL || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief STM32 I/O ports configuration.
- * @details Ports A-D(E, F, G, H) clocks enabled.
- *
- * @param[in] config the STM32 ports configuration
- *
- * @notapi
- */
-void _pal_lld_init(const PALConfig *config) {
-
- int i, j;
-
- /* Enable clocking of all Ports */
- SIM->SCGC5 |= SIM_SCGC5_PORTA |
- SIM_SCGC5_PORTB |
- SIM_SCGC5_PORTC |
- SIM_SCGC5_PORTD |
- SIM_SCGC5_PORTE;
-
- for (i = 0; i < TOTAL_PORTS; i++) {
- for (j = 0; j < PADS_PER_PORT; j++) {
- pal_lld_setpadmode(config->ports[i].port,
- j,
- config->ports[i].pads[j]);
- }
- }
-}
-
-/**
- * @brief Pads mode setup.
- * @details This function programs a pads group belonging to the same port
- * with the specified mode.
- *
- * @param[in] port the port identifier
- * @param[in] mask the group mask
- * @param[in] mode the mode
- *
- * @notapi
- */
-void _pal_lld_setgroupmode(ioportid_t port,
- ioportmask_t mask,
- iomode_t mode) {
-
- (void)port;
- (void)mask;
- (void)mode;
-
-}
-
-/**
- * @brief Reads a logical state from an I/O pad.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @return The logical state.
- * @retval PAL_LOW low logical state.
- * @retval PAL_HIGH high logical state.
- *
- * @notapi
- */
-uint8_t pal_lld_readpad(ioportid_t port, uint8_t pad)
-{
- return (port->PDIR & ((uint32_t) 1 << pad)) ? PAL_HIGH : PAL_LOW;
-}
-
-/**
- * @brief Writes a logical state on an output pad.
- * @note This function is not meant to be invoked directly by the
- * application code.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] bit logical value, the value must be @p PAL_LOW or
- * @p PAL_HIGH
- *
- * @notapi
- */
-void pal_lld_writepad(ioportid_t port, uint8_t pad, uint8_t bit)
-{
- if (bit == PAL_HIGH)
- port->PDOR |= ((uint32_t) 1 << pad);
- else
- port->PDOR &= ~((uint32_t) 1 << pad);
-}
-
-/**
- * @brief Pad mode setup.
- * @details This function programs a pad with the specified mode.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- * @note Programming an unknown or unsupported mode is silently ignored.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] mode pad mode
- *
- * @notapi
- */
-void _pal_lld_setpadmode(ioportid_t port, uint8_t pad, iomode_t mode)
-{
- PORT_TypeDef *portcfg = NULL;
-
- osalDbgAssert(pad <= 31, "pal_lld_setpadmode() - invalid pad");
-
- if (mode == PAL_MODE_OUTPUT_PUSHPULL)
- port->PDDR |= ((uint32_t) 1 << pad);
- else
- port->PDDR &= ~((uint32_t) 1 << pad);
-
- if (port == IOPORT1)
- portcfg = PORTA;
- else if (port == IOPORT2)
- portcfg = PORTB;
- else if (port == IOPORT3)
- portcfg = PORTC;
- else if (port == IOPORT4)
- portcfg = PORTD;
- else if (port == IOPORT5)
- portcfg = PORTE;
-
- osalDbgAssert(portcfg != NULL, "pal_lld_setpadmode() - invalid port");
-
- switch (mode) {
- case PAL_MODE_RESET:
- case PAL_MODE_INPUT:
- case PAL_MODE_OUTPUT_PUSHPULL:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(1);
- break;
- case PAL_MODE_INPUT_PULLUP:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(1) | PORTx_PCRn_PE | PORTx_PCRn_PS;
- break;
- case PAL_MODE_INPUT_PULLDOWN:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(1) | PORTx_PCRn_PE;
- break;
- case PAL_MODE_UNCONNECTED:
- case PAL_MODE_INPUT_ANALOG:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(0);
- break;
- case PAL_MODE_ALTERNATIVE_1:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(1);
- break;
- case PAL_MODE_ALTERNATIVE_2:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(2);
- break;
- case PAL_MODE_ALTERNATIVE_3:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(3);
- break;
- case PAL_MODE_ALTERNATIVE_4:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(4);
- break;
- case PAL_MODE_ALTERNATIVE_5:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(5);
- break;
- case PAL_MODE_ALTERNATIVE_6:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(6);
- break;
- case PAL_MODE_ALTERNATIVE_7:
- portcfg->PCR[pad] = PORTx_PCRn_MUX(7);
- break;
- }
-}
-
-#endif /* HAL_USE_PAL */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/pal_lld.h b/os/hal/ports/KINETIS/KL2x/pal_lld.h
deleted file mode 100644
index 8b38709a5..000000000
--- a/os/hal/ports/KINETIS/KL2x/pal_lld.h
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2013-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/pal_lld.h
- * @brief Kinetis KL2x PAL subsystem low level driver header.
- *
- * @addtogroup PAL
- * @{
- */
-
-#ifndef _PAL_LLD_H_
-#define _PAL_LLD_H_
-
-#if HAL_USE_PAL || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Unsupported modes and specific modes */
-/*===========================================================================*/
-
-#undef PAL_MODE_OUTPUT_OPENDRAIN
-
-#define PAL_MODE_ALTERNATIVE_1 0x10
-#define PAL_MODE_ALTERNATIVE_2 0x11
-#define PAL_MODE_ALTERNATIVE_3 0x12
-#define PAL_MODE_ALTERNATIVE_4 0x13
-#define PAL_MODE_ALTERNATIVE_5 0x14
-#define PAL_MODE_ALTERNATIVE_6 0x15
-#define PAL_MODE_ALTERNATIVE_7 0x16
-
-/*===========================================================================*/
-/* I/O Ports Types and constants. */
-/*===========================================================================*/
-
-#define TOTAL_PORTS 5
-#define PADS_PER_PORT 32
-
-/**
- * @brief Digital I/O port sized unsigned type.
- */
-typedef uint32_t ioportmask_t;
-
-/**
- * @brief Digital I/O modes.
- */
-typedef uint8_t iomode_t;
-
-/**
- * @brief Port Identifier.
- * @details This type can be a scalar or some kind of pointer, do not make
- * any assumption about it, use the provided macros when populating
- * variables of this type.
- */
-typedef GPIO_TypeDef * ioportid_t;
-
-typedef struct {
- ioportid_t port;
- iomode_t pads[PADS_PER_PORT];
-} PortConfig;
-
-/**
- * @brief Generic I/O ports static initializer.
- * @details An instance of this structure must be passed to @p palInit() at
- * system startup time in order to initialized the digital I/O
- * subsystem. This represents only the initial setup, specific pads
- * or whole ports can be reprogrammed at later time.
- * @note Implementations may extend this structure to contain more,
- * architecture dependent, fields.
- */
-typedef struct
-{
- PortConfig ports[TOTAL_PORTS];
-} PALConfig;
-
-/**
- * @brief Width, in bits, of an I/O port.
- */
-#define PAL_IOPORTS_WIDTH 32
-
-/**
- * @brief Whole port mask.
- * @brief This macro specifies all the valid bits into a port.
- */
-#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFFFFF)
-
-
-/*===========================================================================*/
-/* I/O Ports Identifiers. */
-/*===========================================================================*/
-
-/**
- * @brief First I/O port identifier.
- * @details Low level drivers can define multiple ports, it is suggested to
- * use this naming convention.
- */
-#define IOPORT1 GPIOA
-#define IOPORT2 GPIOB
-#define IOPORT3 GPIOC
-#define IOPORT4 GPIOD
-#define IOPORT5 GPIOE
-
-/*===========================================================================*/
-/* Implementation, some of the following macros could be implemented as */
-/* functions, if so please put them in pal_lld.c. */
-/*===========================================================================*/
-
-/**
- * @brief Low level PAL subsystem initialization.
- *
- * @param[in] config architecture-dependent ports configuration
- *
- * @notapi
- */
-#define pal_lld_init(config) _pal_lld_init(config)
-
-/**
- * @brief Reads the physical I/O port states.
- *
- * @param[in] port port identifier
- * @return The port bits.
- *
- * @notapi
- */
-#define pal_lld_readport(port) \
- (port)->PDIR
-
-/**
- * @brief Reads the output latch.
- * @details The purpose of this function is to read back the latched output
- * value.
- *
- * @param[in] port port identifier
- * @return The latched logical states.
- *
- * @notapi
- */
-#define pal_lld_readlatch(port) \
- (port)->PDOR
-
-/**
- * @brief Writes a bits mask on a I/O port.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be written on the specified port
- *
- * @notapi
- */
-#define pal_lld_writeport(port, bits) \
- (port)->PDOR = (bits)
-
-/**
- * @brief Sets a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be ORed on the specified port
- *
- * @notapi
- */
-#define pal_lld_setport(port, bits) \
- (port)->PSOR = (bits)
-
-/**
- * @brief Clears a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be cleared on the specified port
- *
- * @notapi
- */
-#define pal_lld_clearport(port, bits) \
- (port)->PCOR = (bits)
-
-/**
- * @brief Toggles a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be XORed on the specified port
- *
- * @notapi
- */
-#define pal_lld_toggleport(port, bits) \
- (port)->PTOR = (bits)
-
-/**
- * @brief Reads a group of bits.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @return The group logical states.
- *
- * @notapi
- */
-#define pal_lld_readgroup(port, mask, offset) 0
-
-/**
- * @brief Writes a group of bits.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @param[in] bits bits to be written. Values exceeding the group width
- * are masked.
- *
- * @notapi
- */
-#define pal_lld_writegroup(port, mask, offset, bits) (void)bits
-
-/**
- * @brief Pads group mode setup.
- * @details This function programs a pads group belonging to the same port
- * with the specified mode.
- * @note Programming an unknown or unsupported mode is silently ignored.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @param[in] mode group mode
- *
- * @notapi
- */
-#define pal_lld_setgroupmode(port, mask, offset, mode) \
- _pal_lld_setgroupmode(port, mask << offset, mode)
-
-/**
- * @brief Sets a pad logical state to @p PAL_HIGH.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
-#define pal_lld_setpad(port, pad) (port)->PSOR = ((uint32_t) 1 << (pad))
-
-/**
- * @brief Clears a pad logical state to @p PAL_LOW.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
-#define pal_lld_clearpad(port, pad) (port)->PCOR = ((uint32_t) 1 << (pad))
-
-/**
- * @brief Toggles a pad logical state.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
-#define pal_lld_togglepad(port, pad) (port)->PTOR = ((uint32_t) 1 << (pad))
-
-/**
- * @brief Pad mode setup.
- * @details This function programs a pad with the specified mode.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- * @note Programming an unknown or unsupported mode is silently ignored.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] mode pad mode
- *
- * @notapi
- */
-#define pal_lld_setpadmode(port, pad, mode) \
- _pal_lld_setpadmode(port, pad, mode)
-
-#if !defined(__DOXYGEN__)
-extern const PALConfig pal_default_config;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void _pal_lld_init(const PALConfig *config);
- void _pal_lld_setgroupmode(ioportid_t port,
- ioportmask_t mask,
- iomode_t mode);
- void pal_lld_setpadmode(ioportid_t port,
- uint8_t pad,
- iomode_t mode);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_PAL */
-
-#endif /* _PAL_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/platform.mk b/os/hal/ports/KINETIS/KL2x/platform.mk
deleted file mode 100644
index 90671ee77..000000000
--- a/os/hal/ports/KINETIS/KL2x/platform.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-# List of all platform files.
-PLATFORMSRC = ${CHIBIOS}/os/hal/ports/common/ARMCMx/nvic.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/KL2x/hal_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/KL2x/pal_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/KL2x/serial_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/LLD/i2c_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/LLD/ext_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/LLD/adc_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/KL2x/pwm_lld.c \
- ${CHIBIOS}/os/hal/ports/KINETIS/KL2x/st_lld.c
-
-# Required include directories
-PLATFORMINC = ${CHIBIOS}/os/hal/ports/common/ARMCMx \
- ${CHIBIOS}/os/hal/ports/KINETIS/KL2x \
- ${CHIBIOS}/os/hal/ports/KINETIS/LLD
diff --git a/os/hal/ports/KINETIS/KL2x/pwm_lld.c b/os/hal/ports/KINETIS/KL2x/pwm_lld.c
deleted file mode 100644
index 4ba7d6e3f..000000000
--- a/os/hal/ports/KINETIS/KL2x/pwm_lld.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Adam J. Porter
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/pwm_lld.c
- * @brief KINETIS PWM subsystem low level driver source.
- *
- * @addtogroup PWM
- * @{
- */
-
-#include "hal.h"
-
-#if HAL_USE_PWM || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-#define KINETIS_TPM0_CHANNELS 6
-#define KINETIS_TPM1_CHANNELS 2
-#define KINETIS_TPM2_CHANNELS 2
-
-#define KINETIS_TPM0_HANDLER Vector84
-#define KINETIS_TPM1_HANDLER Vector88
-#define KINETIS_TPM2_HANDLER Vector8C
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/**
- * @brief PWMD1 driver identifier.
- * @note The driver PWMD1 allocates the timer TPM0 when enabled.
- */
-#if KINETIS_PWM_USE_TPM0 || defined(__DOXYGEN__)
-PWMDriver PWMD1;
-#endif
-
-/**
- * @brief PWMD2 driver identifier.
- * @note The driver PWMD2 allocates the timer TPM1 when enabled.
- */
-#if KINETIS_PWM_USE_TPM1 || defined(__DOXYGEN__)
-PWMDriver PWMD2;
-#endif
-
-/**
- * @brief PWMD3 driver identifier.
- * @note The driver PWMD3 allocates the timer TPM2 when enabled.
- */
-#if KINETIS_PWM_USE_TPM2 || defined(__DOXYGEN__)
-PWMDriver PWMD3;
-#endif
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static void pwm_lld_serve_interrupt(PWMDriver *pwmp) {
- uint32_t sr;
-
- sr = pwmp->tpm->STATUS;
- pwmp->tpm->STATUS = 0xFFFFFFFF;
-
- if (((sr & TPM_SC_TOF) != 0) &&
- (pwmp->config->callback != NULL))
- pwmp->config->callback(pwmp);
- if (((sr & TPM_STATUS_CH0F) != 0) &&
- (pwmp->config->channels[0].callback != NULL))
- pwmp->config->channels[0].callback(pwmp);
- if (((sr & TPM_STATUS_CH1F) != 0) &&
- (pwmp->config->channels[1].callback != NULL))
- pwmp->config->channels[1].callback(pwmp);
- if (((sr & TPM_STATUS_CH2F) != 0) &&
- (pwmp->config->channels[2].callback != NULL))
- pwmp->config->channels[2].callback(pwmp);
- if (((sr & TPM_STATUS_CH3F) != 0) &&
- (pwmp->config->channels[3].callback != NULL))
- pwmp->config->channels[3].callback(pwmp);
- if (((sr & TPM_STATUS_CH4F) != 0) &&
- (pwmp->config->channels[4].callback != NULL))
- pwmp->config->channels[4].callback(pwmp);
- if (((sr & TPM_STATUS_CH5F) != 0) &&
- (pwmp->config->channels[5].callback != NULL))
- pwmp->config->channels[5].callback(pwmp);
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-#if KINETIS_PWM_USE_TPM0
-/**
- * @brief TPM0 interrupt handler.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(KINETIS_TPM0_HANDLER) {
-
- OSAL_IRQ_PROLOGUE();
- pwm_lld_serve_interrupt(&PWMD1);
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_PWM_USE_TPM0 */
-
-#if KINETIS_PWM_USE_TPM1
-/**
- * @brief TPM1 interrupt handler.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(KINETIS_TPM1_HANDLER) {
-
- OSAL_IRQ_PROLOGUE();
- pwm_lld_serve_interrupt(&PWMD2);
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_PWM_USE_TPM1 */
-
-#if KINETIS_PWM_USE_TPM2
-/**
- * @brief TPM2 interrupt handler.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(KINETIS_TPM2_HANDLER) {
-
- OSAL_IRQ_PROLOGUE();
- pwm_lld_serve_interrupt(&PWMD3);
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_PWM_USE_TPM2 */
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level PWM driver initialization.
- *
- * @notapi
- */
-void pwm_lld_init(void) {
-
-#if KINETIS_PWM_USE_TPM0
- pwmObjectInit(&PWMD1);
- PWMD1.channels = KINETIS_TPM0_CHANNELS;
- PWMD1.tpm = TPM0;
-#endif
-
-#if KINETIS_PWM_USE_TPM1
- pwmObjectInit(&PWMD2);
- PWMD2.channels = KINETIS_TPM1_CHANNELS;
- PWMD2.tpm = TPM1;
-#endif
-
-#if KINETIS_PWM_USE_TPM2
- pwmObjectInit(&PWMD3);
- PWMD3.channels = KINETIS_TPM2_CHANNELS;
- PWMD3.tpm = TPM2;
-#endif
-}
-
-/**
- * @brief Configures and activates the PWM peripheral.
- * @note Starting a driver that is already in the @p PWM_READY state
- * disables all the active channels.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- *
- * @notapi
- */
-void pwm_lld_start(PWMDriver *pwmp) {
- uint32_t psc;
- int i;
-
- if (pwmp->state == PWM_STOP) {
- /* Clock activation and timer reset.*/
-#if KINETIS_PWM_USE_TPM0
- if (&PWMD1 == pwmp) {
- SIM->SCGC6 |= SIM_SCGC6_TPM0;
- nvicEnableVector(TPM0_IRQn, KINETIS_PWM_TPM0_IRQ_PRIORITY);
- }
-#endif
-
-#if KINETIS_PWM_USE_TPM1
- if (&PWMD2 == pwmp) {
- SIM->SCGC6 |= SIM_SCGC6_TPM1;
- nvicEnableVector(TPM1_IRQn, KINETIS_PWM_TPM1_IRQ_PRIORITY);
- }
-#endif
-
-#if KINETIS_PWM_USE_TPM2
- if (&PWMD3 == pwmp) {
- SIM->SCGC6 |= SIM_SCGC6_TPM2;
- nvicEnableVector(TPM2_IRQn, KINETIS_PWM_TPM2_IRQ_PRIORITY);
- }
-#endif
- }
-
- /* Disable LPTPM counter.*/
- pwmp->tpm->SC = 0;
- /* Clear count register.*/
- pwmp->tpm->CNT = 0;
-
- /* Prescaler value calculation.*/
- psc = (KINETIS_SYSCLK_FREQUENCY / pwmp->config->frequency);
- /* Prescaler must be power of two between 1 and 128.*/
- osalDbgAssert(psc <= 128 && !(psc & (psc - 1)), "invalid frequency");
- /* Prescaler register value determination.
- Prescaler register value conveniently corresponds to bit position,
- i.e., register value for prescaler CLK/64 is 6 ((1 << 6) == 64).*/
- for (i = 0; i < 8; i++) {
- if (psc == (1UL << i)) {
- break;
- }
- }
- /* Set prescaler and clock mode.
- This also sets the following:
- CPWM up-counting mode
- Timer overflow interrupt disabled
- DMA disabled.*/
- pwmp->tpm->SC = TPM_SC_CMOD_LPTPM_CLK | i;
- /* Configure period.*/
- pwmp->tpm->MOD = pwmp->period - 1;
-}
-
-/**
- * @brief Deactivates the PWM peripheral.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- *
- * @notapi
- */
-void pwm_lld_stop(PWMDriver *pwmp) {
-
- /* If in ready state then disables the PWM clock.*/
- if (pwmp->state == PWM_READY) {
-#if KINETIS_PWM_USE_TPM0
- if (&PWMD1 == pwmp) {
- SIM->SCGC6 &= ~SIM_SCGC6_TPM0;
- nvicDisableVector(TPM0_IRQn);
- }
-#endif
-
-#if KINETIS_PWM_USE_TPM1
- if (&PWMD2 == pwmp) {
- SIM->SCGC6 &= ~SIM_SCGC6_TPM1;
- nvicDisableVector(TPM1_IRQn);
- }
-#endif
-
-#if KINETIS_PWM_USE_TPM2
- if (&PWMD3 == pwmp) {
- SIM->SCGC6 &= ~SIM_SCGC6_TPM2;
- nvicDisableVector(TPM2_IRQn);
- }
-#endif
- /* Disable LPTPM counter.*/
- pwmp->tpm->SC = 0;
- pwmp->tpm->MOD = 0;
- }
-}
-
-
-/**
- * @brief Enables a PWM channel.
- * @pre The PWM unit must have been activated using @p pwmStart().
- * @post The channel is active using the specified configuration.
- * @note The function has effect at the next cycle start.
- * @note Channel notification is not enabled.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- * @param[in] channel PWM channel identifier (0...channels-1)
- * @param[in] width PWM pulse width as clock pulses number
- *
- * @notapi
- */
-void pwm_lld_enable_channel(PWMDriver *pwmp,
- pwmchannel_t channel,
- pwmcnt_t width) {
- uint32_t mode = TPM_CnSC_MSB; /* Edge-aligned PWM mode.*/
-
- switch (pwmp->config->channels[channel].mode & PWM_OUTPUT_MASK) {
- case PWM_OUTPUT_ACTIVE_HIGH:
- mode |= TPM_CnSC_ELSB;
- break;
- case PWM_OUTPUT_ACTIVE_LOW:
- mode |= TPM_CnSC_ELSA;
- break;
- }
-
- if (pwmp->tpm->C[channel].SC & TPM_CnSC_CHIE)
- mode |= TPM_CnSC_CHIE;
-
- pwmp->tpm->C[channel].SC = mode;
- pwmp->tpm->C[channel].V = width;
-}
-
-/**
- * @brief Disables a PWM channel and its notification.
- * @pre The PWM unit must have been activated using @p pwmStart().
- * @post The channel is disabled and its output line returned to the
- * idle state.
- * @note The function has effect at the next cycle start.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- * @param[in] channel PWM channel identifier (0...channels-1)
- *
- * @notapi
- */
-void pwm_lld_disable_channel(PWMDriver *pwmp, pwmchannel_t channel) {
-
- pwmp->tpm->C[channel].SC = 0;
- pwmp->tpm->C[channel].V = 0;
-}
-
-/**
- * @brief Enables the periodic activation edge notification.
- * @pre The PWM unit must have been activated using @p pwmStart().
- * @note If the notification is already enabled then the call has no effect.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- *
- * @notapi
- */
-void pwm_lld_enable_periodic_notification(PWMDriver *pwmp) {
-
- pwmp->tpm->SC |= TPM_SC_TOIE;
-}
-
-/**
- * @brief Disables the periodic activation edge notification.
- * @pre The PWM unit must have been activated using @p pwmStart().
- * @note If the notification is already disabled then the call has no effect.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- *
- * @notapi
- */
-void pwm_lld_disable_periodic_notification(PWMDriver *pwmp) {
-
- pwmp->tpm->SC &= ~TPM_SC_TOIE;
-}
-
-/**
- * @brief Enables a channel de-activation edge notification.
- * @pre The PWM unit must have been activated using @p pwmStart().
- * @pre The channel must have been activated using @p pwmEnableChannel().
- * @note If the notification is already enabled then the call has no effect.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- * @param[in] channel PWM channel identifier (0...channels-1)
- *
- * @notapi
- */
-void pwm_lld_enable_channel_notification(PWMDriver *pwmp,
- pwmchannel_t channel) {
-
- pwmp->tpm->C[channel].SC |= TPM_CnSC_CHIE;
-}
-
-/**
- * @brief Disables a channel de-activation edge notification.
- * @pre The PWM unit must have been activated using @p pwmStart().
- * @pre The channel must have been activated using @p pwmEnableChannel().
- * @note If the notification is already disabled then the call has no effect.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- * @param[in] channel PWM channel identifier (0...channels-1)
- *
- * @notapi
- */
-void pwm_lld_disable_channel_notification(PWMDriver *pwmp,
- pwmchannel_t channel) {
-
- pwmp->tpm->C[channel].SC &= ~TPM_CnSC_CHIE;
-}
-
-#endif /* HAL_USE_PWM */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/pwm_lld.h b/os/hal/ports/KINETIS/KL2x/pwm_lld.h
deleted file mode 100644
index fe255bd99..000000000
--- a/os/hal/ports/KINETIS/KL2x/pwm_lld.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2015 Adam J. Porter
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/pwm_lld.h
- * @brief KINETIS PWM subsystem low level driver header.
- *
- * @addtogroup PWM
- * @{
- */
-
-#ifndef _PWM_LLD_H_
-#define _PWM_LLD_H_
-
-#include "kinetis_tpm.h"
-
-#if HAL_USE_PWM || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-#if !defined(KINETIS_PWM_USE_TPM0)
-#define KINETIS_PWM_USE_TPM0 FALSE
-#endif
-#if !defined(KINETIS_PWM_USE_TPM1)
-#define KINETIS_PWM_USE_TPM1 FALSE
-#endif
-#if !defined(KINETIS_PWM_USE_TPM2)
-#define KINETIS_PWM_USE_TPM2 FALSE
-#endif
-
-/**
- * @brief Number of PWM channels per PWM driver.
- */
-#define PWM_CHANNELS 6
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief If advanced timer features switch.
- * @details If set to @p TRUE the advanced features for TIM1 and TIM8 are
- * enabled.
- * @note The default is @p TRUE.
- */
-#if !defined(KINETIS_PWM_USE_ADVANCED) || defined(__DOXYGEN__)
-#define KINETIS_PWM_USE_ADVANCED FALSE
-#endif
-/** @} */
-
-/*===========================================================================*/
-/* Configuration checks. */
-/*===========================================================================*/
-
-#if !KINETIS_PWM_USE_TPM0 && !KINETIS_PWM_USE_TPM1 && !KINETIS_PWM_USE_TPM2
-#error "PWM driver activated but no TPM peripheral assigned"
-#endif
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type of a PWM mode.
- */
-typedef uint32_t pwmmode_t;
-
-/**
- * @brief Type of a PWM channel.
- */
-typedef uint8_t pwmchannel_t;
-
-/**
- * @brief Type of a channels mask.
- */
-typedef uint32_t pwmchnmsk_t;
-
-/**
- * @brief Type of a PWM counter.
- */
-typedef uint16_t pwmcnt_t;
-
-/**
- * @brief Type of a PWM driver channel configuration structure.
- */
-typedef struct {
- /**
- * @brief Channel active logic level.
- */
- pwmmode_t mode;
- /**
- * @brief Channel callback pointer.
- * @note This callback is invoked on the channel compare event. If set to
- * @p NULL then the callback is disabled.
- */
- pwmcallback_t callback;
- /* End of the mandatory fields.*/
-} PWMChannelConfig;
-
-/**
- * @brief Type of a PWM driver configuration structure.
- */
-typedef struct {
- /**
- * @brief Timer clock in Hz.
- * @note The low level can use assertions in order to catch invalid
- * frequency specifications.
- */
- uint32_t frequency;
- /**
- * @brief PWM period in ticks.
- * @note The low level can use assertions in order to catch invalid
- * period specifications.
- */
- pwmcnt_t period;
- /**
- * @brief Periodic callback pointer.
- * @note This callback is invoked on PWM counter reset. If set to
- * @p NULL then the callback is disabled.
- */
- pwmcallback_t callback;
- /**
- * @brief Channels configurations.
- */
- PWMChannelConfig channels[PWM_CHANNELS];
- /* End of the mandatory fields.*/
-} PWMConfig;
-
-/**
- * @brief Structure representing a PWM driver.
- */
-struct PWMDriver {
- /**
- * @brief Driver state.
- */
- pwmstate_t state;
- /**
- * @brief Current driver configuration data.
- */
- const PWMConfig *config;
- /**
- * @brief Current PWM period in ticks.
- */
- pwmcnt_t period;
- /**
- * @brief Mask of the enabled channels.
- */
- pwmchnmsk_t enabled;
- /**
- * @brief Number of channels in this instance.
- */
- pwmchannel_t channels;
-#if defined(PWM_DRIVER_EXT_FIELDS)
- PWM_DRIVER_EXT_FIELDS
-#endif
- /* End of the mandatory fields.*/
- /**
- * @brief Pointer to the TPM registers block.
- */
- TPM_TypeDef *tpm;
-};
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/**
- * @brief Changes the period the PWM peripheral.
- * @details This function changes the period of a PWM unit that has already
- * been activated using @p pwmStart().
- * @pre The PWM unit must have been activated using @p pwmStart().
- * @post The PWM unit period is changed to the new value.
- * @note The function has effect at the next cycle start.
- * @note If a period is specified that is shorter than the pulse width
- * programmed in one of the channels then the behavior is not
- * guaranteed.
- *
- * @param[in] pwmp pointer to a @p PWMDriver object
- * @param[in] period new cycle time in ticks
- *
- * @notapi
- */
-#define pwm_lld_change_period(pwmp, period) \
- ((pwmp)->tpm->MOD = ((period) - 1))
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if KINETIS_PWM_USE_TPM0 || defined(__DOXYGEN__)
-extern PWMDriver PWMD1;
-#endif
-#if KINETIS_PWM_USE_TPM1 || defined(__DOXYGEN__)
-extern PWMDriver PWMD2;
-#endif
-#if KINETIS_PWM_USE_TPM2 || defined(__DOXYGEN__)
-extern PWMDriver PWMD3;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void pwm_lld_init(void);
- void pwm_lld_start(PWMDriver *pwmp);
- void pwm_lld_stop(PWMDriver *pwmp);
- void pwm_lld_enable_channel(PWMDriver *pwmp,
- pwmchannel_t channel,
- pwmcnt_t width);
- void pwm_lld_disable_channel(PWMDriver *pwmp, pwmchannel_t channel);
- void pwm_lld_enable_periodic_notification(PWMDriver *pwmp);
- void pwm_lld_disable_periodic_notification(PWMDriver *pwmp);
- void pwm_lld_enable_channel_notification(PWMDriver *pwmp,
- pwmchannel_t channel);
- void pwm_lld_disable_channel_notification(PWMDriver *pwmp,
- pwmchannel_t channel);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_PWM */
-
-#endif /* _PWM_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/serial_lld.c b/os/hal/ports/KINETIS/KL2x/serial_lld.c
deleted file mode 100644
index 981d8fbba..000000000
--- a/os/hal/ports/KINETIS/KL2x/serial_lld.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2013-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/serial_lld.c
- * @brief Kinetis KL2x Serial Driver subsystem low level driver source.
- *
- * @addtogroup SERIAL
- * @{
- */
-
-#include "osal.h"
-#include "hal.h"
-
-#if HAL_USE_SERIAL || defined(__DOXYGEN__)
-
-#include "kl25z.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/**
- * @brief SD1 driver identifier.
- */
-#if KINETIS_SERIAL_USE_UART0 || defined(__DOXYGEN__)
-SerialDriver SD1;
-#endif
-
-#if KINETIS_SERIAL_USE_UART1 || defined(__DOXYGEN__)
-SerialDriver SD2;
-#endif
-
-#if KINETIS_SERIAL_USE_UART2 || defined(__DOXYGEN__)
-SerialDriver SD3;
-#endif
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/**
- * @brief Driver default configuration.
- */
-static const SerialConfig default_config = {
- 38400
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/**
- * @brief Common IRQ handler.
- * @note Tries hard to clear all the pending interrupt sources, we don't
- * want to go through the whole ISR and have another interrupt soon
- * after.
- *
- * @param[in] u pointer to an UART I/O block
- * @param[in] sdp communication channel associated to the UART
- */
-static void serve_interrupt(SerialDriver *sdp) {
- UARTLP_TypeDef *u = sdp->uart;
-
- if (u->S1 & UARTx_S1_RDRF) {
- osalSysLockFromISR();
- if (iqIsEmptyI(&sdp->iqueue))
- chnAddFlagsI(sdp, CHN_INPUT_AVAILABLE);
- if (iqPutI(&sdp->iqueue, u->D) < MSG_OK)
- chnAddFlagsI(sdp, SD_OVERRUN_ERROR);
- osalSysUnlockFromISR();
- }
-
- if (u->S1 & UARTx_S1_TDRE) {
- msg_t b;
-
- osalSysLockFromISR();
- b = oqGetI(&sdp->oqueue);
- osalSysUnlockFromISR();
-
- if (b < MSG_OK) {
- osalSysLockFromISR();
- chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
- osalSysUnlockFromISR();
- u->C2 &= ~UARTx_C2_TIE;
- } else {
- u->D = b;
- }
- }
-
- if (u->S1 & UARTx_S1_IDLE)
- u->S1 = UARTx_S1_IDLE; // Clear IDLE (S1 bits are write-1-to-clear).
-
- if (u->S1 & (UARTx_S1_OR | UARTx_S1_NF | UARTx_S1_FE | UARTx_S1_PF)) {
- // FIXME: need to add set_error()
- // Clear flags (S1 bits are write-1-to-clear).
- u->S1 = UARTx_S1_OR | UARTx_S1_NF | UARTx_S1_FE | UARTx_S1_PF;
- }
-}
-
-/**
- * @brief Attempts a TX preload
- */
-static void preload(SerialDriver *sdp) {
- UARTLP_TypeDef *u = sdp->uart;
-
- if (u->S1 & UARTx_S1_TDRE) {
- msg_t b = oqGetI(&sdp->oqueue);
- if (b < MSG_OK) {
- chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
- return;
- }
- u->D = b;
- u->C2 |= UARTx_C2_TIE;
- }
-}
-
-/**
- * @brief Driver output notification.
- */
-#if KINETIS_SERIAL_USE_UART0 || defined(__DOXYGEN__)
-static void notify1(io_queue_t *qp)
-{
- (void)qp;
- preload(&SD1);
-}
-#endif
-
-#if KINETIS_SERIAL_USE_UART1 || defined(__DOXYGEN__)
-static void notify2(io_queue_t *qp)
-{
- (void)qp;
- preload(&SD2);
-}
-#endif
-
-#if KINETIS_SERIAL_USE_UART2 || defined(__DOXYGEN__)
-static void notify3(io_queue_t *qp)
-{
- (void)qp;
- preload(&SD3);
-}
-#endif
-
-/**
- * @brief Common UART configuration.
- *
- */
-static void configure_uart(UARTLP_TypeDef *uart, const SerialConfig *config)
-{
- uint32_t uart_clock;
-
- uart->C1 = 0;
- uart->C3 = UARTx_C3_ORIE | UARTx_C3_NEIE | UARTx_C3_FEIE | UARTx_C3_PEIE;
- uart->S1 = UARTx_S1_IDLE | UARTx_S1_OR | UARTx_S1_NF | UARTx_S1_FE | UARTx_S1_PF;
- while (uart->S1 & UARTx_S1_RDRF) {
- (void)uart->D;
- }
-
-#if KINETIS_SERIAL_USE_UART0
- if (uart == UART0) {
- /* UART0 can be clocked from several sources. */
- uart_clock = KINETIS_UART0_CLOCK_FREQ;
- }
-#endif
-#if KINETIS_SERIAL_USE_UART1
- if (uart == UART1) {
- uart_clock = KINETIS_BUSCLK_FREQUENCY;
- }
-#endif
-#if KINETIS_SERIAL_USE_UART2
- if (uart == UART2) {
- uart_clock = KINETIS_BUSCLK_FREQUENCY;
- }
-#endif
-
- /* FIXME: change fixed OSR = 16 to dynamic value based on baud */
- uint16_t divisor = (uart_clock / 16) / config->sc_speed;
- uart->C4 = UARTx_C4_OSR & (16 - 1);
- uart->BDH = (divisor >> 8) & UARTx_BDH_SBR;
- uart->BDL = (divisor & UARTx_BDL_SBR);
-
- uart->C2 = UARTx_C2_RE | UARTx_C2_RIE | UARTx_C2_TE;
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-#if KINETIS_SERIAL_USE_UART0 || defined(__DOXYGEN__)
-OSAL_IRQ_HANDLER(Vector70) {
-
- OSAL_IRQ_PROLOGUE();
- serve_interrupt(&SD1);
- OSAL_IRQ_EPILOGUE();
-}
-#endif
-
-#if KINETIS_SERIAL_USE_UART1 || defined(__DOXYGEN__)
-OSAL_IRQ_HANDLER(Vector74) {
-
- OSAL_IRQ_PROLOGUE();
- serve_interrupt(&SD2);
- OSAL_IRQ_EPILOGUE();
-}
-#endif
-
-#if KINETIS_SERIAL_USE_UART2 || defined(__DOXYGEN__)
-OSAL_IRQ_HANDLER(Vector78) {
-
- OSAL_IRQ_PROLOGUE();
- serve_interrupt(&SD3);
- OSAL_IRQ_EPILOGUE();
-}
-#endif
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level serial driver initialization.
- *
- * @notapi
- */
-void sd_lld_init(void) {
-
-#if KINETIS_SERIAL_USE_UART0
- /* Driver initialization.*/
- sdObjectInit(&SD1, NULL, notify1);
- SD1.uart = UART0;
-#endif
-
-#if KINETIS_SERIAL_USE_UART1
- /* Driver initialization.*/
- sdObjectInit(&SD2, NULL, notify2);
- SD2.uart = UART1;
-#endif
-
-#if KINETIS_SERIAL_USE_UART2
- /* Driver initialization.*/
- sdObjectInit(&SD3, NULL, notify3);
- SD3.uart = UART2;
-#endif
-}
-
-/**
- * @brief Low level serial driver configuration and (re)start.
- *
- * @param[in] sdp pointer to a @p SerialDriver object
- * @param[in] config the architecture-dependent serial driver configuration.
- * If this parameter is set to @p NULL then a default
- * configuration is used.
- *
- * @notapi
- */
-void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) {
-
- if (config == NULL)
- config = &default_config;
-
- if (sdp->state == SD_STOP) {
- /* Enables the peripheral.*/
-
-#if KINETIS_SERIAL_USE_UART0
- if (sdp == &SD1) {
- SIM->SCGC4 |= SIM_SCGC4_UART0;
- SIM->SOPT2 =
- (SIM->SOPT2 & ~SIM_SOPT2_UART0SRC_MASK) |
- SIM_SOPT2_UART0SRC(KINETIS_UART0_CLOCK_SRC);
- configure_uart(sdp->uart, config);
- nvicEnableVector(UART0_IRQn, KINETIS_SERIAL_UART0_PRIORITY);
- }
-#endif /* KINETIS_SERIAL_USE_UART0 */
-
-#if KINETIS_SERIAL_USE_UART1
- if (sdp == &SD2) {
- SIM->SCGC4 |= SIM_SCGC4_UART1;
- configure_uart(sdp->uart, config);
- nvicEnableVector(UART1_IRQn, KINETIS_SERIAL_UART1_PRIORITY);
- }
-#endif /* KINETIS_SERIAL_USE_UART1 */
-
-#if KINETIS_SERIAL_USE_UART2
- if (sdp == &SD3) {
- SIM->SCGC4 |= SIM_SCGC4_UART2;
- configure_uart(sdp->uart, config);
- nvicEnableVector(UART2_IRQn, KINETIS_SERIAL_UART2_PRIORITY);
- }
-#endif /* KINETIS_SERIAL_USE_UART2 */
-
- }
- /* Configures the peripheral.*/
-
-}
-
-/**
- * @brief Low level serial driver stop.
- * @details De-initializes the USART, stops the associated clock, resets the
- * interrupt vector.
- *
- * @param[in] sdp pointer to a @p SerialDriver object
- *
- * @notapi
- */
-void sd_lld_stop(SerialDriver *sdp) {
-
- if (sdp->state == SD_READY) {
- /* TODO: Resets the peripheral.*/
-
-#if KINETIS_SERIAL_USE_UART0
- if (sdp == &SD1) {
- nvicDisableVector(UART0_IRQn);
- SIM->SCGC4 &= ~SIM_SCGC4_UART0;
- }
-#endif
-
-#if KINETIS_SERIAL_USE_UART1
- if (sdp == &SD2) {
- nvicDisableVector(UART1_IRQn);
- SIM->SCGC4 &= ~SIM_SCGC4_UART1;
- }
-#endif
-
-#if KINETIS_SERIAL_USE_UART2
- if (sdp == &SD3) {
- nvicDisableVector(UART2_IRQn);
- SIM->SCGC4 &= ~SIM_SCGC4_UART2;
- }
-#endif
- }
-}
-
-#endif /* HAL_USE_SERIAL */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/serial_lld.h b/os/hal/ports/KINETIS/KL2x/serial_lld.h
deleted file mode 100644
index 2d003b078..000000000
--- a/os/hal/ports/KINETIS/KL2x/serial_lld.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2013-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KL2x/serial_lld.h
- * @brief Kinetis KL2x Serial Driver subsystem low level driver header.
- *
- * @addtogroup SERIAL
- * @{
- */
-
-#ifndef _SERIAL_LLD_H_
-#define _SERIAL_LLD_H_
-
-#if HAL_USE_SERIAL || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief SD1 driver enable switch.
- * @details If set to @p TRUE the support for SD1 is included.
- */
-#if !defined(KINETIS_SERIAL_USE_UART0) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_USE_UART0 FALSE
-#endif
-/**
- * @brief SD2 driver enable switch.
- * @details If set to @p TRUE the support for SD2 is included.
- */
-#if !defined(KINETIS_SERIAL_USE_UART1) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_USE_UART1 FALSE
-#endif
-/**
- * @brief SD3 driver enable switch.
- * @details If set to @p TRUE the support for SD3 is included.
- */
-#if !defined(KINETIS_SERIAL_USE_UART2) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_USE_UART2 FALSE
-#endif
-
-/**
- * @brief UART0 interrupt priority level setting.
- */
-#if !defined(KINETIS_SERIAL_UART0_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_UART0_PRIORITY 12
-#endif
-
-/**
- * @brief UART1 interrupt priority level setting.
- */
-#if !defined(KINETIS_SERIAL_UART1_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_UART1_PRIORITY 12
-#endif
-
-/**
- * @brief UART2 interrupt priority level setting.
- */
-#if !defined(KINETIS_SERIAL_UART2_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_SERIAL_UART2_PRIORITY 12
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief Generic Serial Driver configuration structure.
- * @details An instance of this structure must be passed to @p sdStart()
- * in order to configure and start a serial driver operations.
- * @note Implementations may extend this structure to contain more,
- * architecture dependent, fields.
- */
-typedef struct {
- /**
- * @brief Bit rate.
- */
- uint32_t sc_speed;
- /* End of the mandatory fields.*/
-} SerialConfig;
-
-/**
- * @brief @p SerialDriver specific data.
- */
-#define _serial_driver_data \
- _base_asynchronous_channel_data \
- /* Driver state.*/ \
- sdstate_t state; \
- /* Input queue.*/ \
- input_queue_t iqueue; \
- /* Output queue.*/ \
- output_queue_t oqueue; \
- /* Input circular buffer.*/ \
- uint8_t ib[SERIAL_BUFFERS_SIZE]; \
- /* Output circular buffer.*/ \
- uint8_t ob[SERIAL_BUFFERS_SIZE]; \
- /* End of the mandatory fields.*/ \
- /* Pointer to the UART registers block.*/ \
- UARTLP_TypeDef *uart;
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if KINETIS_SERIAL_USE_UART0 && !defined(__DOXYGEN__)
-extern SerialDriver SD1;
-#endif
-
-#if KINETIS_SERIAL_USE_UART1 && !defined(__DOXYGEN__)
-extern SerialDriver SD2;
-#endif
-
-#if KINETIS_SERIAL_USE_UART2 && !defined(__DOXYGEN__)
-extern SerialDriver SD3;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void sd_lld_init(void);
- void sd_lld_start(SerialDriver *sdp, const SerialConfig *config);
- void sd_lld_stop(SerialDriver *sdp);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_SERIAL */
-
-#endif /* _SERIAL_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/st_lld.c b/os/hal/ports/KINETIS/KL2x/st_lld.c
deleted file mode 100644
index 1f8cb6320..000000000
--- a/os/hal/ports/KINETIS/KL2x/st_lld.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/KL2x/st_lld.c
- * @brief ST Driver subsystem low level driver code.
- *
- * @addtogroup ST
- * @{
- */
-
-#include "hal.h"
-
-#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-#if (OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC) || defined(__DOXYGEN__)
-/**
- * @brief System Timer vector.
- * @details This interrupt is used for system tick in periodic mode.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(SysTick_Handler) {
-
- OSAL_IRQ_PROLOGUE();
-
- osalSysLockFromISR();
- osalOsTimerHandlerI();
- osalSysUnlockFromISR();
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level ST driver initialization.
- *
- * @notapi
- */
-void st_lld_init(void) {
-#if OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC
- /* Periodic systick mode, the Cortex-Mx internal systick timer is used
- in this mode.*/
- SysTick->LOAD = (KINETIS_SYSCLK_FREQUENCY / OSAL_ST_FREQUENCY) - 1;
- SysTick->VAL = 0;
- SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
- SysTick_CTRL_ENABLE_Msk |
- SysTick_CTRL_TICKINT_Msk;
-
- /* IRQ enabled.*/
- nvicSetSystemHandlerPriority(HANDLER_SYSTICK, KINETIS_ST_IRQ_PRIORITY);
-#endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */
-}
-
-#endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/KL2x/st_lld.h b/os/hal/ports/KINETIS/KL2x/st_lld.h
deleted file mode 100644
index 24044e5f7..000000000
--- a/os/hal/ports/KINETIS/KL2x/st_lld.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/st_lld.h
- * @brief ST Driver subsystem low level driver header.
- * @details This header is designed to be include-able without having to
- * include other files from the HAL.
- *
- * @addtogroup ST
- * @{
- */
-
-#ifndef _ST_LLD_H_
-#define _ST_LLD_H_
-
-#include "mcuconf.h"
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief SysTick timer IRQ priority.
- */
-#if !defined(KINETIS_ST_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_ST_IRQ_PRIORITY 8
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void st_lld_init(void);
-#ifdef __cplusplus
-}
-#endif
-
-/*===========================================================================*/
-/* Driver inline functions. */
-/*===========================================================================*/
-
-/**
- * @brief Returns the time counter value.
- *
- * @return The counter value.
- *
- * @notapi
- */
-static inline systime_t st_lld_get_counter(void) {
-
- return (systime_t)0;
-}
-
-/**
- * @brief Starts the alarm.
- * @note Makes sure that no spurious alarms are triggered after
- * this call.
- *
- * @param[in] time the time to be set for the first alarm
- *
- * @notapi
- */
-static inline void st_lld_start_alarm(systime_t time) {
-
- (void)time;
-}
-
-/**
- * @brief Stops the alarm interrupt.
- *
- * @notapi
- */
-static inline void st_lld_stop_alarm(void) {
-
-}
-
-/**
- * @brief Sets the alarm time.
- *
- * @param[in] time the time to be set for the next alarm
- *
- * @notapi
- */
-static inline void st_lld_set_alarm(systime_t time) {
-
- (void)time;
-}
-
-/**
- * @brief Returns the current alarm time.
- *
- * @return The currently set alarm time.
- *
- * @notapi
- */
-static inline systime_t st_lld_get_alarm(void) {
-
- return (systime_t)0;
-}
-
-/**
- * @brief Determines if the alarm is active.
- *
- * @return The alarm status.
- * @retval false if the alarm is not active.
- * @retval true is the alarm is active
- *
- * @notapi
- */
-static inline bool st_lld_is_alarm_active(void) {
-
- return false;
-}
-
-#endif /* _ST_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/LLD/adc_lld.c b/os/hal/ports/KINETIS/LLD/adc_lld.c
deleted file mode 100644
index c0904c8b3..000000000
--- a/os/hal/ports/KINETIS/LLD/adc_lld.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Derek Mulcahy
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/LLD/adc_lld.c
- * @brief KINETIS ADC subsystem low level driver source.
- *
- * @addtogroup ADC
- * @{
- */
-
-#include "hal.h"
-
-#if HAL_USE_ADC || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-#define ADC_CHANNEL_MASK 0x1f
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/** @brief ADC1 driver identifier.*/
-#if KINETIS_ADC_USE_ADC0 || defined(__DOXYGEN__)
-ADCDriver ADCD1;
-#endif
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static void calibrate(ADCDriver *adcp) {
-
- /* Clock Divide by 8, Use Bus Clock Div 2 */
- /* At 48MHz this results in ADCCLK of 48/8/2 == 3MHz */
- adcp->adc->CFG1 = ADCx_CFG1_ADIV(ADCx_CFG1_ADIV_DIV_8) |
- ADCx_CFG1_ADICLK(ADCx_CFG1_ADIVCLK_BUS_CLOCK_DIV_2);
-
- /* Use software trigger and disable DMA etc. */
- adcp->adc->SC2 = 0;
-
- /* Enable Hardware Average, Average 32 Samples, Calibrate */
- adcp->adc->SC3 = ADCx_SC3_AVGE |
- ADCx_SC3_AVGS(ADCx_SC3_AVGS_AVERAGE_32_SAMPLES) |
- ADCx_SC3_CAL;
-
- /* FIXME: May take several ms. Use an interrupt instead of busy wait */
- /* Wait for calibration completion */
- while (!(adcp->adc->SC1A & ADCx_SC1n_COCO))
- ;
-
- uint16_t gain = ((adcp->adc->CLP0 + adcp->adc->CLP1 + adcp->adc->CLP2 +
- adcp->adc->CLP3 + adcp->adc->CLP4 + adcp->adc->CLPS) / 2) | 0x8000;
- adcp->adc->PG = gain;
-
- gain = ((adcp->adc->CLM0 + adcp->adc->CLM1 + adcp->adc->CLM2 +
- adcp->adc->CLM3 + adcp->adc->CLM4 + adcp->adc->CLMS) / 2) | 0x8000;
- adcp->adc->MG = gain;
-
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-#if KINETIS_ADC_USE_ADC0 || defined(__DOXYGEN__)
-/**
- * @brief ADC interrupt handler.
- *
- * @isr
- */
-OSAL_IRQ_HANDLER(KINETIS_ADC0_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- ADCDriver *adcp = &ADCD1;
-
- /* Disable Interrupt, Disable Channel */
- adcp->adc->SC1A = ADCx_SC1n_ADCH(ADCx_SC1n_ADCH_DISABLED);
-
- /* Read the sample into the buffer */
- adcp->samples[adcp->current_index++] = adcp->adc->RA;
-
- bool more = true;
-
- /* At the end of the buffer then we may be finished */
- if (adcp->current_index == adcp->number_of_samples) {
- _adc_isr_full_code(&ADCD1);
-
- adcp->current_index = 0;
-
- /* We are never finished in circular mode */
- more = ADCD1.grpp->circular;
- }
-
- if (more) {
-
- /* Signal half completion in circular mode. */
- if (ADCD1.grpp->circular &&
- (adcp->current_index == (adcp->number_of_samples / 2))) {
-
- _adc_isr_half_code(&ADCD1);
- }
-
- /* Skip to the next channel */
- do {
- adcp->current_channel = (adcp->current_channel + 1) & ADC_CHANNEL_MASK;
- } while (((1 << adcp->current_channel) & adcp->grpp->channel_mask) == 0);
-
- /* Enable Interrupt, Select the Channel */
- adcp->adc->SC1A = ADCx_SC1n_AIEN | ADCx_SC1n_ADCH(adcp->current_channel);
- }
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level ADC driver initialization.
- *
- * @notapi
- */
-void adc_lld_init(void) {
-
-#if KINETIS_ADC_USE_ADC0
- /* Driver initialization.*/
- adcObjectInit(&ADCD1);
-#endif
-
- /* The shared vector is initialized on driver initialization and never
- disabled.*/
- nvicEnableVector(ADC0_IRQn, KINETIS_ADC_IRQ_PRIORITY);
-}
-
-/**
- * @brief Configures and activates the ADC peripheral.
- *
- * @param[in] adcp pointer to the @p ADCDriver object
- *
- * @notapi
- */
-void adc_lld_start(ADCDriver *adcp) {
-
- /* If in stopped state then enables the ADC clock.*/
- if (adcp->state == ADC_STOP) {
- SIM->SCGC6 |= SIM_SCGC6_ADC0;
-
-#if KINETIS_ADC_USE_ADC0
- if (&ADCD1 == adcp) {
- adcp->adc = ADC0;
- if (adcp->config->calibrate) {
- calibrate(adcp);
- }
- }
-#endif /* KINETIS_ADC_USE_ADC0 */
- }
-}
-
-/**
- * @brief Deactivates the ADC peripheral.
- *
- * @param[in] adcp pointer to the @p ADCDriver object
- *
- * @notapi
- */
-void adc_lld_stop(ADCDriver *adcp) {
-
- /* If in ready state then disables the ADC clock.*/
- if (adcp->state == ADC_READY) {
- SIM->SCGC6 &= ~SIM_SCGC6_ADC0;
-
-#if KINETIS_ADC_USE_ADC0
- if (&ADCD1 == adcp) {
- /* Disable Interrupt, Disable Channel */
- adcp->adc->SC1A = ADCx_SC1n_ADCH(ADCx_SC1n_ADCH_DISABLED);
- }
-#endif
- }
-}
-
-/**
- * @brief Starts an ADC conversion.
- *
- * @param[in] adcp pointer to the @p ADCDriver object
- *
- * @notapi
- */
-void adc_lld_start_conversion(ADCDriver *adcp) {
- const ADCConversionGroup *grpp = adcp->grpp;
-
- /* Enable the Bandgap Buffer if channel mask includes BANDGAP */
- if (grpp->channel_mask & ADC_BANDGAP) {
- PMC->REGSC |= PMC_REGSC_BGBE;
- }
-
- adcp->number_of_samples = adcp->depth * grpp->num_channels;
- adcp->current_index = 0;
-
- /* Skip to the next channel */
- adcp->current_channel = 0;
- while (((1 << adcp->current_channel) & grpp->channel_mask) == 0) {
- adcp->current_channel = (adcp->current_channel + 1) & ADC_CHANNEL_MASK;
- }
-
- /* Set clock speed and conversion size */
- adcp->adc->CFG1 = grpp->cfg1;
-
- /* Set averaging */
- adcp->adc->SC3 = grpp->sc3;
-
- /* Enable Interrupt, Select Channel */
- adcp->adc->SC1A = ADCx_SC1n_AIEN | ADCx_SC1n_ADCH(adcp->current_channel);
-}
-
-/**
- * @brief Stops an ongoing conversion.
- *
- * @param[in] adcp pointer to the @p ADCDriver object
- *
- * @notapi
- */
-void adc_lld_stop_conversion(ADCDriver *adcp) {
- const ADCConversionGroup *grpp = adcp->grpp;
-
- /* Disable the Bandgap buffer if channel mask includes BANDGAP */
- if (grpp->channel_mask & ADC_BANDGAP) {
- /* Clear BGBE, ACKISO is w1c, avoid setting */
- PMC->REGSC &= ~(PMC_REGSC_BGBE | PMC_REGSC_ACKISO);
- }
-
-}
-
-#endif /* HAL_USE_ADC */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/LLD/adc_lld.h b/os/hal/ports/KINETIS/LLD/adc_lld.h
deleted file mode 100644
index 22db2c046..000000000
--- a/os/hal/ports/KINETIS/LLD/adc_lld.h
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Derek Mulcahy
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/LLD/adc_lld.h
- * @brief KINETIS ADC subsystem low level driver header.
- *
- * @addtogroup ADC
- * @{
- */
-
-#ifndef _ADC_LLD_H_
-#define _ADC_LLD_H_
-
-#if HAL_USE_ADC || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/**
- * @name Absolute Maximum Ratings
- * @{
- */
-/**
- * @brief Minimum ADC clock frequency.
- */
-#define KINETIS_ADCCLK_MIN 600000
-
-/**
- * @brief Maximum ADC clock frequency.
- */
-#define KINETIS_ADCCLK_MAX 36000000
-
-#define ADCx_SC3_AVGS_AVERAGE_4_SAMPLES 0
-#define ADCx_SC3_AVGS_AVERAGE_8_SAMPLES 1
-#define ADCx_SC3_AVGS_AVERAGE_16_SAMPLES 2
-#define ADCx_SC3_AVGS_AVERAGE_32_SAMPLES 3
-
-#define ADCx_CFG1_ADIV_DIV_1 0
-#define ADCx_CFG1_ADIV_DIV_2 1
-#define ADCx_CFG1_ADIV_DIV_4 2
-#define ADCx_CFG1_ADIV_DIV_8 3
-
-#define ADCx_CFG1_ADIVCLK_BUS_CLOCK 0
-#define ADCx_CFG1_ADIVCLK_BUS_CLOCK_DIV_2 1
-#define ADCx_CFG1_ADIVCLK_BUS_ALTCLK 2
-#define ADCx_CFG1_ADIVCLK_BUS_ADACK 3
-
-#define ADCx_CFG1_MODE_8_OR_9_BITS 0
-#define ADCx_CFG1_MODE_12_OR_13_BITS 1
-#define ADCx_CFG1_MODE_10_OR_11_BITS 2
-#define ADCx_CFG1_MODE_16_BITS 3
-
-#define ADCx_SC1n_ADCH_DAD0 0
-#define ADCx_SC1n_ADCH_DAD1 1
-#define ADCx_SC1n_ADCH_DAD2 2
-#define ADCx_SC1n_ADCH_DAD3 3
-#define ADCx_SC1n_ADCH_DADP0 0
-#define ADCx_SC1n_ADCH_DADP1 1
-#define ADCx_SC1n_ADCH_DADP2 2
-#define ADCx_SC1n_ADCH_DADP3 3
-#define ADCx_SC1n_ADCH_AD4 4
-#define ADCx_SC1n_ADCH_AD5 5
-#define ADCx_SC1n_ADCH_AD6 6
-#define ADCx_SC1n_ADCH_AD7 7
-#define ADCx_SC1n_ADCH_AD8 8
-#define ADCx_SC1n_ADCH_AD9 9
-#define ADCx_SC1n_ADCH_AD10 10
-#define ADCx_SC1n_ADCH_AD11 11
-#define ADCx_SC1n_ADCH_AD12 12
-#define ADCx_SC1n_ADCH_AD13 13
-#define ADCx_SC1n_ADCH_AD14 14
-#define ADCx_SC1n_ADCH_AD15 15
-#define ADCx_SC1n_ADCH_AD16 16
-#define ADCx_SC1n_ADCH_AD17 17
-#define ADCx_SC1n_ADCH_AD18 18
-#define ADCx_SC1n_ADCH_AD19 19
-#define ADCx_SC1n_ADCH_AD20 20
-#define ADCx_SC1n_ADCH_AD21 21
-#define ADCx_SC1n_ADCH_AD22 22
-#define ADCx_SC1n_ADCH_AD23 23
-#define ADCx_SC1n_ADCH_TEMP_SENSOR 26
-#define ADCx_SC1n_ADCH_BANDGAP 27
-#define ADCx_SC1n_ADCH_VREFSH 29
-#define ADCx_SC1n_ADCH_VREFSL 30
-#define ADCx_SC1n_ADCH_DISABLED 31
-
-#define ADC_DAD0 (1 << ADCx_SC1n_ADCH_DAD0)
-#define ADC_DAD1 (1 << ADCx_SC1n_ADCH_DAD1)
-#define ADC_DAD2 (1 << ADCx_SC1n_ADCH_DAD2)
-#define ADC_DAD3 (1 << ADCx_SC1n_ADCH_DAD3)
-#define ADC_DADP0 (1 << ADCx_SC1n_ADCH_DADP0)
-#define ADC_DADP1 (1 << ADCx_SC1n_ADCH_DADP1)
-#define ADC_DADP2 (1 << ADCx_SC1n_ADCH_DADP2)
-#define ADC_DADP3 (1 << ADCx_SC1n_ADCH_DADP3)
-#define ADC_AD4 (1 << ADCx_SC1n_ADCH_AD4)
-#define ADC_AD5 (1 << ADCx_SC1n_ADCH_AD5)
-#define ADC_AD6 (1 << ADCx_SC1n_ADCH_AD6)
-#define ADC_AD7 (1 << ADCx_SC1n_ADCH_AD7)
-#define ADC_AD8 (1 << ADCx_SC1n_ADCH_AD8)
-#define ADC_AD9 (1 << ADCx_SC1n_ADCH_AD9)
-#define ADC_AD10 (1 << ADCx_SC1n_ADCH_AD10)
-#define ADC_AD11 (1 << ADCx_SC1n_ADCH_AD11)
-#define ADC_AD12 (1 << ADCx_SC1n_ADCH_AD12)
-#define ADC_AD13 (1 << ADCx_SC1n_ADCH_AD13)
-#define ADC_AD14 (1 << ADCx_SC1n_ADCH_AD14)
-#define ADC_AD15 (1 << ADCx_SC1n_ADCH_AD15)
-#define ADC_AD16 (1 << ADCx_SC1n_ADCH_AD16)
-#define ADC_AD17 (1 << ADCx_SC1n_ADCH_AD17)
-#define ADC_AD18 (1 << ADCx_SC1n_ADCH_AD18)
-#define ADC_AD19 (1 << ADCx_SC1n_ADCH_AD19)
-#define ADC_AD20 (1 << ADCx_SC1n_ADCH_AD20)
-#define ADC_AD21 (1 << ADCx_SC1n_ADCH_AD21)
-#define ADC_AD22 (1 << ADCx_SC1n_ADCH_AD22)
-#define ADC_AD23 (1 << ADCx_SC1n_ADCH_AD23)
-#define ADC_TEMP_SENSOR (1 << ADCx_SC1n_ADCH_TEMP_SENSOR)
-#define ADC_BANDGAP (1 << ADCx_SC1n_ADCH_BANDGAP)
-#define ADC_VREFSH (1 << ADCx_SC1n_ADCH_VREFSH)
-#define ADC_VREFSL (1 << ADCx_SC1n_ADCH_VREFSL)
-#define ADC_DISABLED (1 << ADCx_SC1n_ADCH_DISABLED)
-
-/** @} */
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-
-/**
- * @brief ADC1 driver enable switch.
- * @details If set to @p TRUE the support for ADC1 is included.
- * @note The default is @p TRUE.
- */
-#if !defined(KINETIS_ADC_USE_ADC0) || defined(__DOXYGEN__)
-#define KINETIS_ADC_USE_ADC0 FALSE
-#endif
-
-/**
- * @brief ADC interrupt priority level setting.
- */
-#if !defined(KINETIS_ADC_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_ADC_IRQ_PRIORITY 5
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-#if KINETIS_ADC_USE_ADC0 && !KINETIS_HAS_ADC0
-#error "ADC1 not present in the selected device"
-#endif
-
-#if !KINETIS_ADC_USE_ADC0
-#error "ADC driver activated but no ADC peripheral assigned"
-#endif
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief ADC sample data type.
- */
-typedef uint16_t adcsample_t;
-
-/**
- * @brief Channels number in a conversion group.
- */
-typedef uint16_t adc_channels_num_t;
-
-/**
- * @brief Possible ADC failure causes.
- * @note Error codes are architecture dependent and should not relied
- * upon.
- */
-typedef enum {
- ADC_ERR_DMAFAILURE = 0, /**< DMA operations failure. */
- ADC_ERR_OVERFLOW = 1 /**< ADC overflow condition. */
-} adcerror_t;
-
-/**
- * @brief Type of a structure representing an ADC driver.
- */
-typedef struct ADCDriver ADCDriver;
-
-/**
- * @brief ADC notification callback type.
- *
- * @param[in] adcp pointer to the @p ADCDriver object triggering the
- * callback
- * @param[in] buffer pointer to the most recent samples data
- * @param[in] n number of buffer rows available starting from @p buffer
- */
-typedef void (*adccallback_t)(ADCDriver *adcp, adcsample_t *buffer, size_t n);
-
-/**
- * @brief ADC error callback type.
- *
- * @param[in] adcp pointer to the @p ADCDriver object triggering the
- * callback
- * @param[in] err ADC error code
- */
-typedef void (*adcerrorcallback_t)(ADCDriver *adcp, adcerror_t err);
-
-/**
- * @brief Conversion group configuration structure.
- * @details This implementation-dependent structure describes a conversion
- * operation.
- */
-typedef struct {
- /**
- * @brief Enables the circular buffer mode for the group.
- */
- bool circular;
- /**
- * @brief Number of the analog channels belonging to the conversion group.
- */
- adc_channels_num_t num_channels;
- /**
- * @brief Callback function associated to the group or @p NULL.
- */
- adccallback_t end_cb;
- /**
- * @brief Error callback or @p NULL.
- */
- adcerrorcallback_t error_cb;
- /* End of the mandatory fields.*/
- /**
- * @brief Bitmask of channels for ADC conversion.
- */
- uint32_t channel_mask;
- /**
- * @brief ADC CFG1 register initialization data.
- * @note All the required bits must be defined into this field.
- */
- uint32_t cfg1;
- /**
- * @brief ADC SC3 register initialization data.
- * @note All the required bits must be defined into this field.
- */
- uint32_t sc3;
-} ADCConversionGroup;
-
-/**
- * @brief Driver configuration structure.
- * @note It could be empty on some architectures.
- */
-typedef struct {
- /* Perform first time calibration */
- bool calibrate;
-} ADCConfig;
-
-/**
- * @brief Structure representing an ADC driver.
- */
-struct ADCDriver {
- /**
- * @brief Driver state.
- */
- adcstate_t state;
- /**
- * @brief Current configuration data.
- */
- const ADCConfig *config;
- /**
- * @brief Current samples buffer pointer or @p NULL.
- */
- adcsample_t *samples;
- /**
- * @brief Current samples buffer depth or @p 0.
- */
- size_t depth;
- /**
- * @brief Current conversion group pointer or @p NULL.
- */
- const ADCConversionGroup *grpp;
-#if ADC_USE_WAIT || defined(__DOXYGEN__)
- /**
- * @brief Waiting thread.
- */
- thread_reference_t thread;
-#endif
-#if ADC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__)
- /**
- * @brief Mutex protecting the peripheral.
- */
- mutex_t mutex;
-#endif /* ADC_USE_MUTUAL_EXCLUSION */
-#if defined(ADC_DRIVER_EXT_FIELDS)
- ADC_DRIVER_EXT_FIELDS
-#endif
- /* End of the mandatory fields.*/
- /**
- * @brief Pointer to the ADCx registers block.
- */
- ADC_TypeDef *adc;
- /**
- * @brief Number of samples expected.
- */
- size_t number_of_samples;
- /**
- * @brief Current position in the buffer.
- */
- size_t current_index;
- /**
- * @brief Current channel index into group channel_mask.
- */
- size_t current_channel;
-};
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if KINETIS_ADC_USE_ADC0 && !defined(__DOXYGEN__)
-extern ADCDriver ADCD1;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void adc_lld_init(void);
- void adc_lld_start(ADCDriver *adcp);
- void adc_lld_stop(ADCDriver *adcp);
- void adc_lld_start_conversion(ADCDriver *adcp);
- void adc_lld_stop_conversion(ADCDriver *adcp);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_ADC */
-
-#endif /* _ADC_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/LLD/ext_lld.c b/os/hal/ports/KINETIS/LLD/ext_lld.c
deleted file mode 100644
index e85f0328c..000000000
--- a/os/hal/ports/KINETIS/LLD/ext_lld.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Derek Mulcahy
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/LLD/ext_lld.c
- * @brief KINETIS EXT subsystem low level driver source.
- *
- * @addtogroup EXT
- * @{
- */
-
-#include "hal.h"
-
-#if HAL_USE_EXT || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-#define PCR_IRQC_DISABLED 0x0
-#define PCR_IRQC_DMA_RISING_EDGE 0x1
-#define PCR_IRQC_DMA_FALLING_EDGE 0x2
-#define PCR_IRQC_DMA_EITHER_EDGE 0x3
-
-#define PCR_IRQC_LOGIC_ZERO 0x8
-#define PCR_IRQC_RISING_EDGE 0x9
-#define PCR_IRQC_FALLING_EDGE 0xA
-#define PCR_IRQC_EITHER_EDGE 0xB
-#define PCR_IRQC_LOGIC_ONE 0xC
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/**
- * @brief EXTD1 driver identifier.
- */
-EXTDriver EXTD1;
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/* A channel map for each channel.
- *
- * The index is the pin number.
- * The result is the channel for that pin.
- */
-#if KINETIS_EXT_PORTA_WIDTH > 0
-uint8_t porta_channel_map[KINETIS_EXT_PORTA_WIDTH];
-#endif
-#if KINETIS_EXT_PORTB_WIDTH > 0
-uint8_t portb_channel_map[KINETIS_EXT_PORTB_WIDTH];
-#endif
-#if KINETIS_EXT_PORTC_WIDTH > 0
-uint8_t portc_channel_map[KINETIS_EXT_PORTC_WIDTH];
-#endif
-#if KINETIS_EXT_PORTD_WIDTH > 0
-uint8_t portd_channel_map[KINETIS_EXT_PORTD_WIDTH];
-#endif
-#if KINETIS_EXT_PORTE_WIDTH > 0
-uint8_t porte_channel_map[KINETIS_EXT_PORTE_WIDTH];
-#endif
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/**
- * @brief Enables EXTI IRQ sources.
- *
- * @notapi
- */
-static void ext_lld_exti_irq_enable(void) {
-
-#if KINETIS_EXT_PORTA_WIDTH > 0
- nvicEnableVector(PINA_IRQn, KINETIS_EXT_PORTA_IRQ_PRIORITY);
-#endif
-#if KINETIS_EXT_PORTB_WIDTH > 0
- nvicEnableVector(PINB_IRQn, KINETIS_EXT_PORTB_IRQ_PRIORITY);
-#endif
-#if KINETIS_EXT_PORTC_WIDTH > 0
- nvicEnableVector(PINC_IRQn, KINETIS_EXT_PORTC_IRQ_PRIORITY);
-#endif
-#if KINETIS_EXT_PORTD_WIDTH > 0
- nvicEnableVector(PIND_IRQn, KINETIS_EXT_PORTD_IRQ_PRIORITY);
-#endif
-#if KINETIS_EXT_PORTE_WIDTH > 0
- nvicEnableVector(PINE_IRQn, KINETIS_EXT_PORTE_IRQ_PRIORITY);
-#endif
-}
-
-/**
- * @brief Disables EXTI IRQ sources.
- *
- * @notapi
- */
-static void ext_lld_exti_irq_disable(void) {
-
-#if KINETIS_EXT_PORTA_WIDTH > 0
- nvicDisableVector(PINA_IRQn);
-#endif
-#if KINETIS_EXT_PORTB_WIDTH > 0
- nvicDisableVector(PINB_IRQn);
-#endif
-#if KINETIS_EXT_PORTC_WIDTH > 0
- nvicDisableVector(PINC_IRQn);
-#endif
-#if KINETIS_EXT_PORTD_WIDTH > 0
- nvicDisableVector(PIND_IRQn);
-#endif
-#if KINETIS_EXT_PORTE_WIDTH > 0
- nvicDisableVector(PINE_IRQn);
-#endif
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*
- * Generic interrupt handler.
- */
-static inline void irq_handler(PORT_TypeDef * const port, const unsigned port_width, const uint8_t *channel_map) {
- unsigned pin;
- uint32_t isfr = port->ISFR;
-
- /* Clear all pending interrupts on this port. */
- port->ISFR = 0xFFFFFFFF;
-
- for (pin = 0; pin < port_width; pin++) {
- if (isfr & (1 << pin)) {
- expchannel_t channel = channel_map[pin];
- EXTD1.config->channels[channel].cb(&EXTD1, channel);
- }
- }
-}
-
-/**
- * @brief PORTA interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTA_IRQ_VECTOR) && KINETIS_EXT_PORTA_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTA_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTA, KINETIS_EXT_PORTA_WIDTH, porta_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTA_WIDTH > 0 */
-
-/**
- * @brief PORTB interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTB_IRQ_VECTOR) && KINETIS_EXT_PORTB_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTB_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTB, KINETIS_EXT_PORTB_WIDTH, portb_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTB_WIDTH > 0 */
-
-/**
- * @brief PORTC interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTC_IRQ_VECTOR) && KINETIS_EXT_PORTC_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTC_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTC, KINETIS_EXT_PORTC_WIDTH, portc_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTC_WIDTH > 0 */
-
-/**
- * @brief PORTD interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTD_IRQ_VECTOR) && KINETIS_EXT_PORTD_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTD, KINETIS_EXT_PORTD_WIDTH, portd_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTD_WIDTH > 0 */
-
-/**
- * @brief PORTE interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTE_IRQ_VECTOR) && KINETIS_EXT_PORTE_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTE_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTE, KINETIS_EXT_PORTE_WIDTH, porte_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTE_WIDTH > 0 */
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level EXT driver initialization.
- *
- * @notapi
- */
-void ext_lld_init(void) {
-
- /* Driver initialization.*/
- extObjectInit(&EXTD1);
-}
-
-/**
- * @brief Configures and activates the EXT peripheral.
- *
- * @param[in] extp pointer to the @p EXTDriver object
- *
- * @notapi
- */
-void ext_lld_start(EXTDriver *extp) {
- expchannel_t channel;
-
- if (extp->state == EXT_STOP)
- ext_lld_exti_irq_enable();
-
- /* Configuration of automatic channels.*/
- for (channel = 0; channel < EXT_MAX_CHANNELS; channel++) {
-
- uint32_t mode = extp->config->channels[channel].mode;
- PORT_TypeDef *port = extp->config->channels[channel].port;
- uint32_t pin = extp->config->channels[channel].pin;
-
- /* Initialize the channel map */
-#if KINETIS_EXT_PORTA_WIDTH > 0
- if (port == PORTA)
- porta_channel_map[pin] = channel;
- else
-#endif
-#if KINETIS_EXT_PORTB_WIDTH > 0
- if (port == PORTB)
- portb_channel_map[pin] = channel;
- else
-#endif
-#if KINETIS_EXT_PORTC_WIDTH > 0
- if (port == PORTC)
- portc_channel_map[pin] = channel;
- else
-#endif
-#if KINETIS_EXT_PORTD_WIDTH > 0
- if (port == PORTD)
- portd_channel_map[pin] = channel;
- else
-#endif
-#if KINETIS_EXT_PORTE_WIDTH > 0
- if (port == PORTE)
- porte_channel_map[pin] = channel;
- else
-#endif
- {}
-
- if (mode & EXT_CH_MODE_AUTOSTART)
- ext_lld_channel_enable(extp, channel);
- else if (port != NULL)
- ext_lld_channel_disable(extp, channel);
- }
-}
-
-/**
- * @brief Deactivates the EXT peripheral.
- *
- * @param[in] extp pointer to the @p EXTDriver object
- *
- * @notapi
- */
-void ext_lld_stop(EXTDriver *extp) {
-
- if (extp->state == EXT_ACTIVE)
- ext_lld_exti_irq_disable();
-}
-
-/**
- * @brief Enables an EXT channel.
- *
- * @param[in] extp pointer to the @p EXTDriver object
- * @param[in] channel channel to be enabled
- *
- * @notapi
- */
-void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel) {
-
- uint32_t irqc;
- uint32_t mode = extp->config->channels[channel].mode;
- if (mode & EXT_CH_MODE_RISING_EDGE)
- irqc = PCR_IRQC_RISING_EDGE;
- else if (extp->config->channels[channel].mode & EXT_CH_MODE_FALLING_EDGE)
- irqc = PCR_IRQC_FALLING_EDGE;
- else if (extp->config->channels[channel].mode & EXT_CH_MODE_BOTH_EDGES)
- irqc = PCR_IRQC_EITHER_EDGE;
- else
- irqc = PCR_IRQC_DISABLED;
-
- PORT_TypeDef *port = extp->config->channels[channel].port;
- uint32_t pin = extp->config->channels[channel].pin;
-
- uint32_t pcr = port->PCR[pin];
-
- /* Clear all the IRQC bits */
- pcr &= ~PORTx_PCRn_IRQC_MASK;
- /* Set the required IRQC bits */
- pcr |= PORTx_PCRn_IRQC(irqc);
-
- port->PCR[pin] = pcr;
-}
-
-/**
- * @brief Disables an EXT channel.
- *
- * @param[in] extp pointer to the @p EXTDriver object
- * @param[in] channel channel to be disabled
- *
- * @notapi
- */
-void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel) {
-
- PORT_TypeDef *port = extp->config->channels[channel].port;
- uint32_t pin = extp->config->channels[channel].pin;
- port->PCR[pin] |= PORTx_PCRn_IRQC(PCR_IRQC_DISABLED);
-}
-
-#endif /* HAL_USE_EXT */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/LLD/ext_lld.h b/os/hal/ports/KINETIS/LLD/ext_lld.h
deleted file mode 100644
index 465bb89fa..000000000
--- a/os/hal/ports/KINETIS/LLD/ext_lld.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014 Derek Mulcahy
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/LLD/ext_lld.h
- * @brief KINETIS EXT subsystem low level driver header.
- *
- * @addtogroup EXT
- * @{
- */
-
-#ifndef _EXT_LLD_H_
-#define _EXT_LLD_H_
-
-#if HAL_USE_EXT || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/**
- * @brief Number of EXT channels required.
- */
-#define EXT_MAX_CHANNELS KINETIS_EXTI_NUM_CHANNELS
-
-/**
- * @name KINETIS-specific EXT channel modes
- * @{
- */
-/** @} */
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief PORTA interrupt priority level setting.
- */
-#if !defined(KINETIS_EXT_PORTA_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_EXT_PORTA_IRQ_PRIORITY 3
-#endif
-
-/**
- * @brief PORTB interrupt priority level setting.
- */
-#if !defined(KINETIS_EXT_PORTB_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_EXT_PORTB_IRQ_PRIORITY 3
-#endif
-
-/**
- * @brief PORTC interrupt priority level setting.
- */
-#if !defined(KINETIS_EXT_PORTC_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_EXT_PORTC_IRQ_PRIORITY 3
-#endif
-
-/**
- * @brief PORTD interrupt priority level setting.
- */
-#if !defined(KINETIS_EXT_PORTD_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_EXT_PORTD_IRQ_PRIORITY 3
-#endif
-
-/**
- * @brief PORTE interrupt priority level setting.
- */
-#if !defined(KINETIS_EXT_PORTE_IRQ_PRIORITY) || defined(__DOXYGEN__)
-#define KINETIS_EXT_PORTE_IRQ_PRIORITY 3
-#endif
-/** @} */
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/**
- * @brief EXT channel identifier.
- */
-typedef uint32_t expchannel_t;
-
-/**
- * @brief Type of an EXT generic notification callback.
- *
- * @param[in] extp pointer to the @p EXPDriver object triggering the
- * callback
- */
-typedef void (*extcallback_t)(EXTDriver *extp, expchannel_t channel);
-
-/**
- * @brief Channel configuration structure.
- */
-typedef struct {
- /**
- * @brief Channel mode.
- */
- uint32_t mode;
- /**
- * @brief Channel callback.
- */
- extcallback_t cb;
-
- /**
- * @brief Port.
- */
- PORT_TypeDef *port;
-
- /**
- * @brief Pin.
- */
- uint32_t pin;
-} EXTChannelConfig;
-
-/**
- * @brief Driver configuration structure.
- * @note It could be empty on some architectures.
- */
-typedef struct {
- /**
- * @brief Channel configurations.
- */
- EXTChannelConfig channels[EXT_MAX_CHANNELS];
- /* End of the mandatory fields.*/
-} EXTConfig;
-
-/**
- * @brief Structure representing an EXT driver.
- */
-struct EXTDriver {
- /**
- * @brief Driver state.
- */
- extstate_t state;
- /**
- * @brief Current configuration data.
- */
- const EXTConfig *config;
- /* End of the mandatory fields.*/
-};
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if !defined(__DOXYGEN__)
-extern EXTDriver EXTD1;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void ext_lld_init(void);
- void ext_lld_start(EXTDriver *extp);
- void ext_lld_stop(EXTDriver *extp);
- void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel);
- void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_EXT */
-
-#endif /* _EXT_LLD_H_ */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/LLD/i2c_lld.c b/os/hal/ports/KINETIS/LLD/i2c_lld.c
deleted file mode 100644
index 4e42d1692..000000000
--- a/os/hal/ports/KINETIS/LLD/i2c_lld.c
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/i2c_lld.c
- * @brief KINETIS I2C subsystem low level driver source.
- *
- * @addtogroup I2C
- * @{
- */
-
-#include "osal.h"
-#include "hal.h"
-
-#if HAL_USE_I2C || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/**
- * @brief I2C0 driver identifier.
- */
-#if KINETIS_I2C_USE_I2C0 || defined(__DOXYGEN__)
-I2CDriver I2CD1;
-#endif
-
-/**
- * @brief I2C1 driver identifier.
- */
-#if KINETIS_I2C_USE_I2C1 || defined(__DOXYGEN__)
-I2CDriver I2CD2;
-#endif
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-void config_frequency(I2CDriver *i2cp) {
-
- /* Each index in the table corresponds to a a frequency
- * divider used to generate the SCL clock from the main
- * system clock.
- */
- uint16_t icr_table[] = {
- /* 0x00 - 0x0F */
- 20,22,24,26,28,30,34,40,28,32,36,40,44,48,56,68,
- /* 0x10 - 0x1F */
- 48,56,64,72,80,88,104,128,80,96,112,128,144,160,192,240,
- /* 0x20 - 0x2F */
- 160,192,224,256,288,320,384,480,320,384,448,512,576,640,768,960,
- /* 0x30 - 0x3F */
- 640,768,896,1024,1152,1280,1536,1920,1280,1536,1792,2048,2304,2560,3072,3840,
- };
-
- int length = sizeof(icr_table) / sizeof(icr_table[0]);
- uint16_t divisor;
- uint8_t i = 0, index = 0;
- uint16_t best, diff;
-
- if (i2cp->config != NULL)
- divisor = KINETIS_SYSCLK_FREQUENCY / i2cp->config->clock;
- else
- divisor = KINETIS_SYSCLK_FREQUENCY / 100000;
-
- best = ~0;
- index = 0;
- /* Tries to find the SCL clock which is the closest
- * approximation to the clock passed in config. To
- * stay on the safe side, only values that generate
- * lower frequency are used.
- */
- for (i = 0; i < length; i++) {
- if (icr_table[i] >= divisor) {
- diff = icr_table[i] - divisor;
- if (diff < best) {
- best = diff;
- index = i;
- }
- }
- }
-
- i2cp->i2c->F = index;
-}
-
-/**
- * @brief Common IRQ handler.
- * @note Tries hard to clear all the pending interrupt sources, we don't
- * want to go through the whole ISR and have another interrupt soon
- * after.
- *
- * @param[in] i2cp pointer to an I2CDriver
- */
-static void serve_interrupt(I2CDriver *i2cp) {
-
- I2C_TypeDef *i2c = i2cp->i2c;
- intstate_t state = i2cp->intstate;
-
- if (i2c->S & I2Cx_S_ARBL) {
-
- i2cp->errors |= I2C_ARBITRATION_LOST;
- i2c->S |= I2Cx_S_ARBL;
-
- } else if (state == STATE_SEND) {
-
- if (i2c->S & I2Cx_S_RXAK)
- i2cp->errors |= I2C_ACK_FAILURE;
- else if (i2cp->txbuf != NULL && i2cp->txidx < i2cp->txbytes)
- i2c->D = i2cp->txbuf[i2cp->txidx++];
- else
- i2cp->intstate = STATE_STOP;
-
- } else if (state == STATE_DUMMY) {
-
- if (i2c->S & I2Cx_S_RXAK)
- i2cp->errors |= I2C_ACK_FAILURE;
- else {
- i2c->C1 &= ~I2Cx_C1_TX;
-
- if (i2cp->rxbytes > 1)
- i2c->C1 &= ~I2Cx_C1_TXAK;
- else
- i2c->C1 |= I2Cx_C1_TXAK;
- (void) i2c->D;
- i2cp->intstate = STATE_RECV;
- }
-
- } else if (state == STATE_RECV) {
-
- if (i2cp->rxbytes > 1) {
- if (i2cp->rxidx == (i2cp->rxbytes - 2))
- i2c->C1 |= I2Cx_C1_TXAK;
- else
- i2c->C1 &= ~I2Cx_C1_TXAK;
- }
-
- if (i2cp->rxidx == i2cp->rxbytes - 1)
- i2c->C1 &= ~(I2Cx_C1_TX | I2Cx_C1_MST);
-
- i2cp->rxbuf[i2cp->rxidx++] = i2c->D;
-
- if (i2cp->rxidx == i2cp->rxbytes)
- i2cp->intstate = STATE_STOP;
- }
-
- /* Reset interrupt flag */
- i2c->S |= I2Cx_S_IICIF;
-
- if (i2cp->errors != I2C_NO_ERROR)
- _i2c_wakeup_error_isr(i2cp);
-
- if (i2cp->intstate == STATE_STOP)
- _i2c_wakeup_isr(i2cp);
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-#if KINETIS_I2C_USE_I2C0 || defined(__DOXYGEN__)
-
-OSAL_IRQ_HANDLER(KINETIS_I2C0_IRQ_VECTOR) {
-
- OSAL_IRQ_PROLOGUE();
- serve_interrupt(&I2CD1);
- OSAL_IRQ_EPILOGUE();
-}
-
-#endif
-
-#if KINETIS_I2C_USE_I2C1 || defined(__DOXYGEN__)
-
-/* FIXME: KL2x has I2C1 on Vector64; K2x don't have I2C1! */
-OSAL_IRQ_HANDLER(Vector64) {
-
- OSAL_IRQ_PROLOGUE();
- serve_interrupt(&I2CD2);
- OSAL_IRQ_EPILOGUE();
-}
-
-#endif
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level I2C driver initialization.
- *
- * @notapi
- */
-void i2c_lld_init(void) {
-
-#if KINETIS_I2C_USE_I2C0
- i2cObjectInit(&I2CD1);
- I2CD1.thread = NULL;
- I2CD1.i2c = I2C0;
-#endif
-
-#if KINETIS_I2C_USE_I2C1
- i2cObjectInit(&I2CD2);
- I2CD2.thread = NULL;
- I2CD2.i2c = I2C1;
-#endif
-
-}
-
-/**
- * @brief Configures and activates the I2C peripheral.
- *
- * @param[in] i2cp pointer to the @p I2CDriver object
- *
- * @notapi
- */
-void i2c_lld_start(I2CDriver *i2cp) {
-
- if (i2cp->state == I2C_STOP) {
-
- /* TODO:
- * The PORT must be enabled somewhere. The PIN multiplexer
- * will map the I2C functionality to some PORT which must
- * than be enabled. The easier way is enabling all PORTs at
- * startup, which is currently being done in __early_init.
- */
-
-#if KINETIS_I2C_USE_I2C0
- if (&I2CD1 == i2cp) {
- SIM->SCGC4 |= SIM_SCGC4_I2C0;
- nvicEnableVector(I2C0_IRQn, KINETIS_I2C_I2C0_PRIORITY);
- }
-#endif
-
-#if KINETIS_I2C_USE_I2C1
- if (&I2CD2 == i2cp) {
- SIM->SCGC4 |= SIM_SCGC4_I2C1;
- nvicEnableVector(I2C1_IRQn, KINETIS_I2C_I2C1_PRIORITY);
- }
-#endif
-
- }
-
- config_frequency(i2cp);
- i2cp->i2c->C1 |= I2Cx_C1_IICEN | I2Cx_C1_IICIE;
- i2cp->intstate = STATE_STOP;
-}
-
-/**
- * @brief Deactivates the I2C peripheral.
- *
- * @param[in] i2cp pointer to the @p I2CDriver object
- *
- * @notapi
- */
-void i2c_lld_stop(I2CDriver *i2cp) {
-
- if (i2cp->state != I2C_STOP) {
-
- i2cp->i2c->C1 &= ~(I2Cx_C1_IICEN | I2Cx_C1_IICIE);
-
-#if KINETIS_I2C_USE_I2C0
- if (&I2CD1 == i2cp) {
- SIM->SCGC4 &= ~SIM_SCGC4_I2C0;
- nvicDisableVector(I2C0_IRQn);
- }
-#endif
-
-#if KINETIS_I2C_USE_I2C1
- if (&I2CD2 == i2cp) {
- SIM->SCGC4 &= ~SIM_SCGC4_I2C1;
- nvicDisableVector(I2C1_IRQn);
- }
-#endif
-
- }
-}
-
-static inline msg_t _i2c_txrx_timeout(I2CDriver *i2cp, i2caddr_t addr,
- const uint8_t *txbuf, size_t txbytes,
- uint8_t *rxbuf, size_t rxbytes,
- systime_t timeout) {
-
- (void)timeout;
- msg_t msg;
-
- uint8_t op = (i2cp->intstate == STATE_SEND) ? 0 : 1;
-
- i2cp->errors = I2C_NO_ERROR;
- i2cp->addr = addr;
-
- i2cp->txbuf = txbuf;
- i2cp->txbytes = txbytes;
- i2cp->txidx = 0;
-
- i2cp->rxbuf = rxbuf;
- i2cp->rxbytes = rxbytes;
- i2cp->rxidx = 0;
-
- /* send START */
- i2cp->i2c->C1 |= I2Cx_C1_MST;
- i2cp->i2c->C1 |= I2Cx_C1_TX;
-
- /* FIXME: should not use busy waiting! */
- while (!(i2cp->i2c->S & I2Cx_S_BUSY));
-
- i2cp->i2c->D = addr << 1 | op;
-
- msg = osalThreadSuspendTimeoutS(&i2cp->thread, TIME_INFINITE);
-
- /* FIXME */
- //if (i2cp->i2c->S & I2Cx_S_RXAK)
- // i2cp->errors |= I2C_ACK_FAILURE;
-
- if (msg == MSG_OK && txbuf != NULL && rxbuf != NULL) {
- i2cp->i2c->C1 |= I2Cx_C1_RSTA;
- /* FIXME */
- while (!(i2cp->i2c->S & I2Cx_S_BUSY));
-
- i2cp->intstate = STATE_DUMMY;
- i2cp->i2c->D = i2cp->addr << 1 | 1;
-
- msg = osalThreadSuspendTimeoutS(&i2cp->thread, TIME_INFINITE);
- }
-
- i2cp->i2c->C1 &= ~(I2Cx_C1_TX | I2Cx_C1_MST);
- /* FIXME */
- while (i2cp->i2c->S & I2Cx_S_BUSY);
-
- return msg;
-}
-
-/**
- * @brief Receives data via the I2C bus as master.
- *
- * @param[in] i2cp pointer to the @p I2CDriver object
- * @param[in] addr slave device address
- * @param[out] rxbuf pointer to the receive buffer
- * @param[in] rxbytes number of bytes to be received
- * @param[in] timeout the number of ticks before the operation timeouts,
- * the following special values are allowed:
- * - @a TIME_INFINITE no timeout.
- * .
- * @return The operation status.
- * @retval MSG_OK if the function succeeded.
- * @retval MSG_RESET if one or more I2C errors occurred, the errors can
- * be retrieved using @p i2cGetErrors().
- * @retval MSG_TIMEOUT if a timeout occurred before operation end. <b>After a
- * timeout the driver must be stopped and restarted
- * because the bus is in an uncertain state</b>.
- *
- * @notapi
- */
-msg_t i2c_lld_master_receive_timeout(I2CDriver *i2cp, i2caddr_t addr,
- uint8_t *rxbuf, size_t rxbytes,
- systime_t timeout) {
-
- i2cp->intstate = STATE_DUMMY;
- return _i2c_txrx_timeout(i2cp, addr, NULL, 0, rxbuf, rxbytes, timeout);
-}
-
-/**
- * @brief Transmits data via the I2C bus as master.
- *
- * @param[in] i2cp pointer to the @p I2CDriver object
- * @param[in] addr slave device address
- * @param[in] txbuf pointer to the transmit buffer
- * @param[in] txbytes number of bytes to be transmitted
- * @param[out] rxbuf pointer to the receive buffer
- * @param[in] rxbytes number of bytes to be received
- * @param[in] timeout the number of ticks before the operation timeouts,
- * the following special values are allowed:
- * - @a TIME_INFINITE no timeout.
- * .
- * @return The operation status.
- * @retval MSG_OK if the function succeeded.
- * @retval MSG_RESET if one or more I2C errors occurred, the errors can
- * be retrieved using @p i2cGetErrors().
- * @retval MSG_TIMEOUT if a timeout occurred before operation end. <b>After a
- * timeout the driver must be stopped and restarted
- * because the bus is in an uncertain state</b>.
- *
- * @notapi
- */
-msg_t i2c_lld_master_transmit_timeout(I2CDriver *i2cp, i2caddr_t addr,
- const uint8_t *txbuf, size_t txbytes,
- uint8_t *rxbuf, size_t rxbytes,
- systime_t timeout) {
-
- i2cp->intstate = STATE_SEND;
- return _i2c_txrx_timeout(i2cp, addr, txbuf, txbytes, rxbuf, rxbytes, timeout);
-}
-
-#endif /* HAL_USE_I2C */
-
-/** @} */
diff --git a/os/hal/ports/KINETIS/LLD/i2c_lld.h b/os/hal/ports/KINETIS/LLD/i2c_lld.h
deleted file mode 100644
index 11de3ae9d..000000000
--- a/os/hal/ports/KINETIS/LLD/i2c_lld.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2014-2015 Fabio Utzig
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file KINETIS/i2c_lld.h
- * @brief KINETIS I2C subsystem low level driver header.
- *
- * @addtogroup I2C
- * @{
- */
-
-#ifndef _I2C_LLD_H_
-#define _I2C_LLD_H_
-
-#if HAL_USE_I2C || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-#define STATE_STOP 0x00
-#define STATE_SEND 0x01
-#define STATE_RECV 0x02
-#define STATE_DUMMY 0x03
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/**
- * @name Configuration options
- * @{
- */
-/**
- * @brief I2C0 driver enable switch.
- * @details If set to @p TRUE the support for I2C0 is included.
- * @note The default is @p FALSE.
- */
-#if !defined(KINETIS_I2C_USE_I2C0) || defined(__DOXYGEN__)
-#define KINETIS_I2C_USE_I2C0 FALSE
-#endif
-
-/**
- * @brief I2C1 driver enable switch.
- * @details If set to @p TRUE the support for I2C1 is included.
- * @note The default is @p FALSE.
- */
-#if !defined(KINETIS_I2C_USE_I2C1) || defined(__DOXYGEN__)
-#define KINETIS_I2C_USE_I2C1 FALSE
-#endif
-/** @} */
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/* @brief Type representing I2C address. */
-typedef uint8_t i2caddr_t;
-
-/* @brief Type of I2C Driver condition flags. */
-typedef uint32_t i2cflags_t;
-
-/* @brief Type used to control the ISR state machine. */
-typedef uint8_t intstate_t;
-
-/**
- * @brief Driver configuration structure.
- * @note Implementations may extend this structure to contain more,
- * architecture dependent, fields.
- */
-
-/**
- * @brief Driver configuration structure.
- */
-typedef struct {
-
- /* @brief Clock to be used for the I2C bus. */
- uint32_t clock;
-
-} I2CConfig;
-
-/**
- * @brief Type of a structure representing an I2C driver.
- */
-typedef struct I2CDriver I2CDriver;
-
-/**
- * @brief Structure representing an I2C driver.
- */
-struct I2CDriver {
- /**
- * @brief Driver state.
- */
- i2cstate_t state;
- /**
- * @brief Current configuration data.
- */
- const I2CConfig *config;
- /**
- * @brief Error flags.
- */
- i2cflags_t errors;
-#if I2C_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__)
-#if CH_CFG_USE_MUTEXES || defined(__DOXYGEN__)
- /**
- * @brief Mutex protecting the bus.
- */
- mutex_t mutex;
-#elif CH_CFG_USE_SEMAPHORES
- semaphore_t semaphore;
-#endif
-#endif /* I2C_USE_MUTUAL_EXCLUSION */
-#if defined(I2C_DRIVER_EXT_FIELDS)
- I2C_DRIVER_EXT_FIELDS
-#endif
- /* @brief Thread waiting for I/O completion. */
- thread_reference_t thread;
- /* @brief Current slave address without R/W bit. */
- i2caddr_t addr;
-
- /* End of the mandatory fields.*/
-
- /* @brief Pointer to the buffer with data to send. */
- const uint8_t *txbuf;
- /* @brief Number of bytes of data to send. */
- size_t txbytes;
- /* @brief Current index in buffer when sending data. */
- size_t txidx;
- /* @brief Pointer to the buffer to put received data. */
- uint8_t *rxbuf;
- /* @brief Number of bytes of data to receive. */
- size_t rxbytes;
- /* @brief Current index in buffer when receiving data. */
- size_t rxidx;
- /* @brief Tracks current ISR state. */
- intstate_t intstate;
- /* @brief Low-level register access. */
- I2C_TypeDef *i2c;
-};
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/**
- * @brief Get errors from I2C driver.
- *
- * @param[in] i2cp pointer to the @p I2CDriver object
- *
- * @notapi
- */
-#define i2c_lld_get_errors(i2cp) ((i2cp)->errors)
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if !defined(__DOXYGEN__)
-
-#if KINETIS_I2C_USE_I2C0
-extern I2CDriver I2CD1;
-#endif
-
-#if KINETIS_I2C_USE_I2C1
-extern I2CDriver I2CD2;
-#endif
-
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void i2c_lld_init(void);
- void i2c_lld_start(I2CDriver *i2cp);
- void i2c_lld_stop(I2CDriver *i2cp);
- msg_t i2c_lld_master_transmit_timeout(I2CDriver *i2cp, i2caddr_t addr,
- const uint8_t *txbuf, size_t txbytes,
- uint8_t *rxbuf, size_t rxbytes,
- systime_t timeout);
- msg_t i2c_lld_master_receive_timeout(I2CDriver *i2cp, i2caddr_t addr,
- uint8_t *rxbuf, size_t rxbytes,
- systime_t timeout);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* HAL_USE_I2C */
-
-#endif /* _I2C_LLD_H_ */
-
-/** @} */