OSDN Git Service

bugfix
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Thu, 17 Oct 2013 07:48:25 +0000 (07:48 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Thu, 17 Oct 2013 07:48:25 +0000 (07:48 +0000)
1.Ethernetドライバの修正。ペリフェラルに設定するパケットサイズが間違っていた。
2.HttpStreamの送信に失敗した場合のエラー伝達不良の修正

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@336 47198e57-cb75-475f-84c4-a814cd6f29e0

lib/Debug/makefile
lib/Debug/sources.mk
lib/src/driver/uip/EthDev.h
lib/src/driver/uip/EthDev_LPC17xx.c
lib/src/driver/uip/EtherDev_DP83848C.c
lib/src/driver/uip/EtherDev_LAN8720.c
lib/src/http/NyLPC_cHttpStream.c
lib/src/uip/NyLPC_uip.h

index 6989ec9..56c17c3 100644 (file)
@@ -26,6 +26,7 @@ RM := rm -rf
 -include src/include/boot/subdir.mk\r
 -include src/http/subdir.mk\r
 -include src/flash/subdir.mk\r
+-include src/econetlite/subdir.mk\r
 -include src/driver/uip/subdir.mk\r
 -include src/driver/irq/subdir.mk\r
 -include src/driver/flash/subdir.mk\r
index 97ddbf6..36dbf18 100644 (file)
@@ -31,6 +31,7 @@ src/mimicvm \
 src/include/boot \
 src/http \
 src/flash \
+src/econetlite \
 src/driver/uip \
 src/driver/irq \
 src/driver/flash \
index aeb1695..99189bd 100644 (file)
@@ -42,8 +42,6 @@ extern "C" {
   Ethernet Device Defines\r
  *----------------------------------------------------------------------------*/\r
 #define EthDev_ADDR_SIZE        6                      /*!< Ethernet Address size in bytes */\r
-#define EthDev_MTU_SIZE         1514                   /*!< Maximum Transmission Unit      */\r
-\r
 \r
 /*----------------------------------------------------------------------------\r
   Ethernet Device Configuration and Control Command Defines\r
index d9fee8d..58e7a0b 100644 (file)
  * TXバッファ\r
  ***********************************************************************/\r
 \r
-//TXバッファの先頭アドレス\r
+/**\r
+ * TXバッファの先頭アドレス\r
+ * Ethernetベースアドレス+RXメモリ領域\r
+ */\r
 #define ETH_TX_BUF_BASE (ETH_BUF_BASE+ETH_FRAG_SIZE*NUM_RX_FRAG)\r
 \r
-#define NUM_OF_1536_BUF 3\r
+#define NUM_OF_MAX_BUF  3\r
 #define NUM_OF_512_BUF  3\r
 #define NUM_OF_256_BUF  4\r
 #define NUM_OF_128_BUF 16\r
 \r
 /**\r
+ * FULLサイズのEthernetFrame送信メモリのサイズ。\r
+ * ここで最大送信サイズを制限する。\r
+ * 通常は1460+20+20+14=1514バイト\r
+ */\r
+#define MAX_TX_ETHERNET_FRAME_SIZE     1514\r
+\r
+/**\r
  * TXメモリブロックの配置\r
- * 12360バイト\r
+ * 9246バイト\r
  */\r
 struct TTxMemoryBlock\r
 {\r
        struct{\r
                struct NyLPC_TTxBufferHeader h;\r
-               NyLPC_TUInt8 b[1536];\r
-       }buf1536[NUM_OF_1536_BUF];//(4+1536)*3=4620\r
+               NyLPC_TUInt8 b[MAX_TX_ETHERNET_FRAME_SIZE];\r
+       }buf_max[NUM_OF_MAX_BUF];//(4+MAX_TX_ETHERNET_FRAME_SIZE(1514))*3=? default=4554\r
        struct{\r
                struct NyLPC_TTxBufferHeader h;\r
                NyLPC_TUInt8 b[512];\r
-       }buf512[NUM_OF_512_BUF];//(4+512)*3=1548\r
+       }buf_512[NUM_OF_512_BUF];//(4+512)*3=1548\r
        struct{\r
                struct NyLPC_TTxBufferHeader h;\r
                NyLPC_TUInt8 b[256];\r
-       }buf256[NUM_OF_256_BUF];//(4+256)*4=1560\r
+       }buf_256[NUM_OF_256_BUF];//(4+256)*4=1560\r
        struct{\r
                struct NyLPC_TTxBufferHeader h;\r
                NyLPC_TUInt8 b[128];\r
-       }buf128[NUM_OF_128_BUF];//(4+128)*16=1584\r
+       }buf_128[NUM_OF_128_BUF];//(4+128)*16=1584\r
 };\r
 \r
 //メモリブロックの定義\r
@@ -63,26 +73,26 @@ int dbg_getNumofUsedTx(void)
        int x;\r
        NyLPC_TUInt8 r1,r2,r3,r4;\r
        r1=r2=r3=r4=0;\r
-       for(x=0;x<NUM_OF_1536_BUF;x++){\r
-               if(_txbuf->buf1536[x].h.is_lock || _txbuf->buf1536[x].h.ref>0){\r
+       for(x=0;x<NUM_OF_MAX_BUF;x++){\r
+               if(_txbuf->buf_max[x].h.is_lock || _txbuf->buf_max[x].h.ref>0){\r
                        r1++;\r
                        continue;\r
                }\r
        }\r
        for(x=0;x<NUM_OF_512_BUF;x++){\r
-               if(_txbuf->buf512[x].h.is_lock || _txbuf->buf512[x].h.ref>0){\r
+               if(_txbuf->buf_512[x].h.is_lock || _txbuf->buf_512[x].h.ref>0){\r
                        r2++;\r
                        continue;\r
                }\r
        }\r
        for(x=0;x<NUM_OF_256_BUF;x++){\r
-               if(_txbuf->buf256[x].h.is_lock || _txbuf->buf256[x].h.ref>0){\r
+               if(_txbuf->buf_256[x].h.is_lock || _txbuf->buf_256[x].h.ref>0){\r
                        r3++;\r
                        continue;\r
                }\r
        }\r
        for(x=0;x<NUM_OF_128_BUF;x++){\r
-               if(_txbuf->buf128[x].h.is_lock || _txbuf->buf128[x].h.ref>0){\r
+               if(_txbuf->buf_128[x].h.is_lock || _txbuf->buf_128[x].h.ref>0){\r
                        r4++;\r
                        continue;\r
                }\r
@@ -104,21 +114,21 @@ void EthDev_LPC17xx_prevTxDescriptor(void)
                TX_STAT_INFO( x ) = 0;\r
        }\r
        //TXバッファを初期化\r
-       for(x=0;x<NUM_OF_1536_BUF;x++){\r
-               _txbuf->buf1536[x].h.is_lock=NyLPC_TUInt8_FALSE;\r
-               _txbuf->buf1536[x].h.ref=0;\r
+       for(x=0;x<NUM_OF_MAX_BUF;x++){\r
+               _txbuf->buf_max[x].h.is_lock=NyLPC_TUInt8_FALSE;\r
+               _txbuf->buf_max[x].h.ref=0;\r
        }\r
        for(x=0;x<NUM_OF_512_BUF;x++){\r
-               _txbuf->buf512[x].h.is_lock=NyLPC_TUInt8_FALSE;\r
-               _txbuf->buf512[x].h.ref=0;\r
+               _txbuf->buf_512[x].h.is_lock=NyLPC_TUInt8_FALSE;\r
+               _txbuf->buf_512[x].h.ref=0;\r
        }\r
        for(x=0;x<NUM_OF_256_BUF;x++){\r
-               _txbuf->buf256[x].h.is_lock=NyLPC_TUInt8_FALSE;\r
-               _txbuf->buf256[x].h.ref=0;\r
+               _txbuf->buf_256[x].h.is_lock=NyLPC_TUInt8_FALSE;\r
+               _txbuf->buf_256[x].h.ref=0;\r
        }\r
        for(x=0;x<NUM_OF_128_BUF;x++){\r
-               _txbuf->buf128[x].h.is_lock=NyLPC_TUInt8_FALSE;\r
-               _txbuf->buf128[x].h.ref=0;\r
+               _txbuf->buf_128[x].h.is_lock=NyLPC_TUInt8_FALSE;\r
+               _txbuf->buf_128[x].h.ref=0;\r
        }\r
        /* Set LPC_EMAC Transmit Descriptor Registers. */\r
        LPC_EMAC->TxDescriptor = TX_DESC_BASE;\r
@@ -147,44 +157,44 @@ struct NyLPC_TTxBufferHeader* EthDev_LPC17xx_allocTxBuf(NyLPC_TUInt16 i_hint,NyL
        }\r
        switch(buf_type){\r
        case 3:\r
-               for(i=0;i<NUM_OF_1536_BUF;i++){\r
+               for(i=0;i<NUM_OF_MAX_BUF;i++){\r
                        //未参照かつ送信中でないもの。\r
-                       if(_txbuf->buf1536[i].h.ref>0 || _txbuf->buf1536[i].h.is_lock){\r
+                       if(_txbuf->buf_max[i].h.ref>0 || _txbuf->buf_max[i].h.is_lock){\r
                                continue;\r
                        }\r
-                       _txbuf->buf1536[i].h.ref++;\r
-                       *o_size=1536;\r
-                       return &(_txbuf->buf1536[i].h);\r
+                       _txbuf->buf_max[i].h.ref++;\r
+                       *o_size=MAX_TX_ETHERNET_FRAME_SIZE;\r
+                       return &(_txbuf->buf_max[i].h);\r
                }\r
        case 2:\r
                for(i=0;i<NUM_OF_512_BUF;i++){\r
                        //未参照かつ送信中でないもの。\r
-                       if(_txbuf->buf512[i].h.ref>0 || _txbuf->buf512[i].h.is_lock){\r
+                       if(_txbuf->buf_512[i].h.ref>0 || _txbuf->buf_512[i].h.is_lock){\r
                                continue;\r
                        }\r
                        *o_size=512;\r
-                       _txbuf->buf512[i].h.ref++;\r
-                       return &(_txbuf->buf512[i].h);\r
+                       _txbuf->buf_512[i].h.ref++;\r
+                       return &(_txbuf->buf_512[i].h);\r
                }\r
        case 1:\r
                for(i=0;i<NUM_OF_256_BUF;i++){\r
                        //未参照かつ送信中でないもの。\r
-                       if(_txbuf->buf256[i].h.ref>0 || (_txbuf->buf256[i].h.is_lock)){\r
+                       if(_txbuf->buf_256[i].h.ref>0 || (_txbuf->buf_256[i].h.is_lock)){\r
                                continue;\r
                        }\r
                        *o_size=256;\r
-                       _txbuf->buf256[i].h.ref++;\r
-                       return &(_txbuf->buf256[i].h);\r
+                       _txbuf->buf_256[i].h.ref++;\r
+                       return &(_txbuf->buf_256[i].h);\r
                }\r
        default:\r
                for(i=0;i<NUM_OF_128_BUF;i++){\r
                        //未参照かつ送信中でないもの。\r
-                       if(_txbuf->buf128[i].h.ref>0 || (_txbuf->buf128[i].h.is_lock)){\r
+                       if(_txbuf->buf_128[i].h.ref>0 || (_txbuf->buf_128[i].h.is_lock)){\r
                                continue;\r
                        }\r
                        *o_size=128;\r
-                       _txbuf->buf128[i].h.ref++;\r
-                       return &(_txbuf->buf128[i].h);\r
+                       _txbuf->buf_128[i].h.ref++;\r
+                       return &(_txbuf->buf_128[i].h);\r
                }\r
        }\r
        return NULL;\r
@@ -279,9 +289,11 @@ void EthDev_LPC17xx_sendTxEthFrame(struct NyLPC_TTxBufferHeader* i_buf,unsigned
        if (i_size > ETH_FRAG_SIZE){\r
                i_size = ETH_FRAG_SIZE;\r
        }\r
+\r
        //送信処理\r
        TX_DESC_PACKET( Index ) = ( unsigned long )(i_buf+1);\r
-       TX_DESC_CTRL( Index ) = ( i_size | TCTRL_LAST | TCTRL_INT );\r
+       //See UM10360.pdf Table 181. Transmit descriptor control word\r
+       TX_DESC_CTRL( Index ) = ((i_size-1) | TCTRL_LAST | TCTRL_INT );\r
        LPC_EMAC->TxProduceIndex = IndexNext;\r
        return;\r
 }\r
index 99207d1..6321ff6 100644 (file)
 #define emacWAIT_FOR_LINK_TO_ESTABLISH_MS 500\r
 \r
 /* Short delay used in several places during the initialisation process. */\r
-#define emacSHORT_DELAY_MS                 2\r
+#define emacSHORT_DELAY_MS                 10\r
 \r
 /* Hardware specific bit definitions. */\r
 #define emacPINSEL2_VALUE           ( 0x50150105 )\r
@@ -200,8 +200,6 @@ static NyLPC_TBool start(const struct NyLPC_TEthAddr* i_eth_addr)
     EthDev_LPC17xx_prevRxDescriptor();\r
     EthDev_LPC17xx_prevTxDescriptor();\r
 \r
-    /* Receive broadcast and perfect match packets */\r
-    LPC_EMAC->RxFilterCtrl = RFC_UCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN;\r
 \r
     /* Setup the PHY. */\r
     prvConfigurePHY();\r
@@ -213,19 +211,19 @@ static NyLPC_TBool start(const struct NyLPC_TEthAddr* i_eth_addr)
     }\r
 \r
     /* Receive Broadcast and Perfect Match Packets */\r
-    LPC_EMAC->RxFilterCtrl = RFC_BCAST_EN | RFC_PERFECT_EN;\r
-\r
-    /* Reset all interrupts */\r
-    LPC_EMAC->IntClear = 0xffff;\r
-\r
-    /* Enable receive and transmit mode of MAC Ethernet core */\r
-    LPC_EMAC->Command |= ( CR_RX_EN | CR_TX_EN );\r
-    LPC_EMAC->MAC1 |= MAC1_REC_EN;\r
+    LPC_EMAC->RxFilterCtrl = RFC_BCAST_EN | RFC_PERFECT_EN | RFC_MCAST_EN;\r
 \r
     //Ethernetの割込み開始設定\r
     NyLPC_cIsr_enterCritical();\r
     {\r
+        /* Reset all interrupts */\r
+        LPC_EMAC->IntClear = 0xffff;\r
         LPC_EMAC->IntEnable = ( INT_RX_DONE | INT_TX_DONE );\r
+\r
+        /* Enable receive and transmit mode of MAC Ethernet core */\r
+        LPC_EMAC->Command |= ( CR_RX_EN | CR_TX_EN );\r
+        LPC_EMAC->MAC1 |= MAC1_REC_EN;\r
+\r
         /* Set the interrupt priority to the max permissible to cause some\r
         interrupt nesting. */\r
         NVIC_SetPriority( ENET_IRQn, configEMAC_INTERRUPT_PRIORITY );\r
@@ -284,7 +282,7 @@ static void prvSetupEMACHardware( void )
 \r
     /* Initialize MAC control registers. */\r
     LPC_EMAC->MAC1 = MAC1_PASS_ALL;\r
-    LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;\r
+    LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN | MAC2_VLAN_PAD_EN;\r
     LPC_EMAC->MAXF = ETH_MAX_FLEN;\r
     LPC_EMAC->CLRT = CLRT_DEF;\r
     LPC_EMAC->IPGR = IPGR_DEF;\r
index c532b31..5a368db 100644 (file)
@@ -97,7 +97,7 @@
 #define emacWAIT_FOR_LINK_TO_ESTABLISH_MS 500\r
 \r
 /* Short delay used in several places during the initialisation process. */\r
-#define emacSHORT_DELAY_MS 2\r
+#define emacSHORT_DELAY_MS 10\r
 \r
 /* Hardware specific bit definitions. */\r
 #define emacPINSEL2_VALUE                      ( 0x50150105 )\r
@@ -194,8 +194,6 @@ static NyLPC_TBool start(const struct NyLPC_TEthAddr* i_eth_addr)
        EthDev_LPC17xx_prevRxDescriptor();\r
        EthDev_LPC17xx_prevTxDescriptor();\r
 \r
-       /* Receive broadcast and perfect match packets */\r
-       LPC_EMAC->RxFilterCtrl = RFC_UCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN;\r
 \r
        /* Setup the PHY. */\r
        prvConfigurePHY();\r
@@ -207,19 +205,18 @@ static NyLPC_TBool start(const struct NyLPC_TEthAddr* i_eth_addr)
        }\r
 \r
        /* Receive Broadcast and Perfect Match Packets */\r
-       LPC_EMAC->RxFilterCtrl = RFC_BCAST_EN | RFC_PERFECT_EN;\r
-\r
-       /* Reset all interrupts */\r
-       LPC_EMAC->IntClear = 0xffff;\r
-\r
-       /* Enable receive and transmit mode of MAC Ethernet core */\r
-       LPC_EMAC->Command |= ( CR_RX_EN | CR_TX_EN );\r
-       LPC_EMAC->MAC1 |= MAC1_REC_EN;\r
+       LPC_EMAC->RxFilterCtrl = RFC_BCAST_EN | RFC_PERFECT_EN | RFC_MCAST_EN;\r
 \r
        //Ethernetの割込み開始設定\r
        NyLPC_cIsr_enterCritical();\r
        {\r
+               /* Reset all interrupts */\r
+               LPC_EMAC->IntClear = 0xffff;\r
                LPC_EMAC->IntEnable = ( INT_RX_DONE | INT_TX_DONE );\r
+               /* Enable receive and transmit mode of MAC Ethernet core */\r
+               LPC_EMAC->Command |= ( CR_RX_EN | CR_TX_EN );\r
+               LPC_EMAC->MAC1 |= MAC1_REC_EN;\r
+\r
                /* Set the interrupt priority to the max permissible to cause some\r
                interrupt nesting. */\r
                NVIC_SetPriority( ENET_IRQn, configEMAC_INTERRUPT_PRIORITY );\r
@@ -279,7 +276,7 @@ static void prvSetupEMACHardware( void )
 \r
        /* Initialize MAC control registers. */\r
        LPC_EMAC->MAC1 = MAC1_PASS_ALL;\r
-       LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;\r
+       LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN | MAC2_VLAN_PAD_EN;\r
        LPC_EMAC->MAXF = ETH_MAX_FLEN;\r
        LPC_EMAC->CLRT = CLRT_DEF;\r
        LPC_EMAC->IPGR = IPGR_DEF;\r
index c49361d..e359921 100644 (file)
@@ -168,7 +168,10 @@ static NyLPC_TBool write_func(void* i_inst,const void* i_data,NyLPC_TInt32 i_len
                memcpy(inst->txb+inst->tx_len,src,free_size);\r
                inst->tx_len+=free_size;\r
                //書き込み\r
-               flush_func(i_inst);\r
+               if(!flush_func(i_inst)){\r
+                       //書込みエラー・・・\r
+                       return NyLPC_TBool_FALSE;\r
+               }\r
                //読み出し位置の調整\r
                l-=free_size;\r
                src+=free_size;\r
index 67f9b3b..85ff27a 100644 (file)
@@ -155,21 +155,7 @@ NyLPC_TUInt16 NyLPC_uip_chksum(NyLPC_TUInt16 sum, const NyLPC_TUInt8 *data, NyLP
  */\r
 #define UIP_MAXRTX      8\r
 \r
-/**\r
- * The maximum number of times a SYN segment should be retransmitted\r
- * before a connection request should be deemed to have been\r
- * unsuccessful.\r
- *\r
- * This should not need to be changed.\r
- */\r
-#define UIP_MAXSYNRTX      5\r
-/**\r
- * How long a connection should stay in the TIME_WAIT state.\r
- *\r
- * This configiration option has no real implication, and it should be\r
- * left untouched.\r
- */\r
-#define UIP_TIME_WAIT_TIMEOUT 120\r
+\r
 \r
 \r
 \r