]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/portable/NetworkInterface/Zynq/x_emacpsif_hw.c
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2822 1d2547de-c912-0410...
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / portable / NetworkInterface / Zynq / x_emacpsif_hw.c
index be00f4f9c8493dff2363d357744bf39b07fc1ed0..e9443cda8e17151e4a2381a2113c29fa31eea298 100644 (file)
-/*
- * Copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.
- *
- * Xilinx, Inc.
- * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
- * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
- * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
- * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
- * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
- * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
- * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
- * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
- * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
- * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "Zynq/x_emacpsif.h"
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-#include "queue.h"
-
-///* FreeRTOS+TCP includes. */
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-#include "FreeRTOS_IP_Private.h"
-#include "NetworkBufferManagement.h"
-
-extern TaskHandle_t xEMACTaskHandle;
-
-/*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c
- *** to run it on a PEEP board
- ***/
-
-unsigned int link_speed = 100;
-
-void setup_isr( xemacpsif_s *xemacpsif )
-{
-       /*
-        * Setup callbacks
-        */
-       XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMASEND,
-               (void *) emacps_send_handler,
-               (void *) xemacpsif);
-
-       XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMARECV,
-               (void *) emacps_recv_handler,
-               (void *) xemacpsif);
-
-       XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_ERROR,
-               (void *) emacps_error_handler,
-               (void *) xemacpsif);
-}
-
-void start_emacps (xemacpsif_s *xemacps)
-{
-       /* start the temac */
-       XEmacPs_Start(&xemacps->emacps);
-}
-
-extern struct xtopology_t xXTopology;
-
-volatile int error_msg_count = 0;
-volatile const char *last_err_msg = "";
-
-struct xERROR_MSG {
-       void *arg;
-       u8 Direction;
-       u32 ErrorWord;
-};
-
-static struct xERROR_MSG xErrorList[ 8 ];
-static BaseType_t xErrorHead, xErrorTail;
-
-void emacps_error_handler(void *arg, u8 Direction, u32 ErrorWord)
-{
-       BaseType_t xHigherPriorityTaskWoken = pdFALSE;
-       xemacpsif_s *xemacpsif;
-       BaseType_t xNextHead = xErrorHead;
-
-       xemacpsif = (xemacpsif_s *)(arg);
-
-       if( ( Direction != XEMACPS_SEND ) || (ErrorWord != XEMACPS_TXSR_USEDREAD_MASK ) )
-       {
-               if( ++xNextHead == ( sizeof( xErrorList ) / sizeof( xErrorList[ 0 ] ) ) )
-                       xNextHead = 0;
-               if( xNextHead != xErrorTail )
-               {
-
-                       xErrorList[ xErrorHead ].arg = arg;
-                       xErrorList[ xErrorHead ].Direction = Direction;
-                       xErrorList[ xErrorHead ].ErrorWord = ErrorWord;
-
-                       xErrorHead = xNextHead;
-
-                       xemacpsif = (xemacpsif_s *)(arg);
-                       xemacpsif->isr_events |= EMAC_IF_ERR_EVENT;
-               }
-
-               if( xEMACTaskHandle != NULL )
-               {
-                       vTaskNotifyGiveFromISR( xEMACTaskHandle, &xHigherPriorityTaskWoken );
-               }
-
-       }
-
-       portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
-}
-
-static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord);
-
-int emacps_check_errors( xemacpsif_s *xemacps )
-{
-int xResult;
-
-       ( void ) xemacps;
-
-       if( xErrorHead == xErrorTail )
-       {
-               xResult = 0;
-       }
-       else
-       {
-               xResult = 1;
-               emacps_handle_error(
-                       xErrorList[ xErrorTail ].arg,
-                       xErrorList[ xErrorTail ].Direction,
-                       xErrorList[ xErrorTail ].ErrorWord );
-       }
-
-       return xResult;
-}
-
-BaseType_t xNetworkInterfaceInitialise( void );
-
-static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord)
-{
-       xemacpsif_s   *xemacpsif;
-       struct xtopology_t *xtopologyp;
-       XEmacPs *xemacps;
-
-       xemacpsif = (xemacpsif_s *)(arg);
-
-       xtopologyp = &xXTopology;
-
-       xemacps = &xemacpsif->emacps;
-
-       /* Do not appear to be used. */
-       ( void ) xemacps;
-       ( void ) xtopologyp;
-
-       last_err_msg = NULL;
-
-       if( ErrorWord != 0 )
-       {
-               switch (Direction) {
-               case XEMACPS_RECV:
-                       if( ( ErrorWord & XEMACPS_RXSR_HRESPNOK_MASK ) != 0 )
-                       {
-                               last_err_msg = "Receive DMA error";
-                               xNetworkInterfaceInitialise( );
-                       }
-                       if( ( ErrorWord & XEMACPS_RXSR_RXOVR_MASK ) != 0 )
-                       {
-                               last_err_msg = "Receive over run";
-                               emacps_recv_handler(arg);
-                       }
-                       if( ( ErrorWord & XEMACPS_RXSR_BUFFNA_MASK ) != 0 )
-                       {
-                               last_err_msg = "Receive buffer not available";
-                               emacps_recv_handler(arg);
-                       }
-                       break;
-               case XEMACPS_SEND:
-                       if( ( ErrorWord & XEMACPS_TXSR_HRESPNOK_MASK ) != 0 )
-                       {
-                               last_err_msg = "Transmit DMA error";
-                               xNetworkInterfaceInitialise( );
-                       }
-                       if( ( ErrorWord & XEMACPS_TXSR_URUN_MASK ) != 0 )
-                       {
-                               last_err_msg = "Transmit under run";
-                               HandleTxErrors( xemacpsif );
-                       }
-                       if( ( ErrorWord & XEMACPS_TXSR_BUFEXH_MASK ) != 0 )
-                       {
-                               last_err_msg = "Transmit buffer exhausted";
-                               HandleTxErrors( xemacpsif );
-                       }
-                       if( ( ErrorWord & XEMACPS_TXSR_RXOVR_MASK ) != 0 )
-                       {
-                               last_err_msg = "Transmit retry excessed limits";
-                               HandleTxErrors( xemacpsif );
-                       }
-                       if( ( ErrorWord & XEMACPS_TXSR_FRAMERX_MASK ) != 0 )
-                       {
-                               last_err_msg = "Transmit collision";
-                               emacps_check_tx( xemacpsif );
-                       }
-                       break;
-               }
-       }
-       // Break on this statement and inspect error_msg if you like
-       if( last_err_msg != NULL )
-       {
-               error_msg_count++;
-               FreeRTOS_printf( ( "emacps_handle_error: %s\n", last_err_msg ) );
-       }
-}
-
-extern XEmacPs_Config mac_config;
-
-void HandleTxErrors(xemacpsif_s *xemacpsif)
-{
-       u32 netctrlreg;
-
-       //taskENTER_CRITICAL()
-       {
-               netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
-                                                                                                       XEMACPS_NWCTRL_OFFSET);
-               netctrlreg = netctrlreg & (~XEMACPS_NWCTRL_TXEN_MASK);
-               XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
-                                                                               XEMACPS_NWCTRL_OFFSET, netctrlreg);
-
-               clean_dma_txdescs( xemacpsif );
-               netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
-                                                                                                               XEMACPS_NWCTRL_OFFSET);
-               netctrlreg = netctrlreg | (XEMACPS_NWCTRL_TXEN_MASK);
-               XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
-                                                                                       XEMACPS_NWCTRL_OFFSET, netctrlreg);
-       }
-       //taskEXIT_CRITICAL( );
-}
+/*\r
+ * Copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.\r
+ *\r
+ * Xilinx, Inc.\r
+ * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A\r
+ * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS\r
+ * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR\r
+ * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION\r
+ * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE\r
+ * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.\r
+ * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO\r
+ * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO\r
+ * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE\r
+ * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY\r
+ * AND FITNESS FOR A PARTICULAR PURPOSE.\r
+ *\r
+ */\r
+\r
+\r
+/* Standard includes. */\r
+#include <stdint.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+#include "Zynq/x_emacpsif.h"\r
+\r
+/* FreeRTOS includes. */\r
+#include "FreeRTOS.h"\r
+#include "task.h"\r
+#include "queue.h"\r
+\r
+///* FreeRTOS+TCP includes. */\r
+/* FreeRTOS+TCP includes. */\r
+#include "FreeRTOS_IP.h"\r
+#include "FreeRTOS_Sockets.h"\r
+#include "FreeRTOS_IP_Private.h"\r
+#include "NetworkBufferManagement.h"\r
+\r
+extern TaskHandle_t xEMACTaskHandle;\r
+\r
+/*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c\r
+ *** to run it on a PEEP board\r
+ ***/\r
+\r
+unsigned int link_speed = 100;\r
+\r
+void setup_isr( xemacpsif_s *xemacpsif )\r
+{\r
+       /*\r
+        * Setup callbacks\r
+        */\r
+       XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMASEND,\r
+               (void *) emacps_send_handler,\r
+               (void *) xemacpsif);\r
+\r
+       XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMARECV,\r
+               (void *) emacps_recv_handler,\r
+               (void *) xemacpsif);\r
+\r
+       XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_ERROR,\r
+               (void *) emacps_error_handler,\r
+               (void *) xemacpsif);\r
+}\r
+\r
+void start_emacps (xemacpsif_s *xemacps)\r
+{\r
+       /* start the temac */\r
+       XEmacPs_Start(&xemacps->emacps);\r
+}\r
+\r
+extern struct xtopology_t xXTopology;\r
+\r
+volatile int error_msg_count = 0;\r
+volatile const char *last_err_msg = "";\r
+\r
+struct xERROR_MSG {\r
+       void *arg;\r
+       u8 Direction;\r
+       u32 ErrorWord;\r
+};\r
+\r
+static struct xERROR_MSG xErrorList[ 8 ];\r
+static BaseType_t xErrorHead, xErrorTail;\r
+\r
+void emacps_error_handler(void *arg, u8 Direction, u32 ErrorWord)\r
+{\r
+       BaseType_t xHigherPriorityTaskWoken = pdFALSE;\r
+       xemacpsif_s *xemacpsif;\r
+       BaseType_t xNextHead = xErrorHead;\r
+\r
+       xemacpsif = (xemacpsif_s *)(arg);\r
+\r
+       if( ( Direction != XEMACPS_SEND ) || (ErrorWord != XEMACPS_TXSR_USEDREAD_MASK ) )\r
+       {\r
+               if( ++xNextHead == ( sizeof( xErrorList ) / sizeof( xErrorList[ 0 ] ) ) )\r
+                       xNextHead = 0;\r
+               if( xNextHead != xErrorTail )\r
+               {\r
+\r
+                       xErrorList[ xErrorHead ].arg = arg;\r
+                       xErrorList[ xErrorHead ].Direction = Direction;\r
+                       xErrorList[ xErrorHead ].ErrorWord = ErrorWord;\r
+\r
+                       xErrorHead = xNextHead;\r
+\r
+                       xemacpsif = (xemacpsif_s *)(arg);\r
+                       xemacpsif->isr_events |= EMAC_IF_ERR_EVENT;\r
+               }\r
+\r
+               if( xEMACTaskHandle != NULL )\r
+               {\r
+                       vTaskNotifyGiveFromISR( xEMACTaskHandle, &xHigherPriorityTaskWoken );\r
+               }\r
+\r
+       }\r
+\r
+       portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
+}\r
+\r
+static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord);\r
+\r
+int emacps_check_errors( xemacpsif_s *xemacps )\r
+{\r
+int xResult;\r
+\r
+       ( void ) xemacps;\r
+\r
+       if( xErrorHead == xErrorTail )\r
+       {\r
+               xResult = 0;\r
+       }\r
+       else\r
+       {\r
+               xResult = 1;\r
+               emacps_handle_error(\r
+                       xErrorList[ xErrorTail ].arg,\r
+                       xErrorList[ xErrorTail ].Direction,\r
+                       xErrorList[ xErrorTail ].ErrorWord );\r
+       }\r
+\r
+       return xResult;\r
+}\r
+\r
+BaseType_t xNetworkInterfaceInitialise( void );\r
+\r
+static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord)\r
+{\r
+       xemacpsif_s   *xemacpsif;\r
+       struct xtopology_t *xtopologyp;\r
+       XEmacPs *xemacps;\r
+\r
+       xemacpsif = (xemacpsif_s *)(arg);\r
+\r
+       xtopologyp = &xXTopology;\r
+\r
+       xemacps = &xemacpsif->emacps;\r
+\r
+       /* Do not appear to be used. */\r
+       ( void ) xemacps;\r
+       ( void ) xtopologyp;\r
+\r
+       last_err_msg = NULL;\r
+\r
+       if( ErrorWord != 0 )\r
+       {\r
+               switch (Direction) {\r
+               case XEMACPS_RECV:\r
+                       if( ( ErrorWord & XEMACPS_RXSR_HRESPNOK_MASK ) != 0 )\r
+                       {\r
+                               last_err_msg = "Receive DMA error";\r
+                               xNetworkInterfaceInitialise( );\r
+                       }\r
+                       if( ( ErrorWord & XEMACPS_RXSR_RXOVR_MASK ) != 0 )\r
+                       {\r
+                               last_err_msg = "Receive over run";\r
+                               emacps_recv_handler(arg);\r
+                       }\r
+                       if( ( ErrorWord & XEMACPS_RXSR_BUFFNA_MASK ) != 0 )\r
+                       {\r
+                               last_err_msg = "Receive buffer not available";\r
+                               emacps_recv_handler(arg);\r
+                       }\r
+                       break;\r
+               case XEMACPS_SEND:\r
+                       if( ( ErrorWord & XEMACPS_TXSR_HRESPNOK_MASK ) != 0 )\r
+                       {\r
+                               last_err_msg = "Transmit DMA error";\r
+                               xNetworkInterfaceInitialise( );\r
+                       }\r
+                       if( ( ErrorWord & XEMACPS_TXSR_URUN_MASK ) != 0 )\r
+                       {\r
+                               last_err_msg = "Transmit under run";\r
+                               HandleTxErrors( xemacpsif );\r
+                       }\r
+                       if( ( ErrorWord & XEMACPS_TXSR_BUFEXH_MASK ) != 0 )\r
+                       {\r
+                               last_err_msg = "Transmit buffer exhausted";\r
+                               HandleTxErrors( xemacpsif );\r
+                       }\r
+                       if( ( ErrorWord & XEMACPS_TXSR_RXOVR_MASK ) != 0 )\r
+                       {\r
+                               last_err_msg = "Transmit retry excessed limits";\r
+                               HandleTxErrors( xemacpsif );\r
+                       }\r
+                       if( ( ErrorWord & XEMACPS_TXSR_FRAMERX_MASK ) != 0 )\r
+                       {\r
+                               last_err_msg = "Transmit collision";\r
+                               emacps_check_tx( xemacpsif );\r
+                       }\r
+                       break;\r
+               }\r
+       }\r
+       // Break on this statement and inspect error_msg if you like\r
+       if( last_err_msg != NULL )\r
+       {\r
+               error_msg_count++;\r
+               FreeRTOS_printf( ( "emacps_handle_error: %s\n", last_err_msg ) );\r
+       }\r
+}\r
+\r
+extern XEmacPs_Config mac_config;\r
+\r
+void HandleTxErrors(xemacpsif_s *xemacpsif)\r
+{\r
+       u32 netctrlreg;\r
+\r
+       //taskENTER_CRITICAL()\r
+       {\r
+               netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,\r
+                                                                                                       XEMACPS_NWCTRL_OFFSET);\r
+               netctrlreg = netctrlreg & (~XEMACPS_NWCTRL_TXEN_MASK);\r
+               XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,\r
+                                                                               XEMACPS_NWCTRL_OFFSET, netctrlreg);\r
+\r
+               clean_dma_txdescs( xemacpsif );\r
+               netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,\r
+                                                                                                               XEMACPS_NWCTRL_OFFSET);\r
+               netctrlreg = netctrlreg | (XEMACPS_NWCTRL_TXEN_MASK);\r
+               XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,\r
+                                                                                       XEMACPS_NWCTRL_OFFSET, netctrlreg);\r
+       }\r
+       //taskEXIT_CRITICAL( );\r
+}\r