arch/arm/src/lpc54xx: Add a little -- very little -- Ethernet initialization logic.

This commit is contained in:
Gregory Nutt 2017-12-26 16:30:57 -06:00
parent f5c5f89592
commit 31330b2479
4 changed files with 133 additions and 18 deletions

View File

@ -668,6 +668,17 @@ endif # LPC54_EMC_DYNAMIC
endmenu # EMC Configuration endmenu # EMC Configuration
menu "Ethernet configuration"
depends on LPC54_ETHERNET
config LPC54_MII
bool "Use MII interface"
default n
---help---
Support Ethernet MII interface. Default: Use RMII interface.
endmenu # Ethernet configuration
menu "SD/MMC Configuration" menu "SD/MMC Configuration"
depends on LPC54_SDMMC depends on LPC54_SDMMC

View File

@ -700,9 +700,17 @@
/* EMC delay chain calibration control */ /* EMC delay chain calibration control */
#define SYSCON_EMCDLYCAL_ #define SYSCON_EMCDLYCAL_
/* Ethernet PHY selection */ /* Ethernet PHY selection */
#define SYSCON_ETHPHYSEL_
#define SYSCON_ETHPHYSEL (1 << 2) /* Bit 2: PHY_SEL PHY interface */
# define SYSCON_ETHPHYSEL_MII (0) /* Select MII PHY Interface */
# define SYSCON_ETHPHYSEL_RMII (1 << 2) /* Select RMII PHY Interface */
/* Ethernet SBD flow control */ /* Ethernet SBD flow control */
#define SYSCON_ETHSBDCTRL_
#define SYSCON_ETHSBDCTRL_SHIFT (0) /* Bits 0-1: Sideband Flow Control */
#define SYSCON_ETHSBDCTRL_MASK (3 << SYSCON_ETHSBDCTRL_SHIFT)
# define SYSCON_ETHSBDCTRL CHAN1 (0 << SYSCON_ETHSBDCTRL_SHIFT) /* Controls channel 0 */
# define SYSCON_ETHSBDCTRL_CHAN2 (2 << SYSCON_ETHSBDCTRL_SHIFT) /* Controls channel 1 */
/* SDIO CCLKIN phase and delay control */ /* SDIO CCLKIN phase and delay control */

View File

@ -62,6 +62,8 @@
#include "up_arch.h" #include "up_arch.h"
#include "chip/lpc54_ethernet.h" #include "chip/lpc54_ethernet.h"
#include "lpc54_enableclk.h"
#include "lpc54_reset.h"
#ifdef CONFIG_LPC54_ETHERNET #ifdef CONFIG_LPC54_ETHERNET
@ -138,6 +140,10 @@ static struct lpc54_ethdriver_s g_ethdriver;
* Private Function Prototypes * Private Function Prototypes
****************************************************************************/ ****************************************************************************/
/* PHY_related logic */
static int lpc54_phy_initialize(FAR struct lpc54_ethdriver_s *priv);
/* Common TX logic */ /* Common TX logic */
static int lpc54_eth_transmit(FAR struct lpc54_ethdriver_s *priv); static int lpc54_eth_transmit(FAR struct lpc54_ethdriver_s *priv);
@ -187,6 +193,26 @@ static int lpc54_eth_ioctl(FAR struct net_driver_s *dev, int cmd,
* Private Functions * Private Functions
****************************************************************************/ ****************************************************************************/
/****************************************************************************
* Name: lpc54_phy_initialize
*
* Description:
* Initialize the PHY.
*
* Parameters:
* priv - Reference to the driver state structure
*
* Returned Value:
* OK on success; a negated errno on failure
*
****************************************************************************/
static int lpc54_phy_initialize(FAR struct lpc54_ethdriver_s *priv)
{
#warning Missing logic
return -ENOSYS;
}
/**************************************************************************** /****************************************************************************
* Name: lpc54_eth_transmit * Name: lpc54_eth_transmit
* *
@ -805,7 +831,22 @@ static int lpc54_eth_ifup(FAR struct net_driver_s *dev)
dev->d_ipv6addr[6], dev->d_ipv6addr[7]); dev->d_ipv6addr[6], dev->d_ipv6addr[7]);
#endif #endif
/* Initialize PHYs, the Ethernet interface, and setup up Ethernet interrupts */ /* Initialize the PHY */
ret = lpc54_phy_initialize(priv);
if (ret < 0)
{
nerr("ERROR: lpc54_phy_initialize failed: %d\n", ret);
return ret;
}
/* Initialize the Ethernet interface, and setup up Ethernet interrupts */
#warning Missing logic
/* Set the Ethernet mode to RMII or MII in the ETHPHYSEL register */
#warning Missing logic
/* Set the sideband flow control for each channel */
#warning Missing logic #warning Missing logic
/* Instantiate the MAC address from priv->eth_dev.d_mac.ether.ether_addr_octet */ /* Instantiate the MAC address from priv->eth_dev.d_mac.ether.ether_addr_octet */
@ -863,8 +904,11 @@ static int lpc54_eth_ifdown(FAR struct net_driver_s *dev)
/* Put the EMAC in its reset, non-operational state. This should be /* Put the EMAC in its reset, non-operational state. This should be
* a known configuration that will guarantee the lpc54_eth_ifup() always * a known configuration that will guarantee the lpc54_eth_ifup() always
* successfully brings the interface back up. * successfully brings the interface back up.
*
* Reset the Ethernet interface.
*/ */
#warning Missing logic
lpc54_reset_eth();
/* Mark the device "down" */ /* Mark the device "down" */
@ -1129,10 +1173,13 @@ static int lpc54_eth_ioctl(FAR struct net_driver_s *dev, int cmd,
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: lpc54_eth_initialize * Name: up_netinitialize
* *
* Description: * Description:
* Initialize the Ethernet controller and driver * Initialize the Ethernet controller and driver.
*
* This is the "standard" network initialization logic called from the
* low-level initialization logic in up_initialize.c.
* *
* Parameters: * Parameters:
* intf - In the case where there are multiple EMACs, this value * intf - In the case where there are multiple EMACs, this value
@ -1145,7 +1192,7 @@ static int lpc54_eth_ioctl(FAR struct net_driver_s *dev, int cmd,
* *
****************************************************************************/ ****************************************************************************/
int lpc54_eth_initialize(int intf) int up_netinitialize(int intf)
{ {
FAR struct lpc54_ethdriver_s *priv; FAR struct lpc54_ethdriver_s *priv;
@ -1154,9 +1201,6 @@ int lpc54_eth_initialize(int intf)
DEBUGASSERT(intf == 0); DEBUGASSERT(intf == 0);
priv = &g_ethdriver; priv = &g_ethdriver;
/* Check if a Ethernet chip is recognized at its I/O base */
#warning Missing logic
/* Attach the IRQ to the driver */ /* Attach the IRQ to the driver */
if (irq_attach(LPC54_IRQ_ETHERNET, lpc54_eth_interrupt, priv)) if (irq_attach(LPC54_IRQ_ETHERNET, lpc54_eth_interrupt, priv))
@ -1189,18 +1233,68 @@ int lpc54_eth_initialize(int intf)
DEBUGASSERT(priv->eth_txpoll != NULL && priv->eth_txtimeout != NULL); DEBUGASSERT(priv->eth_txpoll != NULL && priv->eth_txtimeout != NULL);
/* Put the interface in the down state. This usually amounts to resetting /* Configure GPIO pins to support Ethernet */
* the device and/or calling lpc54_eth_ifdown(). /* Common MIIM interface */
*/
#warning Missing logic
/* Read the MAC address from the hardware into priv->eth_dev.d_mac.ether.ether_addr_octet */ lpc54_gpio_config(GPIO_ENET_MDIO); /* Ethernet MIIM data input and output */
#warning Missing logic lpc54_gpio_config(GPIO_ENET_MDC); /* Ethernet MIIM clock */
#ifdef CONFIG_LPC54_MII
/* MII interface */
lpc54_gpio_config(GPIO_ENET_RXD0); /* Ethernet receive data 0-3 */
lpc54_gpio_config(GPIO_ENET_RXD1);
lpc54_gpio_config(GPIO_ENET_RXD2);
lpc54_gpio_config(GPIO_ENET_RXD3);
lpc54_gpio_config(GPIO_ENET_TXD0); /* Ethernet transmit data 0-3 */
lpc54_gpio_config(GPIO_ENET_TXD1);
lpc54_gpio_config(GPIO_ENET_TXD2);
lpc54_gpio_config(GPIO_ENET_TXD3);
lpc54_gpio_config(GPIO_ENET_COL); /* Ethernet collision detect */
lpc54_gpio_config(GPIO_ENET_CRS); /* Ethernet carrier sense */
lpc54_gpio_config(GPIO_ENET_RX_ER); /* Ethernet transmit error */
lpc54_gpio_config(GPIO_ENET_TX_CLK); /* Ethernet transmit clock */
lpc54_gpio_config(GPIO_ENET_RX_CLK); /* Ethernet receive clock */
lpc54_gpio_config(GPIO_ENET_TX_ER); /* Ethernet receive error */
lpc54_gpio_config(GPIO_ENET_TX_EN); /* Ethernet transmit enable */
#else
/* RMII interface */
lpc54_gpio_config(GPIO_ENET_RXD0); /* Ethernet receive data 0-1 */
lpc54_gpio_config(GPIO_ENET_RXD1);
lpc54_gpio_config(GPIO_ENET_TXD0); /* Ethernet transmit data 0-1 */
lpc54_gpio_config(GPIO_ENET_TXD1);
lpc54_gpio_config(GPIO_ENET_RX_DV); /* Ethernet receive data valid */
lpc54_gpio_config(GPIO_ENET_TX_EN); /* Ethernet transmit data enable */
#endif
/* Enable clocking to the Ethernet peripheral */
lpc54_eth_enableclk();
/* Put the interface in the down state. This amounts to resetting the
* device by calling lpc54_eth_ifdown().
*/
ret = lpc54_eth_ifdown(&priv->eth_dev);
if (ret < 0)
{
goto errout_with_clock;
}
/* Register the device with the OS so that socket IOCTLs can be performed */ /* Register the device with the OS so that socket IOCTLs can be performed */
(void)netdev_register(&priv->eth_dev, NET_LL_ETHERNET); ret = netdev_register(&priv->eth_dev, NET_LL_ETHERNET);
if (ret < 0)
{
goto errout_with_clock:
}
return OK; return OK;
errout_with_clock:
lpc54_eth_disableclk();
return ret;
} }
#endif /* CONFIG_LPC54_ETHERNET */ #endif /* CONFIG_LPC54_ETHERNET */

View File

@ -1174,7 +1174,9 @@ int skel_initialize(int intf)
* the device and/or calling skel_ifdown(). * the device and/or calling skel_ifdown().
*/ */
/* Read the MAC address from the hardware into priv->sk_dev.d_mac.ether.ether_addr_octet */ /* Read the MAC address from the hardware into priv->sk_dev.d_mac.ether.ether_addr_octet
* Applies only if the Ethernet MAC has its own internal address.
*/
/* Register the device with the OS so that socket IOCTLs can be performed */ /* Register the device with the OS so that socket IOCTLs can be performed */