mcg.h 5.15 KB
/*
 * Copyright (C) 2015 PHYTEC Messtechnik GmbH
 *
 * This file is subject to the terms and conditions of the GNU Lesser General
 * Public License v2.1. See the file LICENSE in the top level directory for more
 * details.
 */

/**
 * @defgroup    cpu_kinetis_common_mcg Kinetis MCG
 * @ingroup     cpu_kinetis_common
 * @brief       Implementation of the Kinetis Multipurpose Clock Generator
 *              (MCG) driver.
 *              Please add mcg.h in cpu conf.h
 *              and MCG configuration to periph_conf.h
 *
 *              MCG neighbor modes matrix:
 *
 *                x  | FEI | FEE | FBI | FBE | BLPI | BLPE | PBE | PEE
 *              :---:|:---:|:---:|:---:|:---:|:----:|:----:|:---:|:---:
 *              PEE  |  0  |  0  |  0  |  0  |  0   |  0   |  1  |  0
 *              PBE  |  0  |  0  |  0  |  1  |  0   |  1   |  0  |  1
 *              BLPE |  0  |  0  |  0  |  1  |  0   |  0   |  1  |  0
 *              BLPI |  0  |  0  |  1  |  0  |  0   |  0   |  0  |  0
 *              FBE  |  1  |  1  |  1  |  0  |  0   |  1   |  1  |  0
 *              FBI  |  1  |  1  |  0  |  1  |  1   |  0   |  0  |  0
 *              FEE  |  1  |  0  |  1  |  1  |  0   |  0   |  0  |  0
 *              FEI  |  1  |  1  |  1  |  1  |  0   |  0   |  0  |  0
 *
 *              Each neighbor mode can be selected directly.
 *              Further, the paths between the following modes are defined:
 *              -  FEI -> PEE
 *              -  BLPE -> PEE
 *              -  PEE -> BLPE
 *              -  FEE -> BLPE
 *              -  FEE -> BLPI
 *              -  BLPE -> FEE
 *              -  BLPI -> FEE
 *
 *              ### MCG Configuration Examples (for periph_conf.h) ###
 *
 *              Example for FEI Mode (MCGOUTCLK = 20MHz ... 25MHz):
 *
 *                  #define KINETIS_MCG_USE_ERC               0
 *                  #define KINETIS_MCG_DCO_RANGE             (24000000U)
 *
 *
 *              Example for FEE Mode, 32768Hz Crystal,
 *              (MCGOUTCLK = 24MHz):
 *
 *                  #define KINETIS_MCG_USE_ERC               1
 *                  #define KINETIS_MCG_USE_PLL               0
 *                  #define KINETIS_MCG_DCO_RANGE             (24000000U)
 *                  #define KINETIS_MCG_ERC_OSCILLATOR        1
 *                  #define KINETIS_MCG_ERC_FRDIV             0
 *                  #define KINETIS_MCG_ERC_RANGE             0
 *                  #define KINETIS_MCG_ERC_FREQ              (32768U)
 *
 *
 *              Example for FEE Mode, external 4MHz reference
 *              (\f$MCGOUTCLK
 *              = \frac{ERC_{\mathrm{freq}}\cdot FFL_{\mathrm{Factor}}}{FRDIV}
 *              = \frac{4\,\mathrm{MHz}\cdot 732}{128} = 22.875\,\mathrm{MHz}\f$):
 *
 *                  #define KINETIS_MCG_USE_ERC               1
 *                  #define KINETIS_MCG_USE_PLL               0
 *                  #define KINETIS_MCG_DCO_RANGE             (24000000U)
 *                  #define KINETIS_MCG_ERC_OSCILLATOR        0
 *                  #define KINETIS_MCG_ERC_FRDIV             2
 *                  #define KINETIS_MCG_ERC_RANGE             1
 *                  #define KINETIS_MCG_ERC_FREQ              (4000000U)
 *
 *              Example for PEE Mode, external 4MHz reference
 *              (\f$MCGOUTCLK
 *              = \frac{ERC_{\mathrm{freq}}\cdot VDIV0}{PRDIV}
 *              = \frac{4\,\mathrm{MHz}\cdot 24}{2} = 48\,\mathrm{MHz}\f$):
 *
 *                  #define KINETIS_MCG_USE_ERC               1
 *                  #define KINETIS_MCG_USE_PLL               1
 *                  #define KINETIS_MCG_DCO_RANGE             (24000000U)
 *                  #define KINETIS_MCG_ERC_OSCILLATOR        0
 *                  #define KINETIS_MCG_ERC_FRDIV             2
 *                  #define KINETIS_MCG_ERC_RANGE             1
 *                  #define KINETIS_MCG_ERC_FREQ              (4000000U)
 *                  #define KINETIS_MCG_PLL_PRDIV             1
 *                  #define KINETIS_MCG_PLL_VDIV0             0
 *                  #define KINETIS_MCG_PLL_FREQ              (48000000U)
 *
 *
 *              The desired mode can be selected in cpu.c:cpu_clock_init()
 *              with kinetis_mcg_set_mode(KINETIS_MCG_PEE);
 * @{
 *
 * @file
 * @brief       Interface definition for the Kinetis MCG driver.
 *
 * @author      Johann Fischer <j.fischer@phytec.de>
 */

#ifndef MCG_CPU_H
#define MCG_CPU_H

#include "periph_conf.h"

#if KINETIS_CPU_USE_MCG

#ifdef __cplusplus
extern "C"
{
#endif

typedef enum kinetis_mcg_mode {
    KINETIS_MCG_PEE = 0, /**< PLL Engaged External Mode */
    KINETIS_MCG_PBE,     /**< PLL Bypassed External Mode */
    KINETIS_MCG_BLPE,    /**< FLL Bypassed Low Power External Mode */
    KINETIS_MCG_BLPI,    /**< FLL Bypassed Low Power Internal Mode */
    KINETIS_MCG_FBE,     /**< FLL Bypassed External Mode */
    KINETIS_MCG_FBI,     /**< FLL Bypassed Internal Mode */
    KINETIS_MCG_FEE,     /**< FLL Engaged External Mode */
    KINETIS_MCG_FEI,     /**< FLL Engaged Internal Mode */
} kinetis_mcg_mode_t;

/**
 * @brief Initialize the MCG
 *
 */
int kinetis_mcg_set_mode(kinetis_mcg_mode_t mode);

#ifdef __cplusplus
}
#endif

#endif /* KINETIS_CPU_USE_MCG */
/** @} */

#endif /* MCG_CPU_H */