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

📄 skeleton.c

📁 這是一個實時嵌入式作業系統 實作了MCS51 ARM等MCU
💻 C
📖 第 1 页 / 共 2 页
字号:
 ****************************************************************************/static void skel_txdone(struct skel_driver_s *skel){  /* Check for errors and update statistics */  /* If no further xmits are pending, then cancel the TX timeout */  wd_cancel(skel->sk_txtimeout);  /* Then poll uIP for new XMIT data */  (void)uip_poll(&skel->sk_dev, skel_uiptxpoll);}/**************************************************************************** * Function: skel_interrupt * * Description: *   Hardware interrupt handler * * Parameters: *   irq     - Number of the IRQ that generated the interrupt *   context - Interrupt register state save info (architecture-specific) * * Returned Value: *   OK on success * * Assumptions: * ****************************************************************************/static int skel_interrupt(int irq, FAR void *context){  register struct skel_driver_s *skel = &g_skel[0];  /* Disable Ethernet interrupts */  /* Get and clear interrupt status bits */  /* Handle interrupts according to status bit settings */  /* Check if we received an incoming packet, if so, call skel_receive() */  skel_receive(skel);  /* Check is a packet transmission just completed.  If so, call skel_txdone */  skel_txdone(skel);  /* Enable Ethernet interrupts (perhaps excluding the TX done interrupt if    * there are no pending transmissions.   */  return OK;}/**************************************************************************** * Function: skel_txtimeout * * Description: *   Our TX watchdog timed out.  Called from the timer interrupt handler. *   The last TX never completed.  Reset the hardware and start again. * * Parameters: *   argc - The number of available arguments *   arg  - The first argument * * Returned Value: *   None * * Assumptions: * ****************************************************************************/static void skel_txtimeout(int argc, uint32 arg, ...){  struct skel_driver_s *skel = (struct skel_driver_s *)arg;  /* Increment statistics and dump debug info */  /* Then reset the hardware */  /* Then poll uIP for new XMIT data */  (void)uip_poll(&skel->sk_dev, skel_uiptxpoll);}/**************************************************************************** * Function: skel_polltimer * * Description: *   Periodic timer handler.  Called from the timer interrupt handler. * * Parameters: *   argc - The number of available arguments *   arg  - The first argument * * Returned Value: *   None * * Assumptions: * ****************************************************************************/static void skel_polltimer(int argc, uint32 arg, ...){  struct skel_driver_s *skel = (struct skel_driver_s *)arg;  /* Check if there is room in the send another TXr packet.  */  /* If so, update TCP timing states and poll uIP for new XMIT data */  (void)uip_timer(&skel->sk_dev, skel_uiptxpoll, skeleton_POLLHSEC);  /* Setup the watchdog poll timer again */  (void)wd_start(skel->sk_txpoll, skeleton_WDDELAY, skel_polltimer, 1, arg);}/**************************************************************************** * Function: skel_ifup * * Description: *   NuttX Callback: Bring up the Ethernet interface when an IP address is *   provided  * * Parameters: *   dev  - Reference to the NuttX driver state structure * * Returned Value: *   None * * Assumptions: * ****************************************************************************/static int skel_ifup(struct uip_driver_s *dev){  struct skel_driver_s *skel = (struct skel_driver_s *)dev->d_private;  ndbg("Bringing up: %d.%d.%d.%d\n",       dev->d_ipaddr & 0xff, (dev->d_ipaddr >> 8) & 0xff,       (dev->d_ipaddr >> 16) & 0xff, dev->d_ipaddr >> 24 );  /* Initilize Ethernet interface */  /* Set and activate a timer process */  (void)wd_start(skel->sk_txpoll, skeleton_WDDELAY, skel_polltimer, 1, (uint32)skel);  /* Enable the Ethernet interrupt */  skel->sk_bifup = TRUE;  up_enable_irq(CONFIG_skeleton_IRQ);  return OK;}/**************************************************************************** * Function: skel_ifdown * * Description: *   NuttX Callback: Stop the interface. * * Parameters: *   dev  - Reference to the NuttX driver state structure * * Returned Value: *   None * * Assumptions: * ****************************************************************************/static int skel_ifdown(struct uip_driver_s *dev){  struct skel_driver_s *skel = (struct skel_driver_s *)dev->d_private;  irqstate_t flags;  /* Disable the Ethernet interrupt */  flags = irqsave();  up_disable_irq(CONFIG_skeleton_IRQ);  /* Cancel the TX poll timer and TX timeout timers */  wd_cancel(skel->sk_txpoll);  wd_cancel(skel->sk_txtimeout);  /* Reset the device */  skel->sk_bifup = FALSE;  irqrestore(flags);  return OK;}/**************************************************************************** * Function: skel_txavail * * Description: *   Driver callback invoked when new TX data is available.  This is a  *   stimulus perform an out-of-cycle poll and, thereby, reduce the TX *   latency. * * Parameters: *   dev  - Reference to the NuttX driver state structure * * Returned Value: *   None * * Assumptions: *   Called in normal user mode * ****************************************************************************/static int skel_txavail(struct uip_driver_s *dev){  struct skel_driver_s *skel = (struct skel_driver_s *)dev->d_private;  irqstate_t flags;  flags = irqsave();  /* Ignore the notification if the interface is not yet up */  if (skel->sk_bifup)    {      /* Check if there is room in the hardware to hold another outgoing packet. */      /* If so, then poll uIP for new XMIT data */      (void)uip_poll(&skel->sk_dev, skel_uiptxpoll);    }  irqrestore(flags);  return OK;}/**************************************************************************** * Public Functions ****************************************************************************//**************************************************************************** * Function: skel_initialize * * Description: *   Initialize the Ethernet driver * * Parameters: *   None * * Returned Value: *   OK on success; Negated errno on failure. * * Assumptions: * ****************************************************************************//* Initialize the DM90x0 chip and driver */int skel_initialize(void){  /* Check if a Ethernet chip is recognized at its I/O base */  /* Attach the IRQ to the driver */  if (irq_attach(CONFIG_skeleton_IRQ, skel_interrupt))    {      /* We could not attach the ISR to the ISR */      return -EAGAIN;    }  /* Initialize the driver structure */  memset(g_skel, 0, CONFIG_skeleton_NINTERFACES*sizeof(struct skel_driver_s));  g_skel[0].sk_dev.d_ifup    = skel_ifup;     /* I/F down callback */  g_skel[0].sk_dev.d_ifdown  = skel_ifdown;   /* I/F up (new IP address) callback */  g_skel[0].sk_dev.d_txavail = skel_txavail;  /* New TX data callback */  g_skel[0].sk_dev.d_private = (void*)g_skel; /* Used to recover private state from dev */  /* Create a watchdog for timing polling for and timing of transmisstions */  g_skel[0].sk_txpoll       = wd_create();   /* Create periodic poll timer */  g_skel[0].sk_txtimeout    = wd_create();   /* Create TX timeout timer */  /* Read the MAC address from the hardware into g_skel[0].sk_dev.d_mac.ether_addr_octet */  /* Register the device with the OS so that socket IOCTLs can be performed */  (void)netdev_register(&g_skel[0].sk_dev);  return OK;}#endif /* CONFIG_NET && CONFIG_skeleton_NET */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -