⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skeleton.c

📁 這是一個實時嵌入式作業系統 實作了MCS51 ARM等MCU
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************** * 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 + -