Firefly开源社区

12
发表新贴
打印 上一主题 下一主题

rk3399的eth0网络问题

49

积分

0

威望

0

贡献

技术小白

积分
49

rk3399的eth0网络问题

发表于 2017-12-26 14:30:31      浏览:23265 | 回复:17        打印      只看该作者   [复制链接] 楼主
ubuntu, eth0在高速发送接收一段时间(一般5分钟之内)后会挂掉,ip及route都在,就是不能发送接收,ping也不通,必须down、up一下。
有时出现 NETDEV WATCHDOG timeout,有时什么错误也不提示。

不知道有解决方案了吗?

回复

使用道具 举报

49

积分

0

威望

0

贡献

技术小白

积分
49
发表于 2017-12-26 14:31:46        只看该作者  沙发
下面两位也发现了这个问题:
bbs.t-firefly.com/forum.php?mod=viewthread&tid=1975
github.com/rockchip-linux/kernel/issues/27
回复

使用道具 举报

49

积分

0

威望

0

贡献

技术小白

积分
49
发表于 2017-12-27 11:50:57        只看该作者  板凳
测试程序 Server

/* net-test-server.c
*   gcc -o net-test-server net-test-server.c
*/
#ifdef _WIN32
#include <Winsock2.h>
#include <mstcpip.h>
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
#else
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <time.h>
#include <errno.h>
#endif

#define TEST_TCP_PORT                5495
#define        DATA_SIZE_MAX                (1024*1024)

#ifndef _WIN32
typedef int                                SOCKET;
#endif

#ifdef _MSC_VER
#pragma comment (lib, "Ws2_32.lib")
#ifndef int64_t
typedef __int64 int64_t;
#endif
#ifndef int32_t
typedef int int32_t;
#endif
#ifndef uint8_t
typedef unsigned char uint8_t;
#endif
#endif //_MSC_VER

static SOCKET        g_listen_sock, g_sock;
static void        *g_pBuf = NULL;

static void set_keepalive(SOCKET sock)
{
        const int        one = 1;
#ifdef _WIN32
        struct tcp_keepalive alive_in, alive_out;
        unsigned long        unused = 0;

        alive_in.keepalivetime = 1000; // 1s
        alive_in.keepaliveinterval = 1000; //1s
        alive_in.onoff = TRUE;

        WSAIoctl(sock, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),
                        &alive_out, sizeof(alive_out), &unused, NULL, NULL);
#else
        int keepalive = 1, keepidle = 2, keepinterval = 1,         keepcount = 3;

        setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive));
        setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
        setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
        setsockopt(sock, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));
#endif
        setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&one, sizeof(one));
}

static int read_sock(SOCKET sock, char *buff, int bufflen, int flags)
{
        int n;
   
        while (bufflen > 0)
        {
                n = recv(sock, buff, bufflen, flags);
                if (n > 0)
                {
                        buff += n;
                        bufflen -= n;
                }
                else if (n == 0) return(0);
#ifdef _WIN32
                else if (errno != WSAEWOULDBLOCK)
#else
                else if (errno != EAGAIN && errno != EWOULDBLOCK)
#endif
                {
                        return(0);
                }
    }

        return(1);
}

int init_application()
{
        int                        one = 1;
        struct                sockaddr_in addr;
#ifdef _WIN32
        WORD                wVersionRequested = MAKEWORD(2, 0);
        WSADATA                wsaData;
        if (WSAStartup(wVersionRequested, &wsaData) != 0) return(0);
        srand(GetTickCount());
#else
        struct timespec ts;
        clock_gettime(CLOCK_MONOTONIC, &ts);
        srand(ts.tv_nsec / 1000);
#endif

        g_pBuf = malloc(DATA_SIZE_MAX);
        if(!g_pBuf) return(0);
        memset(g_pBuf, 0, DATA_SIZE_MAX);

    g_listen_sock = socket(AF_INET, SOCK_STREAM, 0);
        if (g_listen_sock == -1) return(0);

        /* re-use */
        setsockopt(g_listen_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));

        addr.sin_family = AF_INET;
        addr.sin_port = htons(TEST_TCP_PORT);
        addr.sin_addr.s_addr = INADDR_ANY;

        if(bind(g_listen_sock, (struct sockaddr *)&addr, sizeof(addr))) return(0);

        if(listen(g_listen_sock, 5)) return(0);

        return(1);
}

int        main()
{
        unsigned char        msg;
        const int        one = 1;

        if(!init_application())
        {
                printf("init app error\n");
                return(1);
        }

        printf("listen ...\n");
        g_sock = accept(g_listen_sock, NULL, NULL);
        if(g_sock == -1)
        {
                printf("accept fail\n");
                return(1);
        }

        /* no delay */
        setsockopt(g_sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one));
        /* keep alive */
        set_keepalive(g_sock);

        printf("transceiving data ...\n");

        while(1)
        {
                int32_t                size;
                size = (int32_t)((int64_t)rand() * DATA_SIZE_MAX / RAND_MAX);
                if(size > DATA_SIZE_MAX) continue;
                /* receive msg */
                if(!read_sock(g_sock, (char*)&msg, sizeof(msg), 0)) break;
                /* send data size */
                if(send(g_sock, (char*)&size, sizeof(size), 0) != sizeof(size)) break;
                /* send data */
                if(send(g_sock, (char*)g_pBuf, size, 0) != size) break;
        }

        printf("connection lost\n");
        return(1);
}
回复

使用道具 举报

49

积分

0

威望

0

贡献

技术小白

积分
49
发表于 2017-12-27 11:51:55        只看该作者  地板
测试程序 Client

/* net-test-client.c
*   gcc -o net-test-client net-test-client.c
*/
#ifdef _WIN32
#include <Winsock2.h>
#include <mstcpip.h>
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
#else
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#endif

#define TEST_TCP_PORT                5495
#define        DATA_SIZE_MAX                (1024*1024)

#ifndef _WIN32
typedef int                                SOCKET;
#endif

#ifdef _MSC_VER
#pragma comment (lib, "Ws2_32.lib")
#ifndef int32_t
typedef int int32_t;
#endif
#ifndef uint8_t
typedef unsigned char uint8_t;
#endif
#endif

static SOCKET g_sock;
static void        *g_pBuf = NULL;

static void set_keepalive(SOCKET sock)
{
        const int        one = 1;
#ifdef _WIN32
        struct tcp_keepalive alive_in, alive_out;
        unsigned long        unused = 0;

        alive_in.keepalivetime = 1000; // 1s
        alive_in.keepaliveinterval = 1000; //1s
        alive_in.onoff = TRUE;

        WSAIoctl(sock, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),
                        &alive_out, sizeof(alive_out), &unused, NULL, NULL);
#else
        int keepalive = 1, keepidle = 2, keepinterval = 1,         keepcount = 3;

        setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive));
        setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
        setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
        setsockopt(sock, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));
#endif
        setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&one, sizeof(one));
}

static int read_sock(SOCKET sock, char *buff, int bufflen, int flags)
{
        int n;
   
        while (bufflen > 0)
        {
                n = recv(sock, buff, bufflen, flags);
                if (n > 0)
                {
                        buff += n;
                        bufflen -= n;
                }
                else if (n == 0) return(0);
#ifdef _WIN32
                else if (errno != WSAEWOULDBLOCK)
#else
                else if (errno != EAGAIN && errno != EWOULDBLOCK)
#endif
                {
                        return(0);
                }
    }

        return(1);
}

static int init_application()
{
        const int        one = 1;
#ifdef _WIN32
        WORD                wVersionRequested = MAKEWORD(2, 0);
        WSADATA                wsaData;

        if (WSAStartup(wVersionRequested, &wsaData) != 0) return(0);
#endif

        g_pBuf = malloc(DATA_SIZE_MAX);
        if(!g_pBuf) return(0);

    g_sock = socket(AF_INET, SOCK_STREAM, 0);
        if (g_sock == -1) return(0);
        /* no delay */
        setsockopt(g_sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one));
        /* keepalive */
        set_keepalive(g_sock);

        return(1);
}

int        main(int argc, char *argv[])
{
        struct                sockaddr_in addr;

        if(argc != 2)
        {
                printf("usage: %s <server>\n", argv[0]);
                return(1);
        }

        if(!init_application())
        {
                printf("init app error\n");
                return(1);
        }

        printf("connecting ...");

        addr.sin_family = AF_INET;
        addr.sin_port = htons(TEST_TCP_PORT);
        addr.sin_addr.s_addr = inet_addr(argv[1]);

        // Connecting
        if(connect(g_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
        {
                printf("fail\n");
                return(1);
        }
        else printf("OK\n");

        printf("transceiving data ...\n");

        while(1)
        {
                uint8_t msg = 1;
                int32_t size;

                /* send msg */
                if(send(g_sock, (char*)&msg, sizeof(msg), 0) != sizeof(msg)) break;
                /* receive data size */
                if(!read_sock(g_sock, (char*)&size, sizeof(size), 0)) break;
                if(size > DATA_SIZE_MAX)
                {
                        printf("buffer overflow\n");
                        return(1);
                }
                /* receive data */
                if(!read_sock(g_sock, (char*)g_pBuf, size, 0)) break;
        }

        printf("connection lost\n");
        return(1);
}
回复

使用道具 举报

49

积分

0

威望

0

贡献

技术小白

积分
49
发表于 2017-12-27 11:54:10        只看该作者  5#
rk3399 运行Server 或者Client都会让网络挂掉,1分钟之内就会挂。
回复

使用道具 举报

49

积分

0

威望

0

贡献

技术小白

积分
49
发表于 2017-12-28 15:25:25        只看该作者  6#
github.com/rockchip-linux/kernel/issues/27
这个人说VDD_LOG电压偏低,把电压调上去就好了。今天测了一下VDD_LOG电压,还真是偏低,手册上推荐0.9V,实测只有0.78V。
回复

使用道具 举报

49

积分

0

威望

0

贡献

技术小白

积分
49
发表于 2017-12-28 22:07:05        只看该作者  7#
果然是电压问题,把电压调上去后OK了。为这破问题,折腾了3个星期。。。
回复

使用道具 举报

25

积分

0

威望

0

贡献

游客

积分
25
发表于 2018-1-30 10:14:23        只看该作者  8#
你好!我也遇到相同相同的问题,请问怎么把电压调上去?
回复

使用道具 举报

49

积分

0

威望

0

贡献

技术小白

积分
49
发表于 2018-3-1 22:50:27        只看该作者  9#
bobo123 发表于 2018-1-30 10:14
你好!我也遇到相同相同的问题,请问怎么把电压调上去?

rk3399-firefly-linux.dts中找到“vdd_log”,修改“rockchip,pwm_voltage”值。由于外围的PWM相关电路的原因,这个值和实际电压不符合,把它设置为1000000就可以了。
回复

使用道具 举报

40

积分

0

威望

0

贡献

游客

积分
40
发表于 2018-3-19 08:24:34        只看该作者  10#
luxinchun 发表于 2018-3-1 22:50
rk3399-firefly-linux.dts中找到“vdd_log”,修改“rockchip,pwm_voltage”值。由于外围的PWM相关电路的 ...

这个文件是在哪个文件夹下面呀,谢谢啦
回复

使用道具 举报

返回列表
12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表