📄 skeleton.c
字号:
/**************************************************************************** * drivers/net/skeleton.c * * Copyright (C) 2007 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <spudmonkey@racsa.co.cr> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. Neither the name NuttX nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************//**************************************************************************** * Included Files ****************************************************************************/#include <nuttx/config.h>#if defined(CONFIG_NET) && defined(CONFIG_skeleton_NET)#include <time.h>#include <string.h>#include <debug.h>#include <wdog.h>#include <errno.h>#include <nuttx/irq.h>#include <nuttx/arch.h>#include <net/uip/uip.h>#include <net/uip/uip-arp.h>#include <net/uip/uip-arch.h>/**************************************************************************** * Definitions ****************************************************************************//* CONFIG_skeleton_NINTERFACES determines the number of physical interfaces * that will be supported. */#ifndef CONFIG_skeleton_NINTERFACES# define CONFIG_skeleton_NINTERFACES 1#endif/* TX poll deley = 1 seconds. CLK_TCK is the number of clock ticks per second */#define skeleton_WDDELAY (1*CLK_TCK)#define skeleton_POLLHSEC (1*2)/* TX timeout = 1 minute */#define skeleton_TXTIMEOUT (60*CLK_TCK)/* This is a helper pointer for accessing the contents of the Ethernet header */#define BUF ((struct uip_eth_hdr *)skel->sk_dev.d_buf)/**************************************************************************** * Private Types ****************************************************************************//* The skel_driver_s encapsulates all state information for a single hardware * interface */struct skel_driver_s{ boolean sk_bifup; /* TRUE:ifup FALSE:ifdown */ WDOG_ID sk_txpoll; /* TX poll timer */ WDOG_ID sk_txtimeout; /* TX timeout timer */ /* This holds the information visible to uIP/NuttX */ struct uip_driver_s sk_dev; /* Interface understood by uIP */};/**************************************************************************** * Private Data ****************************************************************************/static struct skel_driver_s g_skel[CONFIG_skeleton_NINTERFACES];/**************************************************************************** * Private Function Prototypes ****************************************************************************//* Common TX logic */static int skel_transmit(struct skel_driver_s *skel);static int skel_uiptxpoll(struct uip_driver_s *dev);/* Interrupt handling */static void skel_receive(struct skel_driver_s *skel);static void skel_txdone(struct skel_driver_s *skel);static int skel_interrupt(int irq, FAR void *context);/* Watchdog timer expirations */static void skel_polltimer(int argc, uint32 arg, ...);static void skel_txtimeout(int argc, uint32 arg, ...);/* NuttX callback functions */static int skel_ifup(struct uip_driver_s *dev);static int skel_ifdown(struct uip_driver_s *dev);static int skel_txavail(struct uip_driver_s *dev);/**************************************************************************** * Private Functions ****************************************************************************//**************************************************************************** * Function: skel_transmit * * Description: * Start hardware transmission. Called either from the txdone interrupt * handling or from watchdog based polling. * * Parameters: * skel - Reference to the driver state structure * * Returned Value: * OK on success; a negated errno on failure * * Assumptions: * ****************************************************************************/static int skel_transmit(struct skel_driver_s *skel){ /* Verify that the hardware is ready to send another packet */ /* Increment statistics */ /* Disable Ethernet interrupts */ /* Send the packet: address=skel->sk_dev.d_buf, length=skel->sk_dev.d_len */ /* Restore Ethernet interrupts */ /* Setup the TX timeout watchdog (perhaps restarting the timer) */ (void)wd_start(skel->sk_txtimeout, skeleton_TXTIMEOUT, skel_txtimeout, 1, (uint32)skel); return OK;}/**************************************************************************** * Function: skel_uiptxpoll * * Description: * The transmitter is available, check if uIP has any outgoing packets ready * to send. This is a callback from uip_poll(). uip_poll() may be called: * * 1. When the preceding TX packet send is complete, * 2. When the preceding TX packet send timesout and the interface is reset * 3. During normal TX polling * * Parameters: * dev - Reference to the NuttX driver state structure * * Returned Value: * OK on success; a negated errno on failure * * Assumptions: * ****************************************************************************/static int skel_uiptxpoll(struct uip_driver_s *dev){ struct skel_driver_s *skel = (struct skel_driver_s *)dev->d_private; /* If the polling resulted in data that should be sent out on the network, * the field d_len is set to a value > 0. */ if (skel->sk_dev.d_len > 0) { uip_arp_out(&skel->sk_dev); skel_transmit(skel); /* Check if there is room in the DM90x0 to hold another packet. If not, * return a non-zero value to terminate the poll. */ } /* If zero is returned, the polling will continue until all connections have * been examined. */ return 0;}/**************************************************************************** * Function: skel_receive * * Description: * An interrupt was received indicating the availability of a new RX packet * * Parameters: * skel - Reference to the driver state structure * * Returned Value: * None * * Assumptions: * ****************************************************************************/static void skel_receive(struct skel_driver_s *skel){ do { /* Check for errors and update statistics */ /* Check if the packet is a valid size for the uIP buffer configuration */ /* Copy the data data from the hardware to skel->sk_dev.d_buf. Set * amount of data in skel->sk_dev.d_len */ /* We only accept IP packets of the configured type and ARP packets */#ifdef CONFIG_NET_IPv6 if (BUF->type == HTONS(UIP_ETHTYPE_IP6))#else if (BUF->type == HTONS(UIP_ETHTYPE_IP))#endif { uip_arp_ipin(); uip_input(&skel->sk_dev); /* If the above function invocation resulted in data that should be * sent out on the network, the field d_len will set to a value > 0. */ if (skel->sk_dev.d_len > 0) { uip_arp_out(&skel->sk_dev); skel_transmit(skel); } } else if (BUF->type == htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(&skel->sk_dev); /* If the above function invocation resulted in data that should be * sent out on the network, the field d_len will set to a value > 0. */ if (skel->sk_dev.d_len > 0) { skel_transmit(skel); } } } } while (); /* While there are more packets to be processed */}/**************************************************************************** * Function: skel_txdone * * Description: * An interrupt was received indicating that the last TX packet(s) is done * * Parameters: * skel - Reference to the driver state structure * * Returned Value: * None * * Assumptions: *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -