diff --git a/arch/arm/src/kinetis/Kconfig b/arch/arm/src/kinetis/Kconfig index 962dda4ee94..e88a31bf42b 100644 --- a/arch/arm/src/kinetis/Kconfig +++ b/arch/arm/src/kinetis/Kconfig @@ -713,6 +713,21 @@ config KINETIS_ENET_NORXER If selected, then the MII/RMII RXER output will be configured as a GPIO and pulled low. +choice + prompt "RMII Clock Source" + default KINETIS_EMAC_RMIICLKEXTAL + depends on !KINETIS_ENETUSEMII && (ARCH_FAMILY_K64 || ARCH_FAMILY_K66) + ---help--- + The RMII clock can be selected between EXTAL or ENET_1588_CLKIN + +config KINETIS_EMAC_RMIICLKEXTAL + bool "Use EXTAL for RMII Clock" + +config KINETIS_EMAC_RMIICLK1588CLKIN + bool "Use ENET_1588_CLKIN for RMII Clock" + +endchoice # RMII Clock Source + choice prompt "Work queue" default KINETIS_EMAC_LPWORK if SCHED_LPWORK diff --git a/arch/arm/src/kinetis/chip/kinetis_sim.h b/arch/arm/src/kinetis/chip/kinetis_sim.h index ae56504ff08..4b9a2ebe5f2 100644 --- a/arch/arm/src/kinetis/chip/kinetis_sim.h +++ b/arch/arm/src/kinetis/chip/kinetis_sim.h @@ -1,8 +1,9 @@ /************************************************************************************ * arch/arm/src/kinetis/chip/kinetis_sim.h * - * Copyright (C) 2011, 2016 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2011, 2016, 2017 Gregory Nutt. All rights reserved. + * Authors: Gregory Nutt + * David Sidrane * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -136,8 +137,17 @@ /* Bit 17: Reserved */ #define SIM_SOPT2_USBSRC (1 << 18) /* Bit 18: USB clock source select */ /* Bit 19: Reserved */ -#ifdef KINETIS_K60 -# define SIM_SOPT2_TIMESRC (1 << 20) /* Bit 20: IEEE 1588 timestamp clock source select (K60) */ +#if defined(KINETIS_K60) || defined(KINETIS_K64) || defined(KINETIS_K66) +# define SIM_SOPT2_RMIISRC_SHIFT (19) /* Bit 19: RMII clock source select */ +# define SIM_SOPT2_RMIISRC_EXTAL (0 << SIM_SOPT2_RMIISRC_SHIFT) /* EXTAL clock */ +# define SIM_SOPT2_RMIISRC_EXTBYP (1 << SIM_SOPT2_RMIISRC_SHIFT) /* External bypass clock (ENET_1588_CLKIN) */ +# define SIM_SOPT2_TIMESRC_SHIFT (20) /* Bit 20-21: IEEE 1588 timestamp clock source select (K60) */ +# define SIM_SOPT2_TIMESRC_MASK (3 << SIM_SOPT2_TIMESRC_SHIFT) +# define SIM_SOPT2_TIMESRC_CORE (0 << SIM_SOPT2_TIMESRC_SHIFT) /* Core/system clock */ +# define SIM_SOPT2_TIMESRC_PLLSEL (1 << SIM_SOPT2_TIMESRC_SHIFT) /* MCGFLLCLK,MCGPLLCLK,IRC48M,USB1 PFD + clock as selected by SOPT2[PLLFLLSEL] */ +# define SIM_SOPT2_TIMESRC_OSCERCLK (2 << SIM_SOPT2_TIMESRC_SHIFT) /* OSCERCLK clock */ +# define SIM_SOPT2_TIMESRC_EXTBYP (0 << SIM_SOPT2_TIMESRC_SHIFT) /* External bypass clock (ENET_1588_CLKIN) */ #endif /* Bits 12-23: Reserved */ #define SIM_SOPT2_I2SSRC_SHIFT (24) /* Bits 24-25: I2S master clock source select */ diff --git a/arch/arm/src/kinetis/kinetis_enet.c b/arch/arm/src/kinetis/kinetis_enet.c index 8d4bcc11e9b..b1d83352a69 100644 --- a/arch/arm/src/kinetis/kinetis_enet.c +++ b/arch/arm/src/kinetis/kinetis_enet.c @@ -1,8 +1,9 @@ /**************************************************************************** * arch/arm/src/kinetis/kinetis_enet.c * - * Copyright (C) 2011-2012, 2014-2016 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2011-2012, 2014-2017 Gregory Nutt. All rights reserved. + * Authors: Gregory Nutt + * David Sidrane * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -200,6 +201,17 @@ #define KINETIS_BUF_SIZE ((CONFIG_NET_ETH_MTU & 0xfffffff0) + 0x10) +/* If this SoC has the RMII Clock Source selection configure it */ + +#if defined(CONFIG_KINETIS_EMAC_RMIICLKEXTAL) +# define SIM_SOPT2_RMIISRC SIM_SOPT2_RMIISRC_EXTAL +#endif + +#if defined(CONFIG_KINETIS_EMAC_RMIICLK1588CLKIN) +# define SIM_SOPT2_RMIISRC SIM_SOPT2_RMIISRC_EXTBYP +#endif + + /**************************************************************************** * Private Types ****************************************************************************/ @@ -1989,6 +2001,21 @@ int kinetis_netinitialize(int intf) DEBUGASSERT(intf < CONFIG_KINETIS_ENETNETHIFS); priv = &g_enet[intf]; +#if defined(SIM_SOPT2_RMIISRC) + /* If this Soc has RMII clock select then select the RMII clock source. + * First if the source is ENET_1588_CLKIN - configure the pin to apply the + * clock to the block. Then select it as the source. + */ + +# if SIM_SOPT2_RMIISRC == SIM_SOPT2_RMIISRC_EXTBYP + kinetis_pinconfig(PIN_ENET_1588_CLKIN); +# endif + + regval = getreg32(KINETIS_SIM_SOPT2); + regval |= SIM_SOPT2_RMIISRC; + putreg32(regval, KINETIS_SIM_SOPT2); +#endif + /* Enable the ENET clock */ regval = getreg32(KINETIS_SIM_SCGC2);