]> git.sur5r.net Git - freertos/commitdiff
Tidy up an comment.
authorRichardBarry <RichardBarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 16 Nov 2008 20:25:26 +0000 (20:25 +0000)
committerRichardBarry <RichardBarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 16 Nov 2008 20:25:26 +0000 (20:25 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@552 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/webserver/FEC.c
Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/webserver/FEC.h
Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/webserver/httpd-cgi.c
Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/webserver/uIP_Task.c

index 5e82b8223f682a4910e5b8fc93493b29c06e9096..9e13d0088c76396ad018ee621aa109772c3b9391 100644 (file)
@@ -35,7 +35,7 @@
 #include "semphr.h"\r
 #include "task.h"\r
 \r
-/* Demo includes. */\r
+/* Hardware includes. */\r
 #include "fecbd.h"\r
 #include "mii.h"\r
 #include "eth_phy.h"\r
@@ -45,9 +45,6 @@
 #include "uip.h"\r
 #include "uip_arp.h"\r
 \r
-#define MCF_FEC_MSCR_MII_SPEED(x)              (((x)&0x3F)<<0x1)\r
-#define MCF_FEC_RCR_MAX_FL(x)                  (((x)&0x7FF)<<0x10)\r
-\r
 /* Delay between polling the PHY to see if a link has been established. */\r
 #define fecLINK_DELAY                                                  ( 500 / portTICK_RATE_MS )\r
 \r
 #define fecMII_DELAY                                                   ( 10 / portTICK_RATE_MS )\r
 #define fecMAX_POLLS                                                   ( 20 )\r
 \r
-/* Delay between looking for incoming packets.  In ideal world this would be\r
-infinite. */\r
-#define netifBLOCK_TIME_WAITING_FOR_INPUT              fecLINK_DELAY\r
-\r
 /* Constants used to delay while waiting for a tx descriptor to be free. */\r
-#define fecTX_BUFFER_WAIT                                              ( 200 / portTICK_RATE_MS )\r
+#define fecMAX_WAIT_FOR_TX_BUFFER                                              ( 200 / portTICK_RATE_MS )\r
 \r
-/* We only use a single Tx descriptor - the duplicate send silicon errata\r
-actually assists in this case. */\r
+/* We only use a single Tx descriptor which can lead to Txed packets being sent\r
+twice (due to a bug in the FEC silicon).  However, in this case the bug is used\r
+to our advantage in that it means the uip-split mechanism is not required. */\r
 #define fecNUM_FEC_TX_BUFFERS                                  ( 1 )\r
 #define fecTX_BUFFER_TO_USE                                            ( 0 )\r
 /*-----------------------------------------------------------*/\r
@@ -72,7 +66,7 @@ actually assists in this case. */
 xSemaphoreHandle xFECSemaphore = NULL, xTxSemaphore = NULL;\r
 \r
 /* The buffer used by the uIP stack.  In this case the pointer is used to\r
-point to one of the Rx buffers. */\r
+point to one of the Rx buffers to effect a zero copy policy. */\r
 unsigned portCHAR *uip_buf;\r
 \r
 /* The DMA descriptors.  This is a char array to allow us to align it correctly. */\r
@@ -81,17 +75,27 @@ static unsigned portCHAR xFECRxDescriptors_unaligned[ ( configNUM_FEC_RX_BUFFERS
 static FECBD *xFECTxDescriptors;\r
 static FECBD *xFECRxDescriptors;\r
 \r
-/* The DMA buffers.  These are char arrays to allow them to be alligned correctly. */\r
+/* The DMA buffers.  These are char arrays to allow them to be aligned correctly. */\r
 static unsigned portCHAR ucFECRxBuffers[ ( configNUM_FEC_RX_BUFFERS * configFEC_BUFFER_SIZE ) + 16 ];\r
 static unsigned portBASE_TYPE uxNextRxBuffer = 0, uxIndexToBufferOwner = 0;\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
+/* \r
+ * Enable all the required interrupts in the FEC and in the interrupt controller. \r
+ */\r
 static void prvEnableFECInterrupts( void );\r
+\r
+/*\r
+ * Reset the FEC if we get into an unrecoverable state.\r
+ */\r
 static void prvResetFEC( portBASE_TYPE xCalledFromISR );\r
 \r
 /********************************************************************/\r
+\r
 /*\r
+ * FUNCTION ADAPTED FROM FREESCALE SUPPLIED SOURCE\r
+ * \r
  * Write a value to a PHY's MII register.\r
  *\r
  * Parameters:\r
@@ -157,6 +161,8 @@ uint32 eimr;
 \r
 /********************************************************************/\r
 /*\r
+ * FUNCTION ADAPTED FROM FREESCALE SUPPLIED SOURCE\r
+ *\r
  * Read a value from a PHY's MII register.\r
  *\r
  * Parameters:\r
@@ -225,6 +231,8 @@ uint32 eimr;
 \r
 /********************************************************************/\r
 /*\r
+ * FUNCTION ADAPTED FROM FREESCALE SUPPLIED SOURCE\r
+ *\r
  * Generate the hash table settings for the given address\r
  *\r
  * Parameters:\r
@@ -264,6 +272,8 @@ int i, j;
 \r
 /********************************************************************/\r
 /*\r
+ * FUNCTION ADAPTED FROM FREESCALE SUPPLIED SOURCE\r
+ *\r
  * Set the Physical (Hardware) Address and the Individual Address\r
  * Hash in the selected FEC\r
  *\r
@@ -303,6 +313,7 @@ static void prvInitialiseFECBuffers( void )
 unsigned portBASE_TYPE ux;\r
 unsigned portCHAR *pcBufPointer;\r
 \r
+       /* Correctly align the Tx descriptor pointer. */\r
        pcBufPointer = &( xFECTxDescriptors_unaligned[ 0 ] );\r
        while( ( ( unsigned portLONG ) pcBufPointer & 0x0fUL ) != 0 )\r
        {\r
@@ -311,6 +322,7 @@ unsigned portCHAR *pcBufPointer;
 \r
        xFECTxDescriptors = ( FECBD * ) pcBufPointer;\r
 \r
+       /* Likewise the Rx descriptor pointer. */\r
        pcBufPointer = &( xFECRxDescriptors_unaligned[ 0 ] );\r
        while( ( ( unsigned portLONG ) pcBufPointer & 0x0fUL ) != 0 )\r
        {\r
@@ -320,9 +332,9 @@ unsigned portCHAR *pcBufPointer;
        xFECRxDescriptors = ( FECBD * ) pcBufPointer;\r
 \r
 \r
-       /* Setup the buffers and descriptors.  The data member does not point\r
-       anywhere yet as there is not yet anything to send and a zero copy policy\r
-       is used. */
+       /* Setup the Tx buffers and descriptors.  There is no separate Tx buffer\r
+       to point to (the Rx buffers are actually used) so the data member is\r
+       set to NULL for now. */
        for( ux = 0; ux < fecNUM_FEC_TX_BUFFERS; ux++ )\r
        {\r
                xFECTxDescriptors[ ux ].status = TX_BD_TC;\r
@@ -330,6 +342,8 @@ unsigned portCHAR *pcBufPointer;
                xFECTxDescriptors[ ux ].length = 0;\r
        }\r
 \r
+       /* Setup the Rx buffers and descriptors, having first ensured correct\r
+       alignment. */\r
        pcBufPointer = &( ucFECRxBuffers[ 0 ] );\r
        while( ( ( unsigned portLONG ) pcBufPointer & 0x0fUL ) != 0 )\r
        {\r
@@ -352,10 +366,12 @@ unsigned portCHAR *pcBufPointer;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-void vInitFEC( void )\r
+void vFECInit( void )\r
 {\r
 unsigned portSHORT usData;\r
 struct uip_eth_addr xAddr;\r
+\r
+/* The MAC address is set at the foot of FreeRTOSConfig.h. */\r
 const unsigned portCHAR ucMACAddress[6] =\r
 {\r
        configMAC_0, configMAC_1,configMAC_2, configMAC_3, configMAC_4, configMAC_5\r
@@ -363,8 +379,12 @@ const unsigned portCHAR ucMACAddress[6] =
 \r
        /* Create the semaphore used by the ISR to wake the uIP task. */\r
        vSemaphoreCreateBinary( xFECSemaphore );\r
+\r
+       /* Create the semaphore used to unblock any tasks that might be waiting\r
+       for a Tx descriptor. */\r
        vSemaphoreCreateBinary( xTxSemaphore );\r
 \r
+       /* Initialise all the buffers and descriptors used by the DMA. */\r
        prvInitialiseFECBuffers();\r
 \r
        for( usData = 0; usData < 6; usData++ )\r
@@ -498,6 +518,7 @@ const unsigned portCHAR ucMACAddress[6] =
 \r
        prvEnableFECInterrupts();\r
 \r
+       /* Finally... enable. */\r
        MCF_FEC_ECR = MCF_FEC_ECR_ETHER_EN;\r
        MCF_FEC_RDAR = MCF_FEC_RDAR_R_DES_ACTIVE;\r
 }\r
@@ -512,6 +533,7 @@ unsigned portBASE_TYPE ux;
        #error configFEC_INTERRUPT_PRIORITY must be less than or equal to configMAX_SYSCALL_INTERRUPT_PRIORITY\r
 #endif\r
 \r
+       /* Set the priority of each of the FEC interrupts. */\r
        for( ux = uxFirstFECVector; ux <= uxLastFECVector; ux++ )\r
        {\r
                MCF_INTC0_ICR( ux ) = MCF_INTC_ICR_IL( configFEC_INTERRUPT_PRIORITY );\r
@@ -536,12 +558,15 @@ static void prvResetFEC( portBASE_TYPE xCalledFromISR )
 {\r
 portBASE_TYPE x;\r
 \r
+       /* A critical section is used unless this function is being called from\r
+       an ISR. */\r
        if( xCalledFromISR == pdFALSE )\r
        {\r
                taskENTER_CRITICAL();\r
        }\r
 \r
        {\r
+               /* Reset all buffers and descriptors. */\r
                prvInitialiseFECBuffers();\r
 \r
                /* Set the Reset bit and clear the Enable bit */\r
@@ -553,6 +578,7 @@ portBASE_TYPE x;
                        asm( "NOP" );\r
                }\r
 \r
+               /* Re-enable. */\r
                MCF_FEC_ECR = MCF_FEC_ECR_ETHER_EN;\r
                MCF_FEC_RDAR = MCF_FEC_RDAR_R_DES_ACTIVE;\r
        }\r
@@ -564,7 +590,7 @@ portBASE_TYPE x;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-unsigned short usGetFECRxData( void )\r
+unsigned short usFECGetRxedData( void )\r
 {\r
 unsigned portSHORT usLen;\r
 \r
@@ -584,7 +610,7 @@ unsigned portSHORT usLen;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-void vDiscardRxData( void )\r
+void vFECRxProcessingCompleted( void )\r
 {\r
        /* Free the descriptor as the buffer it points to is no longer in use. */\r
        xFECRxDescriptors[ uxNextRxBuffer ].status |= RX_BD_E;\r
@@ -597,10 +623,10 @@ void vDiscardRxData( void )
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-void vSendBufferToFEC( void )\r
+void vFECSendData( void )\r
 {\r
        /* Ensure no Tx frames are outstanding. */\r
-       if( xSemaphoreTake( xTxSemaphore, fecTX_BUFFER_WAIT ) == pdPASS )\r
+       if( xSemaphoreTake( xTxSemaphore, fecMAX_WAIT_FOR_TX_BUFFER ) == pdPASS )\r
        {\r
                /* Get a DMA buffer into which we can write the data to send. */\r
                if( xFECTxDescriptors[ fecTX_BUFFER_TO_USE ].status & TX_BD_R )\r
@@ -615,7 +641,7 @@ void vSendBufferToFEC( void )
                else\r
                {\r
                        /* Setup the buffer descriptor for transmission.  The data being\r
-                       sent is actually stored in one of the Rx descripter buffers,\r
+                       sent is actually stored in one of the Rx descriptor buffers,\r
                        pointed to by uip_buf. */\r
                        xFECTxDescriptors[ fecTX_BUFFER_TO_USE ].length = uip_len;\r
                        xFECTxDescriptors[ fecTX_BUFFER_TO_USE ].status |= ( TX_BD_R | TX_BD_L );\r
@@ -637,7 +663,8 @@ void vSendBufferToFEC( void )
        }\r
        else\r
        {\r
-               vDiscardRxData();\r
+               /* Gave up waiting.  Free the buffer back to the DMA. */\r
+               vFECRxProcessingCompleted();\r
        }\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -647,6 +674,10 @@ void vFEC_ISR( void )
 unsigned portLONG ulEvent;\r
 portBASE_TYPE xHighPriorityTaskWoken = pdFALSE;\r
 \r
+       /* This handler is called in response to any of the many separate FEC\r
+       interrupt. */\r
+\r
+       /* Find the cause of the interrupt, then clear the interrupt. */\r
        ulEvent = MCF_FEC_EIR & MCF_FEC_EIMR;\r
        MCF_FEC_EIR = ulEvent;\r
 \r
@@ -675,6 +706,8 @@ portBASE_TYPE xHighPriorityTaskWoken = pdFALSE;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+/* Install the many different interrupt vectors, all of which call the same\r
+handler function. */\r
 void __attribute__ ((interrupt)) __cs3_isr_interrupt_87( void ) { vFEC_ISR(); }\r
 void __attribute__ ((interrupt)) __cs3_isr_interrupt_88( void ) { vFEC_ISR(); }\r
 void __attribute__ ((interrupt)) __cs3_isr_interrupt_89( void ) { vFEC_ISR(); }\r
index 1a956b361485478758c9b6088b0516f8201b53bb..2414d1dca73f054c39130523baf97fd55e2eff93 100644 (file)
@@ -70,10 +70,10 @@ typedef struct {
     int rfsw_tr;    /* RFSW Truncated          */\r
 } FEC_EVENT_LOG;\r
 \r
-void vInitFEC( void );\r
-unsigned short usGetFECRxData( void );\r
-void vSendBufferToFEC( void );\r
-void vDiscardRxData( void );\r
+void vFECInit( void );\r
+unsigned short usFECGetRxedData( void );\r
+void vFECSendData( void );\r
+void vFECRxProcessingCompleted( void );\r
 \r
 /********************************************************************/\r
 \r
index c88711f3ca38b9a22a323d8b1629067f013a9286..ef683fd9f6f05b01aaa89f80c92ac29c24a14311 100644 (file)
@@ -265,6 +265,33 @@ static PT_THREAD(led_io(struct httpd_state *s, char *ptr))
   PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL);\r
   PSOCK_END(&s->sout);\r
 }\r
+/*---------------------------------------------------------------------------*/\r
+\r
+void vApplicationProcessFormInput( char *pcInputString )\r
+{\r
+char *c = pcInputString;\r
+\r
+       /* Process the form input sent by the IO page of the served HTML. \r
+       This just contains an instruction to either turn on or off the LED. */\r
+       while( ( *c != '?' ) && ( *c != 0x00 ) )\r
+       {\r
+               c++;\r
+       }\r
+\r
+    if( *c == '?' )\r
+    {\r
+       c++;\r
+               if( strcmp( c, "LED0=1" ) == 0 )\r
+               {\r
+                       vParTestSetLED( 3, 1 );\r
+               }\r
+               else\r
+               {\r
+                       vParTestSetLED( 3, 0 );\r
+               }\r
+    }\r
+}\r
+\r
 \r
 /** @} */\r
 \r
index f21a2ee121aeddbffe50a90fede641fe1261fe36..091ba04cf20841749622811c82c3f117dda63cd0 100644 (file)
        port sections of the online documentation.\r
        ***************************************************************************\r
 */\r
+\r
+\r
+/* Task that controls the uIP TCP/IP stack. */\r
+\r
+\r
 /* Standard includes. */\r
 #include <string.h>\r
 \r
 #include "FEC.h"\r
 #include "partest.h"\r
 \r
-//struct timer {\r
-//  clock_time_t start;\r
-//  clock_time_t interval;\r
-//};\r
-\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
-/* How long to wait before attempting to connect the MAC again. */\r
-#define uipINIT_WAIT    100\r
-\r
 /* Shortcut to the header within the Rx buffer. */\r
 #define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ])\r
 \r
-/* Standard constant. */\r
-#define uipTOTAL_FRAME_HEADER_SIZE     54\r
-\r
 /*-----------------------------------------------------------*/\r
 \r
 /*\r
@@ -72,6 +66,9 @@
  */\r
 void clock_init( void );\r
 clock_time_t clock_time( void );\r
+extern void timer_set(struct timer *t, clock_time_t interval);\r
+extern int timer_expired(struct timer *t);\r
+extern void timer_reset(struct timer *t);\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
@@ -92,19 +89,13 @@ clock_time_t clock_time( void )
 {\r
        return xTaskGetTickCount();\r
 }\r
-extern void timer_set(struct timer *t, clock_time_t interval);\r
-extern int timer_expired(struct timer *t);\r
-extern void timer_reset(struct timer *t);\r
-\r
-\r
-\r
+/*-----------------------------------------------------------*/\r
 \r
 void vuIP_Task( void *pvParameters )\r
 {\r
 portBASE_TYPE i;\r
 uip_ipaddr_t xIPAddr;\r
 struct timer periodic_timer, arp_timer;\r
-extern void ( vEMAC_ISR )( void );\r
 \r
        /* To prevent compiler warnings. */\r
        ( void ) pvParameters;\r
@@ -115,14 +106,17 @@ extern void ( vEMAC_ISR )( void );
        uip_init();\r
        uip_ipaddr( xIPAddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 );\r
        uip_sethostaddr( xIPAddr );\r
+\r
+       /* Initialise the WEB server. */\r
        httpd_init();\r
 \r
-       vInitFEC();\r
+       /* Initialise the Ethernet controller peripheral. */\r
+       vFECInit();\r
 \r
        for( ;; )\r
        {\r
                /* Is there received data ready to be processed? */\r
-               uip_len = usGetFECRxData();\r
+               uip_len = usFECGetRxedData();\r
 \r
                if( uip_len > 0 )\r
                {\r
@@ -139,11 +133,13 @@ extern void ( vEMAC_ISR )( void );
                                if( uip_len > 0 )\r
                                {\r
                                        uip_arp_out();\r
-                                       vSendBufferToFEC();\r
+                                       vFECSendData();\r
                                }\r
                                else\r
                                {\r
-                                       vDiscardRxData();\r
+                                       /* If we are not sending data then let the FEC driver know\r
+                                       the buffer is no longer required. */\r
+                                       vFECRxProcessingCompleted();\r
                                }\r
                        }\r
                        else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )\r
@@ -155,16 +151,20 @@ extern void ( vEMAC_ISR )( void );
                                uip_len is set to a value > 0. */\r
                                if( uip_len > 0 )\r
                                {\r
-                                       vSendBufferToFEC();\r
+                                       vFECSendData();\r
                                }\r
                                else\r
                                {\r
-                                       vDiscardRxData();\r
+                                       /* If we are not sending data then let the FEC driver know\r
+                                       the buffer is no longer required. */\r
+                                       vFECRxProcessingCompleted();\r
                                }\r
                        }\r
                        else\r
                        {\r
-                               vDiscardRxData();\r
+                               /* If we are not sending data then let the FEC driver know\r
+                               the buffer is no longer required. */\r
+                               vFECRxProcessingCompleted();\r
                        }\r
                }\r
                else\r
@@ -182,7 +182,7 @@ extern void ( vEMAC_ISR )( void );
                                        if( uip_len > 0 )\r
                                        {\r
                                                uip_arp_out();\r
-                                               vSendBufferToFEC();\r
+                                               vFECSendData();\r
                                        }\r
                                }\r
 \r
@@ -206,29 +206,5 @@ extern void ( vEMAC_ISR )( void );
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-void vApplicationProcessFormInput( portCHAR *pcInputString )\r
-{\r
-char *c = pcInputString;\r
-\r
-       /* Process the form input sent by the IO page of the served HTML. */\r
-       while( ( *c != '?' ) && ( *c != 0x00 ) )\r
-       {\r
-               c++;\r
-       }\r
-\r
-    if( *c == '?' )\r
-    {\r
-       c++;\r
-               if( strcmp( c, "LED0=1" ) == 0 )\r
-               {\r
-                       vParTestSetLED( 3, 1 );\r
-               }\r
-               else\r
-               {\r
-                       vParTestSetLED( 3, 0 );\r
-               }\r
-    }\r
-}\r
-\r
 \r
 \r