From ab062ee5e28465b967572ed53b02e15b060e5343 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 19 Feb 2013 14:25:56 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5275 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/platforms/SPC560Pxx/hal_lld.c | 10 ++ os/hal/platforms/SPC560Pxx/hal_lld.h | 219 +++++++++++++++++++++++++- os/hal/platforms/SPC560Pxx/spc560p_registry.h | 2 + 3 files changed, 223 insertions(+), 8 deletions(-) (limited to 'os') diff --git a/os/hal/platforms/SPC560Pxx/hal_lld.c b/os/hal/platforms/SPC560Pxx/hal_lld.c index ef7c4806a..505b777de 100644 --- a/os/hal/platforms/SPC560Pxx/hal_lld.c +++ b/os/hal/platforms/SPC560Pxx/hal_lld.c @@ -140,6 +140,16 @@ void spc_clock_init(void) { CGM.OSC_CTL.B.OSCBYP = TRUE; #endif /* SPC5_OSC_BYPASS */ + /* Setting the various dividers and source selectors.*/ + CGM.AC0DC.R = SPC5_CGM_AC0_DC0; + CGM.AC0SC.R = SPC5_AUX0CLK_SRC; + CGM.AC1DC.R = SPC5_CGM_AC1_DC0; + CGM.AC1SC.R = SPC5_AUX1CLK_SRC; + CGM.AC2DC.R = SPC5_CGM_AC2_DC0; + CGM.AC2SC.R = SPC5_AUX2CLK_SRC; + CGM.AC3DC.R = SPC5_CGM_AC3_DC0; + CGM.AC3SC.R = SPC5_AUX3CLK_SRC; + /* Enables the XOSC in order to check its functionality before proceeding with the initialization.*/ /* ME.DRUN.R = SPC5_ME_MC_SYSCLK_IRC | SPC5_ME_MC_IRCON | SPC5_ME_MC_XOSC0ON | \ diff --git a/os/hal/platforms/SPC560Pxx/hal_lld.h b/os/hal/platforms/SPC560Pxx/hal_lld.h index 2d652b90a..4dd5c5f98 100644 --- a/os/hal/platforms/SPC560Pxx/hal_lld.h +++ b/os/hal/platforms/SPC560Pxx/hal_lld.h @@ -114,6 +114,18 @@ #define SPC5_FMPLL_ODF_DIV16 (3U << 24) /** @} */ +/** + * @name Clock selectors used in the various GCM SC registers + * @{ + */ +#define SPC5_CGM_SS_MASK (15U << 24) +#define SPC5_CGM_SS_IRC (0U << 24) +#define SPC5_CGM_SS_XOSC (2U << 24) +#define SPC5_CGM_SS_FMPLL0 (4U << 24) +#define SPC5_CGM_SS_FMPLL1 (5U << 24) +#define SPC5_CGM_SS_FMPLL1_1D1 (8U << 24) +/** @} */ + /** * @name ME_GS register bits definitions * @{ @@ -220,14 +232,14 @@ * @brief Disables the clocks initialization in the HAL. */ #if !defined(SPC5_NO_INIT) || defined(__DOXYGEN__) -#define SPC5_NO_INIT FALSE +#define SPC5_NO_INIT FALSE #endif /** * @brief Disables the overclock checks. */ #if !defined(SPC5_ALLOW_OVERCLOCK) || defined(__DOXYGEN__) -#define SPC5_ALLOW_OVERCLOCK FALSE +#define SPC5_ALLOW_OVERCLOCK FALSE #endif /** @@ -242,7 +254,7 @@ * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. */ #if !defined(SPC5_FMPLL0_IDF_VALUE) || defined(__DOXYGEN__) -#define SPC5_FMPLL0_IDF_VALUE 5 +#define SPC5_FMPLL0_IDF_VALUE 5 #endif /** @@ -250,7 +262,7 @@ * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. */ #if !defined(SPC5_FMPLL0_NDIV_VALUE) || defined(__DOXYGEN__) -#define SPC5_FMPLL0_NDIV_VALUE 32 +#define SPC5_FMPLL0_NDIV_VALUE 32 #endif /** @@ -258,7 +270,7 @@ * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. */ #if !defined(SPC5_FMPLL0_ODF) || defined(__DOXYGEN__) -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 +#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 #endif /** @@ -266,7 +278,7 @@ * @note The default value is calculated for XOSC=40MHz and PHI=120MHz. */ #if !defined(SPC5_FMPLL1_IDF_VALUE) || defined(__DOXYGEN__) -#define SPC5_FMPLL1_IDF_VALUE 5 +#define SPC5_FMPLL1_IDF_VALUE 5 #endif /** @@ -274,7 +286,7 @@ * @note The default value is calculated for XOSC=40MHz and PHI=120MHz. */ #if !defined(SPC5_FMPLL1_NDIV_VALUE) || defined(__DOXYGEN__) -#define SPC5_FMPLL1_NDIV_VALUE 60 +#define SPC5_FMPLL1_NDIV_VALUE 60 #endif /** @@ -282,7 +294,68 @@ * @note The default value is calculated for XOSC=40MHz and PHI=120MHz. */ #if !defined(SPC5_FMPLL1_ODF) || defined(__DOXYGEN__) -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 +#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 +#endif + +/** + * @brief AUX0 clock source. + */ +#if !defined(SPC5_AUX0CLK_SRC) || defined(__DOXYGEN__) +#define SPC5_AUX0CLK_SRC SPC5_CGM_SS_FMPLL1 +#endif + +/** + * @brief Motor Control clock divider value. + * @note Zero means disabled clock. + */ +#if !defined(SPC5_MCONTROL_DIVIDER_VALUE) || defined(__DOXYGEN__) +#define SPC5_MCONTROL_DIVIDER_VALUE 2 +#endif + +/** + * @brief AUX1 clock source. + * @note Not configurable, always selects FMPLL1. + */ +#if !defined(SPC5_AUX1CLK_SRC) || defined(__DOXYGEN__) +#define SPC5_AUX1CLK_SRC 0 +#endif + +/** + * @brief FMPLL1 clock divider value. + * @note Zero means disabled clock. + */ +#if !defined(SPC5_FMPLL1_CLK_DIVIDER_VALUE) || defined(__DOXYGEN__) +#define SPC5_FMPLL1_CLK_DIVIDER_VALUE 2 +#endif + +/** + * @brief AUX2 clock source. + */ +#if !defined(SPC5_AUX2CLK_SRC) || defined(__DOXYGEN__) +#define SPC5_AUX2CLK_SRC SPC5_CGM_SS_FMPLL1 +#endif + +/** + * @brief SP clock divider value. + * @note Zero means disabled clock. + */ +#if !defined(SPC5_SP_CLK_DIVIDER_VALUE) || defined(__DOXYGEN__) +#define SPC5_SP_CLK_DIVIDER_VALUE 2 +#endif + +/** + * @brief AUX3 clock source. + */ +#if !defined(SPC5_AUX3CLK_SRC) || defined(__DOXYGEN__) +#define SPC5_AUX3CLK_SRC SPC5_CGM_SS_FMPLL1 +#endif + +/** + * @brief FR clock divider value. + * @note Zero means disabled clock. + */ +#if !defined(SPC5_FR_CLK_DIVIDER_VALUE) || defined(__DOXYGEN__) +#define SPC5_FR_CLK_DIVIDER_VALUE 2 #endif /** @@ -709,6 +782,136 @@ #error "SPC5_FMPLL1_CLK outside acceptable range (0...SPC5_FMPLL1_CLK_MAX)" #endif +/** + * @brief AUX0 clock point. + */ +#if (SPC5_AUX0CLK_SRC == SPC5_CGM_SS_IRC) || defined(__DOXYGEN__) +#define SPC5_AUX0_CLK SPC5_FMPLL_SRC_IRC +#elif SPC5_AUX0CLK_SRC == SPC5_CGM_SS_XOSC +#define SPC5_AUX0_CLK SPC5_FMPLL_SRC_XOSC +#elif SPC5_AUX0CLK_SRC == SPC5_CGM_SS_FMPLL0 +#define SPC5_AUX0_CLK SPC5_FMPLL0_CLK +#elif SPC5_AUX0CLK_SRC == SPC5_CGM_SS_FMPLL1 +#define SPC5_AUX0_CLK SPC5_FMPLL1_CLK +#else +#error "invalid SPC5_AUX0CLK_SRC value specified" +#endif + +/* Check on the AUX0 divider 0 settings.*/ +#if SPC5_MCONTROL_DIVIDER_VALUE == 0 +#define SPC5_CGM_AC0_DC0 0 +#elif (SPC5_MCONTROL_DIVIDER_VALUE >= 1) && (SPC5_MCONTROL_DIVIDER_VALUE <= 16) +#define SPC5_CGM_AC0_DC0 ((0x80U | (SPC5_MCONTROL_DIVIDER_VALUE - 1)) << 24) +#else +#error "invalid SPC5_MCONTROL_DIVIDER_VALUE value specified" +#endif + +/** + * @brief Motor Control clock point. + */ +#if (SPC5_MCONTROL_DIVIDER_VALUE) != 0 || defined(__DOXYGEN) +#define SPC5_MCONTROL_CLK (SPC5_AUX0_CLK / SPC5_MCONTROL_DIVIDER_VALUE) +#else +#define SPC5_MCONTROL_CLK 0 +#endif + +/** + * @brief AUX1 clock point. + */ +#if (SPC5_AUX1CLK_SRC == 0) || defined(__DOXYGEN__) +#define SPC5_AUX1_CLK SPC5_FMPLL1_CLK +#else +#error "invalid SPC5_AUX1CLK_SRC value specified" +#endif + +/* Check on the AUX1 divider 0 settings.*/ +#if SPC5_FMPLL1_CLK_DIVIDER_VALUE == 0 +#define SPC5_CGM_AC1_DC0 0 +#elif (SPC5_FMPLL1_CLK_DIVIDER_VALUE >= 1) && (SPC5_FMPLL1_CLK_DIVIDER_VALUE <= 16) +#define SPC5_CGM_AC1_DC0 ((0x80U | (SPC5_FMPLL1_CLK_DIVIDER_VALUE - 1)) << 24) +#else +#error "invalid SPC5_FMPLL1_CLK_DIVIDER_VALUE value specified" +#endif + +/** + * @brief FMPLL1 clock point. + */ +#if (SPC5_MCONTROL_DIVIDER_VALUE) != 0 || defined(__DOXYGEN) +#define SPC5_FMPLL1_DIV_CLK (SPC5_AUX1_CLK / SPC5_FMPLL1_CLK_DIVIDER_VALUE) +#else +#define SPC5_FMPLL1_DIV_CLK 0 +#endif + +/** + * @brief AUX2 clock point. + */ +#if (SPC5_AUX2CLK_SRC == SPC5_CGM_SS_IRC) || defined(__DOXYGEN__) +#define SPC5_AUX2_CLK SPC5_FMPLL_SRC_IRC +#elif SPC5_AUX2CLK_SRC == SPC5_CGM_SS_XOSC +#define SPC5_AUX2_CLK SPC5_FMPLL_SRC_XOSC +#elif SPC5_AUX2CLK_SRC == SPC5_CGM_SS_FMPLL0 +#define SPC5_AUX2_CLK SPC5_FMPLL0_CLK +#elif SPC5_AUX2CLK_SRC == SPC5_CGM_SS_FMPLL1 +#define SPC5_AUX2_CLK SPC5_FMPLL1_CLK +#elif SPC5_AUX2CLK_SRC == SPC5_CGM_SS_FMPLL1_1D1 +#define SPC5_AUX2_CLK SPC5_FMPLL1_1D1_CLK +#else +#error "invalid SPC5_AUX2CLK_SRC value specified" +#endif + +/* Check on the AUX2 divider 0 settings.*/ +#if SPC5_SP_CLK_DIVIDER_VALUE == 0 +#define SPC5_CGM_AC2_DC0 0 +#elif (SPC5_SP_CLK_DIVIDER_VALUE >= 1) && (SPC5_SP_CLK_DIVIDER_VALUE <= 16) +#define SPC5_CGM_AC2_DC0 ((0x80U | (SPC5_SP_CLK_DIVIDER_VALUE - 1)) << 24) +#else +#error "invalid SPC5_SP_CLK_DIVIDER_VALUE value specified" +#endif + +/** + * @brief SP clock point. + */ +#if (SPC5_SP_CLK_DIVIDER_VALUE) != 0 || defined(__DOXYGEN) +#define SPC5_SP_CLK (SPC5_AUX2_CLK / SPC5_SP_CLK_DIVIDER_VALUE) +#else +#define SPC5_SP_CLK 0 +#endif + +/** + * @brief AUX3 clock point. + */ +#if (SPC5_AUX3CLK_SRC == SPC5_CGM_SS_IRC) || defined(__DOXYGEN__) +#define SPC5_AUX3_CLK SPC5_FMPLL_SRC_IRC +#elif SPC5_AUX3CLK_SRC == SPC5_CGM_SS_XOSC +#define SPC5_AUX3_CLK SPC5_FMPLL_SRC_XOSC +#elif SPC5_AUX3CLK_SRC == SPC5_CGM_SS_FMPLL0 +#define SPC5_AUX3_CLK SPC5_FMPLL0_CLK +#elif SPC5_AUX3CLK_SRC == SPC5_CGM_SS_FMPLL1 +#define SPC5_AUX3_CLK SPC5_FMPLL1_CLK +#elif SPC5_AUX3CLK_SRC == SPC5_CGM_SS_FMPLL1_1D1 +#define SPC5_AUX3_CLK SPC5_FMPLL1_1D1_CLK +#else +#error "invalid SPC5_AUX3CLK_SRC value specified" +#endif + +/* Check on the AUX3 divider 0 settings.*/ +#if SPC5_FR_CLK_DIVIDER_VALUE == 0 +#define SPC5_CGM_AC3_DC0 0 +#elif (SPC5_FR_CLK_DIVIDER_VALUE >= 1) && (SPC5_FR_CLK_DIVIDER_VALUE <= 16) +#define SPC5_CGM_AC3_DC0 ((0x80U | (SPC5_FR_CLK_DIVIDER_VALUE - 1)) << 24) +#else +#error "invalid SPC5_FR_CLK_DIVIDER_VALUE value specified" +#endif + +/** + * @brief FR clock point. + */ +#if (SPC5_FR_CLK_DIVIDER_VALUE) != 0 || defined(__DOXYGEN) +#define SPC5_FR_CLK (SPC5_AUX3_CLK / SPC5_FR_CLK_DIVIDER_VALUE) +#else +#define SPC5_FR_CLK 0 +#endif + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ diff --git a/os/hal/platforms/SPC560Pxx/spc560p_registry.h b/os/hal/platforms/SPC560Pxx/spc560p_registry.h index a4c962879..576db76f5 100644 --- a/os/hal/platforms/SPC560Pxx/spc560p_registry.h +++ b/os/hal/platforms/SPC560Pxx/spc560p_registry.h @@ -40,6 +40,7 @@ #define SPC5_LINFLEX0_RXI_NUMBER 79 #define SPC5_LINFLEX0_TXI_NUMBER 80 #define SPC5_LINFLEX0_ERR_NUMBER 81 +#define SPC5_LINFLEX0_CLK (halSPCGetSystemClock() / 1) #define SPC5_HAS_LINFLEX1 TRUE #define SPC5_LINFLEX1_PCTL 49 @@ -49,6 +50,7 @@ #define SPC5_LINFLEX1_RXI_NUMBER 99 #define SPC5_LINFLEX1_TXI_NUMBER 100 #define SPC5_LINFLEX1_ERR_NUMBER 101 +#define SPC5_LINFLEX1_CLK (halSPCGetSystemClock() / 1) #define SPC5_HAS_LINFLEX2 FALSE -- cgit v1.2.3