소스 검색

更新CPU工程: 优化hv160以太网可以ping通电脑,但是电脑ping不通hv160的问题。

helen 4 일 전
부모
커밋
f239ac0c9c

+ 2 - 2
amt630hv160-freertos-beta/demo/eth_demo/eth_tcp_client_test.c

@@ -31,9 +31,9 @@ sock_start:
 
         if (err == -1) {
             printf("connect fail!\r\n");
-            g_sock = -1;
             closesocket(g_sock);
-            vTaskDelay(pdMS_TO_TICKS(100));
+            g_sock = -1;
+            vTaskDelay(pdMS_TO_TICKS(2000));
             goto sock_start;
         }
 

+ 3 - 2
amt630hv160-freertos-beta/demo/eth_demo/ping_test.c

@@ -1,6 +1,7 @@
 #include "board.h"
 #include "api.h"
 #include "sockets.h"
+#include "inet_chksum.h"
 
 typedef struct icmp_hdr
 
@@ -107,8 +108,8 @@ void ping_test(void)
 	dest.sin_family = AF_INET;
 	dest.sin_port = htons(0);
 	dest.sin_addr.s_addr = ip;
-	//pIcmp->icmp_checksum = checksum((uint16_t*)buff, sizeof(ICMP_HDR) + 32);   //如果ping过去没回应需要屏蔽这条
-	//printf("icmp_checksum = %x\r\n",pIcmp->icmp_checksum);
+	pIcmp->icmp_checksum = inet_chksum((uint16_t*)buff, sizeof(ICMP_HDR) + 32);
+	printf("icmp_checksum = %x\r\n",pIcmp->icmp_checksum);
 	nRet = (long)sendto(sRaw, buff, sizeof(ICMP_HDR) + 32, 0, (struct sockaddr *)&dest, sizeof(dest));
 	if(nRet == -1) {
 		printf(" sendto() failed: %d \r\n", errno);

+ 1 - 1
amt630hv160-freertos-beta/lib/lwip/src/api/sockets.c

@@ -774,7 +774,7 @@ lwip_close(int s)
   int is_tcp = 0;
   err_t err;
 
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_close(%d)\n", s));printf("lwip_close(%d)\r\n", s);
+  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_close(%d)\n", s));
 
   sock = get_socket(s);
   if (!sock) {

+ 8 - 13
amt630hv160-freertos-beta/lib/lwip/src/netif/ethernetif_hv160.c

@@ -344,13 +344,6 @@ static void prvDMATxDescListInit()
         pxDMADescriptor->Buffer1Addr = (uint32_t)pxBuffer->payload;
         dma_inv_range((uint32_t)pxDMADescriptor->Buffer1Addr, (uint32_t)pxDMADescriptor->Buffer1Addr + ETH_TX_BUF_SIZE);
 
-        if( xETH.Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE ) {
-            /* Set the DMA Tx descriptors checksum insertion for TCP, UDP, and ICMP */
-            pxDMADescriptor->Status |= ETH_DMATXDESC_CHECKSUMTCPUDPICMPFULL;
-        } else {
-            pxDMADescriptor->Status &= ~( ( uint32_t ) ETH_DMATXDESC_CHECKSUMTCPUDPICMPFULL );
-        }
-
         /* Initialize the next descriptor with the Next Descriptor Polling Enable */
         if( xIndex < ETH_TXBUFNB - 1 ) {
             /* Set next descriptor address register with next descriptor base address */
@@ -539,11 +532,13 @@ static int ETH_TransmitFrame(const uint8_t *Data, uint32_t Length)
         memcpy((void *)pxDmaTxDesc->Buffer1Addr, Data, ulTransmitSize);
         dma_flush_range((uint32_t)(pxDmaTxDesc->Buffer1Addr), (uint32_t)(pxDmaTxDesc->Buffer1Addr) + ulTransmitSize);
 
-        /* Ask to set the IPv4 checksum.
-         * Also need an Interrupt on Completion so that 'vClearTXBuffers()' will be called.. */
-        {
-            pxDmaTxDesc->Status |= ETH_DMATXDESC_CIC_TCPUDPICMP_FULL | ETH_DMATXDESC_IC;
+        if( xETH.Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE ) {
+            pxDmaTxDesc->Status |= ETH_DMATXDESC_CIC_TCPUDPICMP_FULL;
+        } else {
+            pxDmaTxDesc->Status &= ~ETH_DMATXDESC_CIC_TCPUDPICMP_FULL;
         }
+        pxDmaTxDesc->Status |= ETH_DMATXDESC_IC;
+
 
         /* Prepare transmit descriptors to give to DMA. */
 
@@ -715,7 +710,7 @@ static err_t low_level_init(struct netif *netif)
 #if ETH_AUTONEGOTIATION
     xETH.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
 #else
-    xETH.Init.AutoNegotiation = ETH_AUTONEGOTIATION_DISABLE; 
+    xETH.Init.AutoNegotiation = ETH_AUTONEGOTIATION_DISABLE;
 #endif
     xETH.Init.Speed = ETH_SPEED_100M;
     xETH.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
@@ -857,6 +852,6 @@ err_t ethernetif_init(struct netif *netif)
     netif->linkoutput = low_level_output;
 
     ethernetif->ethaddr = (struct eth_addr *) & (netif->hwaddr[0]);
-    
+
     return low_level_init(netif);
 }