OSDN Git Service

bugfix
[mimic/MiMicSDK.git] / lib / src / driver / uip / EthDev_LPC17xx.c
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