diff --git a/configs/Kconfig b/configs/Kconfig index 2caf802efe..4b0c318b22 100644 --- a/configs/Kconfig +++ b/configs/Kconfig @@ -563,6 +563,7 @@ config ARCH_BOARD_SAMA5D3X_EK select ARCH_HAVE_LEDS select ARCH_HAVE_BUTTONS select ARCH_HAVE_IRQBUTTONS + select ARCH_PHY_INTERRUPT ---help--- The port of NuttX to the Atmel SAMA5D3x-EK development board (where x=1,3,4, or 5). @@ -572,6 +573,7 @@ config ARCH_BOARD_SAMA5D3_XPLAINED select ARCH_HAVE_LEDS select ARCH_HAVE_BUTTONS select ARCH_HAVE_IRQBUTTONS + select ARCH_PHY_INTERRUPT ---help--- The port of NuttX to the Atmel SAMA5D3 Xplained development board. @@ -581,6 +583,7 @@ config ARCH_BOARD_SAMA5D4_EK select ARCH_HAVE_LEDS select ARCH_HAVE_BUTTONS select ARCH_HAVE_IRQBUTTONS + select ARCH_PHY_INTERRUPT ---help--- The port of NuttX to the Atmel SAMA5D4-EK development board diff --git a/configs/sama5d3-xplained/include/board.h b/configs/sama5d3-xplained/include/board.h index e5d43377bd..1232770b87 100644 --- a/configs/sama5d3-xplained/include/board.h +++ b/configs/sama5d3-xplained/include/board.h @@ -331,20 +331,6 @@ extern "C" { void sam_boardinitialize(void); -/************************************************************************************ - * Name: sam_phyirq - * - * Description: - * This function may be called to register an interrupt handler that will be - * called when an interrupt is received from a PHY. - * - ************************************************************************************/ - -#if defined(CONFIG_NET) && (defined(CONFIG_SAMA5_EMACA) || defined(CONFIG_SAMA5_GMAC)) && \ - defined(CONFIG_SAMA5_PIOE_IRQ) -xcpt_t sam_phyirq(int intf, xcpt_t irqhandler); -#endif - /************************************************************************************ * Name: sam_ledinit, sam_setled, and sam_setleds * diff --git a/configs/sama5d3-xplained/src/sam_ethernet.c b/configs/sama5d3-xplained/src/sam_ethernet.c index 7888808055..c180b01bfc 100644 --- a/configs/sama5d3-xplained/src/sam_ethernet.c +++ b/configs/sama5d3-xplained/src/sam_ethernet.c @@ -1,7 +1,7 @@ /************************************************************************************ * configs/sama5d3-xplained/src/sam_ethernet.c * - * Copyright (C) 2010 Gregory Nutt. All rights reserved. + * Copyright (C) 2014 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -39,7 +39,11 @@ #include +#include +#include + #include +#include #include "sam_pio.h" #include "sam_ethernet.h" @@ -50,6 +54,18 @@ * Pre-processor Definitions ************************************************************************************/ +#ifndef CONFIG_SAMA5_EMACA +# undef CONFIG_SAMA5_EMAC_ISETH0 +#endif + +#ifdef CONFIG_SAMA5_EMAC_ISETH0 +# SAMA5_EMAC_DEVNAME "eth0" +# SAMA5_GMAC_DEVNAME "eth1" +#else +# SAMA5_GMAC_DEVNAME "eth0" +# SAMA5_EMAC_DEVNAME "eth1" +#endif + /************************************************************************************ * Private Data ************************************************************************************/ @@ -121,17 +137,61 @@ void weak_function sam_netinitialize(void) #endif } -/************************************************************************************ - * Name: sam_phyirq +/**************************************************************************** + * Name: arch_phy_irq * * Description: - * This function may be called to register an interrupt handler that will be - * called when an interrupt is received from a PHY. + * This function may be called to register an interrupt handler that will + * be called when a PHY interrupt occurs. This function both attaches + * the interrupt handler and enables the interrupt if 'handler' is non- + * NULL. If handler is NULL, then the interrupt is detached and disabled + * instead. * - ************************************************************************************/ + * This interrupt may or may not be available on a given platform depending + * on how the network hardware architecture is implemented. In a typical + * case, the PHY interrupt is provided to board-level logic as a GPIO + * interrupt (in which case this is a board-specific interface and really + * should be called board_phy_irq()); In other cases, the PHY interrupt + * may be cause by the chip's MAC logic (in which case arch_phy_irq()) is + * an appropriate name. Other other boards, there may be no PHY interrupts + * available at all. If client attachable PHY interrupts are available + * from the board or from the chip, then CONFIG_ARCH_PHY_INTERRUPT should + * be defined to indicate that fact. + * + * Typical usage: + * a. OS service logic (not application logic*) attaches to the PHY + * PHY interrupt. + * b. When the PHY interrupt occurs, work should be scheduled on the + * worker thread (or perhaps a dedicated application thread). + * c. That worker thread should use the SIOCGMIIPHY, SIOCGMIIREG, + * and SIOCSMIIREG ioctl calls** to communicate with the PHY, + * determine what network event took place (Link Up/Down?), and + * take the appropriate actions. + * + * * This is an OS internal interface and should not be used from + * application space. + * ** This interrupt is really of no use if the Ethernet MAC driver + * does not support these ioctl calls. + * + * Input Parameters: + * intf - Identifies the network interface. For example "eth0". Only + * useful on platforms that support multiple Ethernet interfaces + * and, hence, multiple PHYs and PHY interrupts. + * handler - The client interrupt handler to be invoked when the PHY + * asserts an interrupt. Must reside in OS space, but can + * signal tasks in user space. A value of NULL can be passed + * in order to detach and disable the PHY interrupt. + * + * Returned Value: + * The previous PHY interrupt handler address is returned. This allows you + * to temporarily replace an interrupt handler, then restore the original + * interrupt handler. NULL is returned if there is was not handler in + * place when the call was made. + * + ****************************************************************************/ #ifdef CONFIG_SAMA5_PIOE_IRQ -xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) +xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler); { irqstate_t flags; xcpt_t *handler; @@ -139,8 +199,10 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) pio_pinset_t pinset; int irq; + DEBUGASSERT(intf); + #ifdef CONFIG_SAMA5_EMACA - if (intf == EMAC_INTF) + if (strcmp(intf, SAMA5_EMAC_DEVNAME) == 0) { handler = &g_emac_handler; pinset = PIO_INT_ETH1; @@ -149,7 +211,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) else #endif #ifdef CONFIG_SAMA5_GMAC - if (intf == GMAC_INTF) + if (strcmp(intf, SAMA5_GMAC_DEVNAME) == 0) { handler = &g_gmac_handler; pinset = PIO_INT_ETH0; @@ -158,7 +220,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) else #endif { - ndbg("Unsupported interface: %d\n", intf); + ndbg("Unsupported interface: %s\n", intf); return NULL; } @@ -171,12 +233,12 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) /* Get the old button interrupt handler and save the new one */ oldhandler = *handler; - *handler = irqhandler; + *handler = handler; /* Configure the interrupt */ sam_pioirq(pinset); - (void)irq_attach(irq, irqhandler); + (void)irq_attach(irq, handler); sam_pioirqenable(irq); /* Return the old button handler (so that it can be restored) */ diff --git a/configs/sama5d3-xplained/src/sama5d3-xplained.h b/configs/sama5d3-xplained/src/sama5d3-xplained.h index 94a63dfff8..57a17bdb24 100644 --- a/configs/sama5d3-xplained/src/sama5d3-xplained.h +++ b/configs/sama5d3-xplained/src/sama5d3-xplained.h @@ -435,7 +435,7 @@ * Speed Mode:100Mbps * Nway Auto-Negotiation:Enable * - * The KSZ8051 PHY interrtup is available on PE30 INT_ETH1 + * The KSZ8051 PHY interrupt is available on PE30 INT_ETH1 */ #define PIO_INT_ETH1 (PIO_INPUT | PIO_CFG_PULLUP | PIO_CFG_DEGLITCH | \ diff --git a/configs/sama5d3x-ek/include/board.h b/configs/sama5d3x-ek/include/board.h index b682e9d10b..fc50b17865 100644 --- a/configs/sama5d3x-ek/include/board.h +++ b/configs/sama5d3x-ek/include/board.h @@ -372,20 +372,6 @@ extern "C" { void sam_boardinitialize(void); -/************************************************************************************ - * Name: sam_phyirq - * - * Description: - * This function may be called to register an interrupt handler that will be - * called when an interrupt is received from a PHY. - * - ************************************************************************************/ - -#if defined(CONFIG_NET) && (defined(CONFIG_SAMA5_EMACA) || defined(CONFIG_SAMA5_GMAC)) && \ - defined(CONFIG_SAMA5_PIOE_IRQ) -xcpt_t sam_phyirq(int intf, xcpt_t irqhandler); -#endif - /************************************************************************************ * Name: sam_ledinit, sam_setled, and sam_setleds * diff --git a/configs/sama5d3x-ek/src/sam_ethernet.c b/configs/sama5d3x-ek/src/sam_ethernet.c index 813ef3b28a..7fcc42bfbb 100644 --- a/configs/sama5d3x-ek/src/sam_ethernet.c +++ b/configs/sama5d3x-ek/src/sam_ethernet.c @@ -1,7 +1,7 @@ /************************************************************************************ * configs/sama5d3x-ek/src/sam_ethernet.c * - * Copyright (C) 2010 Gregory Nutt. All rights reserved. + * Copyright (C) 2013-2014 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -39,7 +39,11 @@ #include +#include +#include + #include +#include #include "sam_pio.h" #include "sam_ethernet.h" @@ -50,6 +54,18 @@ * Pre-processor Definitions ************************************************************************************/ +#ifndef CONFIG_SAMA5_EMACA +# undef CONFIG_SAMA5_EMAC_ISETH0 +#endif + +#ifdef CONFIG_SAMA5_EMAC_ISETH0 +# SAMA5_EMAC_DEVNAME "eth0" +# SAMA5_GMAC_DEVNAME "eth1" +#else +# SAMA5_GMAC_DEVNAME "eth0" +# SAMA5_EMAC_DEVNAME "eth1" +#endif + /************************************************************************************ * Private Data ************************************************************************************/ @@ -121,17 +137,61 @@ void weak_function sam_netinitialize(void) #endif } -/************************************************************************************ - * Name: sam_phyirq +/**************************************************************************** + * Name: arch_phy_irq * * Description: - * This function may be called to register an interrupt handler that will be - * called when an interrupt is received from a PHY. + * This function may be called to register an interrupt handler that will + * be called when a PHY interrupt occurs. This function both attaches + * the interrupt handler and enables the interrupt if 'handler' is non- + * NULL. If handler is NULL, then the interrupt is detached and disabled + * instead. * - ************************************************************************************/ + * This interrupt may or may not be available on a given platform depending + * on how the network hardware architecture is implemented. In a typical + * case, the PHY interrupt is provided to board-level logic as a GPIO + * interrupt (in which case this is a board-specific interface and really + * should be called board_phy_irq()); In other cases, the PHY interrupt + * may be cause by the chip's MAC logic (in which case arch_phy_irq()) is + * an appropriate name. Other other boards, there may be no PHY interrupts + * available at all. If client attachable PHY interrupts are available + * from the board or from the chip, then CONFIG_ARCH_PHY_INTERRUPT should + * be defined to indicate that fact. + * + * Typical usage: + * a. OS service logic (not application logic*) attaches to the PHY + * PHY interrupt. + * b. When the PHY interrupt occurs, work should be scheduled on the + * worker thread (or perhaps a dedicated application thread). + * c. That worker thread should use the SIOCGMIIPHY, SIOCGMIIREG, + * and SIOCSMIIREG ioctl calls** to communicate with the PHY, + * determine what network event took place (Link Up/Down?), and + * take the appropriate actions. + * + * * This is an OS internal interface and should not be used from + * application space. + * ** This interrupt is really of no use if the Ethernet MAC driver + * does not support these ioctl calls. + * + * Input Parameters: + * intf - Identifies the network interface. For example "eth0". Only + * useful on platforms that support multiple Ethernet interfaces + * and, hence, multiple PHYs and PHY interrupts. + * handler - The client interrupt handler to be invoked when the PHY + * asserts an interrupt. Must reside in OS space, but can + * signal tasks in user space. A value of NULL can be passed + * in order to detach and disable the PHY interrupt. + * + * Returned Value: + * The previous PHY interrupt handler address is returned. This allows you + * to temporarily replace an interrupt handler, then restore the original + * interrupt handler. NULL is returned if there is was not handler in + * place when the call was made. + * + ****************************************************************************/ #ifdef CONFIG_SAMA5_PIOE_IRQ -xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) +xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler); { irqstate_t flags; xcpt_t *handler; @@ -139,8 +199,10 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) pio_pinset_t pinset; int irq; + DEBUGASSERT(intf); + #ifdef CONFIG_SAMA5_EMACA - if (intf == EMAC_INTF) + if (strcmp(intf, SAMA5_EMAC_DEVNAME) == 0) { handler = &g_emac_handler; pinset = PIO_INT_ETH1; @@ -149,7 +211,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) else #endif #ifdef CONFIG_SAMA5_GMAC - if (intf == GMAC_INTF) + if (strcmp(intf, SAMA5_GMAC_DEVNAME) == 0) { handler = &g_gmac_handler; pinset = PIO_INT_ETH0; @@ -158,7 +220,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) else #endif { - ndbg("Unsupported interface: %d\n", intf); + ndbg("Unsupported interface: %s\n", intf); return NULL; } @@ -171,12 +233,12 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) /* Get the old button interrupt handler and save the new one */ oldhandler = *handler; - *handler = irqhandler; + *handler = handler; /* Configure the interrupt */ sam_pioirq(pinset); - (void)irq_attach(irq, irqhandler); + (void)irq_attach(irq, handler); sam_pioirqenable(irq); /* Return the old button handler (so that it can be restored) */ diff --git a/configs/sama5d3x-ek/src/sama5d3x-ek.h b/configs/sama5d3x-ek/src/sama5d3x-ek.h index d340643af2..df02c6a470 100644 --- a/configs/sama5d3x-ek/src/sama5d3x-ek.h +++ b/configs/sama5d3x-ek/src/sama5d3x-ek.h @@ -562,7 +562,7 @@ * Speed Mode:100Mbps * Nway Auto-Negotiation:Enable * - * The KSZ8051 PHY interrtup is available on PE30 INT_ETH1 + * The KSZ8051 PHY interrupt is available on PE30 INT_ETH1 */ #define PIO_INT_ETH1 (PIO_INPUT | PIO_CFG_PULLUP | PIO_CFG_DEGLITCH | \ diff --git a/configs/sama5d4-ek/include/board.h b/configs/sama5d4-ek/include/board.h index b1507a5d62..d28b3f39c4 100644 --- a/configs/sama5d4-ek/include/board.h +++ b/configs/sama5d4-ek/include/board.h @@ -302,20 +302,6 @@ extern "C" { void sam_boardinitialize(void); -/************************************************************************************ - * Name: sam_phyirq - * - * Description: - * This function may be called to register an interrupt handler that will be - * called when an interrupt is received from a PHY. - * - ************************************************************************************/ - -#if defined(CONFIG_NET) && (defined(CONFIG_SAMA5_EMACB) || defined(CONFIG_SAMA5_GMAC)) && \ - defined(CONFIG_SAMA5_PIOE_IRQ) -xcpt_t sam_phyirq(int intf, xcpt_t irqhandler); -#endif - /************************************************************************************ * Name: sam_ledinit, sam_setled, and sam_setleds * diff --git a/configs/sama5d4-ek/src/sam_ethernet.c b/configs/sama5d4-ek/src/sam_ethernet.c index 67bcfa5499..de115f9239 100644 --- a/configs/sama5d4-ek/src/sam_ethernet.c +++ b/configs/sama5d4-ek/src/sam_ethernet.c @@ -39,7 +39,11 @@ #include +#include +#include + #include +#include #include "sam_pio.h" #include "sam_ethernet.h" @@ -50,6 +54,18 @@ * Pre-processor Definitions ************************************************************************************/ +#ifndef CONFIG_SAMA5_EMAC0 +# undef CONFIG_SAMA5_EMAC0_ISETH0 +#endif + +#ifdef CONFIG_SAMA5_EMAC0_ISETH0 +# SAMA5_EMAC0_DEVNAME "eth0" +# SAMA5_EMAC1_DEVNAME "eth1" +#else +# SAMA5_EMAC0_DEVNAME "eth1" +# SAMA5_EMAC1_DEVNAME "eth0" +#endif + /************************************************************************************ * Private Data ************************************************************************************/ @@ -90,17 +106,61 @@ void weak_function sam_netinitialize(void) #endif } -/************************************************************************************ - * Name: sam_phyirq +/**************************************************************************** + * Name: arch_phy_irq * * Description: - * This function may be called to register an interrupt handler that will be - * called when an interrupt is received from a PHY. + * This function may be called to register an interrupt handler that will + * be called when a PHY interrupt occurs. This function both attaches + * the interrupt handler and enables the interrupt if 'handler' is non- + * NULL. If handler is NULL, then the interrupt is detached and disabled + * instead. * - ************************************************************************************/ + * This interrupt may or may not be available on a given platform depending + * on how the network hardware architecture is implemented. In a typical + * case, the PHY interrupt is provided to board-level logic as a GPIO + * interrupt (in which case this is a board-specific interface and really + * should be called board_phy_irq()); In other cases, the PHY interrupt + * may be cause by the chip's MAC logic (in which case arch_phy_irq()) is + * an appropriate name. Other other boards, there may be no PHY interrupts + * available at all. If client attachable PHY interrupts are available + * from the board or from the chip, then CONFIG_ARCH_PHY_INTERRUPT should + * be defined to indicate that fact. + * + * Typical usage: + * a. OS service logic (not application logic*) attaches to the PHY + * PHY interrupt. + * b. When the PHY interrupt occurs, work should be scheduled on the + * worker thread (or perhaps a dedicated application thread). + * c. That worker thread should use the SIOCGMIIPHY, SIOCGMIIREG, + * and SIOCSMIIREG ioctl calls** to communicate with the PHY, + * determine what network event took place (Link Up/Down?), and + * take the appropriate actions. + * + * * This is an OS internal interface and should not be used from + * application space. + * ** This interrupt is really of no use if the Ethernet MAC driver + * does not support these ioctl calls. + * + * Input Parameters: + * intf - Identifies the network interface. For example "eth0". Only + * useful on platforms that support multiple Ethernet interfaces + * and, hence, multiple PHYs and PHY interrupts. + * handler - The client interrupt handler to be invoked when the PHY + * asserts an interrupt. Must reside in OS space, but can + * signal tasks in user space. A value of NULL can be passed + * in order to detach and disable the PHY interrupt. + * + * Returned Value: + * The previous PHY interrupt handler address is returned. This allows you + * to temporarily replace an interrupt handler, then restore the original + * interrupt handler. NULL is returned if there is was not handler in + * place when the call was made. + * + ****************************************************************************/ #ifdef CONFIG_SAMA5_PIOE_IRQ -xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) +xcpt_t arch_phy_irq(FAR const char *intf, xcpt_t handler); { irqstate_t flags; xcpt_t *handler; @@ -108,8 +168,10 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) pio_pinset_t pinset; int irq; + DEBUGASSERT(intf); + #ifdef CONFIG_SAMA5_EMAC0 - if (intf == EMAC0_INTF) + if (strcmp(intf, SAMA5_EMAC0_DEVNAME) == 0) { handler = &g_emac0_handler; pinset = PIO_INT_ETH0; @@ -118,7 +180,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) else #endif #ifdef CONFIG_SAMA5_EMAC1 - if (intf == EMAC1_INTF) + if (strcmp(intf, SAMA5_EMAC1_DEVNAME) == 0) { handler = &g_emac1_handler; pinset = PIO_INT_ETH1; @@ -127,7 +189,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) else #endif { - ndbg("Unsupported interface: %d\n", intf); + ndbg("Unsupported interface: %s\n", intf); return NULL; } @@ -140,12 +202,12 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler) /* Get the old button interrupt handler and save the new one */ oldhandler = *handler; - *handler = irqhandler; + *handler = handler; /* Configure the interrupt */ sam_pioirq(pinset); - (void)irq_attach(irq, irqhandler); + (void)irq_attach(irq, handler); sam_pioirqenable(irq); /* Return the old button handler (so that it can be restored) */