Convert existing board specific PHY interrupt interfaces to use newly defined standard interface

This commit is contained in:
Gregory Nutt 2014-08-16 08:35:31 -06:00
parent 96224efa60
commit 16c1405a70
9 changed files with 226 additions and 79 deletions

View File

@ -563,6 +563,7 @@ config ARCH_BOARD_SAMA5D3X_EK
select ARCH_HAVE_LEDS select ARCH_HAVE_LEDS
select ARCH_HAVE_BUTTONS select ARCH_HAVE_BUTTONS
select ARCH_HAVE_IRQBUTTONS select ARCH_HAVE_IRQBUTTONS
select ARCH_PHY_INTERRUPT
---help--- ---help---
The port of NuttX to the Atmel SAMA5D3x-EK development board (where x=1,3,4, or 5). 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_LEDS
select ARCH_HAVE_BUTTONS select ARCH_HAVE_BUTTONS
select ARCH_HAVE_IRQBUTTONS select ARCH_HAVE_IRQBUTTONS
select ARCH_PHY_INTERRUPT
---help--- ---help---
The port of NuttX to the Atmel SAMA5D3 Xplained development board. 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_LEDS
select ARCH_HAVE_BUTTONS select ARCH_HAVE_BUTTONS
select ARCH_HAVE_IRQBUTTONS select ARCH_HAVE_IRQBUTTONS
select ARCH_PHY_INTERRUPT
---help--- ---help---
The port of NuttX to the Atmel SAMA5D4-EK development board The port of NuttX to the Atmel SAMA5D4-EK development board

View File

@ -331,20 +331,6 @@ extern "C" {
void sam_boardinitialize(void); 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 * Name: sam_ledinit, sam_setled, and sam_setleds
* *

View File

@ -1,7 +1,7 @@
/************************************************************************************ /************************************************************************************
* configs/sama5d3-xplained/src/sam_ethernet.c * 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 <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -39,7 +39,11 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <string.h>
#include <assert.h>
#include <nuttx/irq.h> #include <nuttx/irq.h>
#include <nuttx/arch.h>
#include "sam_pio.h" #include "sam_pio.h"
#include "sam_ethernet.h" #include "sam_ethernet.h"
@ -50,6 +54,18 @@
* Pre-processor Definitions * 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 * Private Data
************************************************************************************/ ************************************************************************************/
@ -121,17 +137,61 @@ void weak_function sam_netinitialize(void)
#endif #endif
} }
/************************************************************************************ /****************************************************************************
* Name: sam_phyirq * Name: arch_phy_irq
* *
* Description: * Description:
* This function may be called to register an interrupt handler that will be * This function may be called to register an interrupt handler that will
* called when an interrupt is received from a PHY. * 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 #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; irqstate_t flags;
xcpt_t *handler; xcpt_t *handler;
@ -139,8 +199,10 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
pio_pinset_t pinset; pio_pinset_t pinset;
int irq; int irq;
DEBUGASSERT(intf);
#ifdef CONFIG_SAMA5_EMACA #ifdef CONFIG_SAMA5_EMACA
if (intf == EMAC_INTF) if (strcmp(intf, SAMA5_EMAC_DEVNAME) == 0)
{ {
handler = &g_emac_handler; handler = &g_emac_handler;
pinset = PIO_INT_ETH1; pinset = PIO_INT_ETH1;
@ -149,7 +211,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
else else
#endif #endif
#ifdef CONFIG_SAMA5_GMAC #ifdef CONFIG_SAMA5_GMAC
if (intf == GMAC_INTF) if (strcmp(intf, SAMA5_GMAC_DEVNAME) == 0)
{ {
handler = &g_gmac_handler; handler = &g_gmac_handler;
pinset = PIO_INT_ETH0; pinset = PIO_INT_ETH0;
@ -158,7 +220,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
else else
#endif #endif
{ {
ndbg("Unsupported interface: %d\n", intf); ndbg("Unsupported interface: %s\n", intf);
return NULL; 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 */ /* Get the old button interrupt handler and save the new one */
oldhandler = *handler; oldhandler = *handler;
*handler = irqhandler; *handler = handler;
/* Configure the interrupt */ /* Configure the interrupt */
sam_pioirq(pinset); sam_pioirq(pinset);
(void)irq_attach(irq, irqhandler); (void)irq_attach(irq, handler);
sam_pioirqenable(irq); sam_pioirqenable(irq);
/* Return the old button handler (so that it can be restored) */ /* Return the old button handler (so that it can be restored) */

View File

@ -435,7 +435,7 @@
* Speed Mode:100Mbps * Speed Mode:100Mbps
* Nway Auto-Negotiation:Enable * 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 | \ #define PIO_INT_ETH1 (PIO_INPUT | PIO_CFG_PULLUP | PIO_CFG_DEGLITCH | \

View File

@ -372,20 +372,6 @@ extern "C" {
void sam_boardinitialize(void); 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 * Name: sam_ledinit, sam_setled, and sam_setleds
* *

View File

@ -1,7 +1,7 @@
/************************************************************************************ /************************************************************************************
* configs/sama5d3x-ek/src/sam_ethernet.c * 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 <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -39,7 +39,11 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <string.h>
#include <assert.h>
#include <nuttx/irq.h> #include <nuttx/irq.h>
#include <nuttx/arch.h>
#include "sam_pio.h" #include "sam_pio.h"
#include "sam_ethernet.h" #include "sam_ethernet.h"
@ -50,6 +54,18 @@
* Pre-processor Definitions * 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 * Private Data
************************************************************************************/ ************************************************************************************/
@ -121,17 +137,61 @@ void weak_function sam_netinitialize(void)
#endif #endif
} }
/************************************************************************************ /****************************************************************************
* Name: sam_phyirq * Name: arch_phy_irq
* *
* Description: * Description:
* This function may be called to register an interrupt handler that will be * This function may be called to register an interrupt handler that will
* called when an interrupt is received from a PHY. * 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 #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; irqstate_t flags;
xcpt_t *handler; xcpt_t *handler;
@ -139,8 +199,10 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
pio_pinset_t pinset; pio_pinset_t pinset;
int irq; int irq;
DEBUGASSERT(intf);
#ifdef CONFIG_SAMA5_EMACA #ifdef CONFIG_SAMA5_EMACA
if (intf == EMAC_INTF) if (strcmp(intf, SAMA5_EMAC_DEVNAME) == 0)
{ {
handler = &g_emac_handler; handler = &g_emac_handler;
pinset = PIO_INT_ETH1; pinset = PIO_INT_ETH1;
@ -149,7 +211,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
else else
#endif #endif
#ifdef CONFIG_SAMA5_GMAC #ifdef CONFIG_SAMA5_GMAC
if (intf == GMAC_INTF) if (strcmp(intf, SAMA5_GMAC_DEVNAME) == 0)
{ {
handler = &g_gmac_handler; handler = &g_gmac_handler;
pinset = PIO_INT_ETH0; pinset = PIO_INT_ETH0;
@ -158,7 +220,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
else else
#endif #endif
{ {
ndbg("Unsupported interface: %d\n", intf); ndbg("Unsupported interface: %s\n", intf);
return NULL; 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 */ /* Get the old button interrupt handler and save the new one */
oldhandler = *handler; oldhandler = *handler;
*handler = irqhandler; *handler = handler;
/* Configure the interrupt */ /* Configure the interrupt */
sam_pioirq(pinset); sam_pioirq(pinset);
(void)irq_attach(irq, irqhandler); (void)irq_attach(irq, handler);
sam_pioirqenable(irq); sam_pioirqenable(irq);
/* Return the old button handler (so that it can be restored) */ /* Return the old button handler (so that it can be restored) */

View File

@ -562,7 +562,7 @@
* Speed Mode:100Mbps * Speed Mode:100Mbps
* Nway Auto-Negotiation:Enable * 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 | \ #define PIO_INT_ETH1 (PIO_INPUT | PIO_CFG_PULLUP | PIO_CFG_DEGLITCH | \

View File

@ -302,20 +302,6 @@ extern "C" {
void sam_boardinitialize(void); 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 * Name: sam_ledinit, sam_setled, and sam_setleds
* *

View File

@ -39,7 +39,11 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <string.h>
#include <assert.h>
#include <nuttx/irq.h> #include <nuttx/irq.h>
#include <nuttx/arch.h>
#include "sam_pio.h" #include "sam_pio.h"
#include "sam_ethernet.h" #include "sam_ethernet.h"
@ -50,6 +54,18 @@
* Pre-processor Definitions * 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 * Private Data
************************************************************************************/ ************************************************************************************/
@ -90,17 +106,61 @@ void weak_function sam_netinitialize(void)
#endif #endif
} }
/************************************************************************************ /****************************************************************************
* Name: sam_phyirq * Name: arch_phy_irq
* *
* Description: * Description:
* This function may be called to register an interrupt handler that will be * This function may be called to register an interrupt handler that will
* called when an interrupt is received from a PHY. * 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 #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; irqstate_t flags;
xcpt_t *handler; xcpt_t *handler;
@ -108,8 +168,10 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
pio_pinset_t pinset; pio_pinset_t pinset;
int irq; int irq;
DEBUGASSERT(intf);
#ifdef CONFIG_SAMA5_EMAC0 #ifdef CONFIG_SAMA5_EMAC0
if (intf == EMAC0_INTF) if (strcmp(intf, SAMA5_EMAC0_DEVNAME) == 0)
{ {
handler = &g_emac0_handler; handler = &g_emac0_handler;
pinset = PIO_INT_ETH0; pinset = PIO_INT_ETH0;
@ -118,7 +180,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
else else
#endif #endif
#ifdef CONFIG_SAMA5_EMAC1 #ifdef CONFIG_SAMA5_EMAC1
if (intf == EMAC1_INTF) if (strcmp(intf, SAMA5_EMAC1_DEVNAME) == 0)
{ {
handler = &g_emac1_handler; handler = &g_emac1_handler;
pinset = PIO_INT_ETH1; pinset = PIO_INT_ETH1;
@ -127,7 +189,7 @@ xcpt_t sam_phyirq(int intf, xcpt_t irqhandler)
else else
#endif #endif
{ {
ndbg("Unsupported interface: %d\n", intf); ndbg("Unsupported interface: %s\n", intf);
return NULL; 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 */ /* Get the old button interrupt handler and save the new one */
oldhandler = *handler; oldhandler = *handler;
*handler = irqhandler; *handler = handler;
/* Configure the interrupt */ /* Configure the interrupt */
sam_pioirq(pinset); sam_pioirq(pinset);
(void)irq_attach(irq, irqhandler); (void)irq_attach(irq, handler);
sam_pioirqenable(irq); sam_pioirqenable(irq);
/* Return the old button handler (so that it can be restored) */ /* Return the old button handler (so that it can be restored) */