网卡注册的问题

发布于 2019-08-14 11:18:33    浏览:1607
    本帖最后由 aozima 于 2019-8-15 10:18 编辑


\ | /
- RT - Thread Operating System
/ | \ 3.1.3 build Aug 13 2019
2006 - 2019 Copyright by rt-thread team
found part[0], begin: 4194304, size: 3.652GB
SD Card init OK
File System initialized!
ETH FullDuplex
ETH speed 100M
BIST pass
lwIP-2.0.2 initialized!
TCP/IP initialized!
rtc is not configured
please configure with set_date and set_time
msh />ifconfig
ifconfig: network interface device list error.
msh />
msh />



硬件平台是STM32F207,工程使用Env生成的,初始化都通过,也能ping通板子,但是网卡列表是空的呢?
是不是哪里少了注册的步骤?

查看更多

6 个回答
wuhanstudio
wuhanstudio 2019-08-14
This guy hasn't written anything yet
这里有网卡注册的介绍

k_server
k_server 2019-08-15
This guy hasn't written anything yet
wuhanstudio 发表于 2019-8-14 20:24
这里有网卡注册的介绍

https://www.rt-thread.org/document/site/programming-manual/netdev/netdev/ ...


说明文档里面是这么说的:
###################################################################################################

[p=24, null, left]每一个网卡在初始化完成之后,需要调用网卡注册函数注册网卡到网卡列表中,注册网卡的接口如下所示:[/p]int netdev_register(struct netdev *netdev, const char *name, void *user_data);[table=98%,rgb(252, 252, 252)]
[td][tr][td]参数
[/td][td]描述
[/td][/tr]
[tr][td][align=right]netdev[/td][td][align=right]网卡对象[/td][/tr]
[tr][td][align=right]name[/td][td][align=right]网卡名称[/td][/tr]
[tr][td][align=right]user_data[/td][td][align=right]用户使用数据[/td][/tr]
[tr][td][align=right]返回
[/td][td][align=right]——
[/td][/tr]
[tr][td][align=right]0[/td][td][align=right]网卡注册成功[/td][/tr]
[tr][td][align=right]-1[/td][td][align=right]网卡注册失败[/td][/tr]
[/table][p=24, null, left]该函数不需要在用户层调用,一般为网卡驱动初始化完成之后自动调用,如 esp8266 网卡的注册在 esp8266 设备网络初始化之后自动完成。[/p]###################################################################################################



开始以为系统会自动注册的,结果发现没有;后面我在以下代码添加了一句,网卡就注册上了,不知道这样添加有潜在的问题没:
/* Keep old drivers compatible in RT-Thread */
rt_err_t eth_device_init_with_flag(struct eth_device *dev, const char *name, rt_uint16_t flags)
{
struct netif* netif;

netif = (struct netif*) rt_malloc (sizeof(struct netif));
if (netif == RT_NULL)
{
rt_kprintf("malloc netif failed\n");
return -RT_ERROR;
}
rt_memset(netif, 0, sizeof(struct netif));

/* set netif */
dev->netif = netif;
/* device flags, which will be set to netif flags when initializing */
dev->flags = flags;
/* link changed status of device */
dev->link_changed = 0x00;
dev->parent.type = RT_Device_Class_NetIf;
/* register to RT-Thread device manager */
rt_device_register(&(dev->parent), name, RT_DEVICE_FLAG_RDWR);
rt_sem_init(&(dev->tx_ack), name, 0, RT_IPC_FLAG_FIFO);

/* set name */
netif->name[0] = name[0];
netif->name[1] = name[1];

/* set hw address to 6 */
netif->hwaddr_len = 6;
/* maximum transfer unit */
netif->mtu = ETHERNET_MTU;

/* get hardware MAC address */
rt_device_control(&(dev->parent), NIOCTL_GADDR, netif->hwaddr);

/* set output */
netif->output = etharp_output;
netif->linkoutput = ethernetif_linkoutput;

#if LWIP_NETIF_HOSTNAME
/* Initialize interface hostname */
netif->hostname = "rtthread";
#endif /* LWIP_NETIF_HOSTNAME */

/* if tcp thread has been started up, we add this netif to the system */
if (rt_thread_find("tcpip") != RT_NULL)
{
ip4_addr_t ipaddr, netmask, gw;

#if !LWIP_DHCP
ipaddr.addr = inet_addr(RT_LWIP_IPADDR);
gw.addr = inet_addr(RT_LWIP_GWADDR);
netmask.addr = inet_addr(RT_LWIP_MSKADDR);
#else
IP4_ADDR(&ipaddr, 0, 0, 0, 0);
IP4_ADDR(&gw, 0, 0, 0, 0);
IP4_ADDR(&netmask, 0, 0, 0, 0);
#endif
netifapi_netif_add(netif, &ipaddr, &netmask, &gw, dev, eth_netif_device_init, tcpip_input);
}

#ifdef RT_USING_NETDEV
/* network interface device flags synchronize */
netdev_flags_sync(netif);
eth_netif_device_init(netif);
#endif /* RT_USING_NETDEV */

return RT_EOK;
}


“eth_netif_device_init”这个函数,我看没有调用到,里面就有注册的部分,我就直接在这里加上了。麻烦看看这样合适不?
Cheney_Chen
Cheney_Chen 2019-08-15
This guy hasn't written anything yet
你看看是不是你设备网卡驱动自动初始化等级高于 lwip 自动初始化等级,导致 eth_netif_device_init 函数未被调用,我之前好像遇到过这个问题。
k_server
k_server 2019-08-15
This guy hasn't written anything yet
Cheney_Chen 发表于 2019-8-15 10:10
你看看是不是你设备网卡驱动自动初始化等级高于 lwip 自动初始化等级,导致 eth_netif_device_init 函数未 ...


之前没有开组件自动初始化的宏,今天看了下组件的自动初始化里面好像也没有把网卡驱动给加上去,所以就不敢确定自己加的对不对。
而且STM32F207的默认工程,是没开组件自动初始话,自己即使打开了相关宏定义,发现也有其它问题:components里面rtthread_startup()里面没有对heap的初始化。后面找了个默认开启了组件自动初始化的工程(不是207的工程),对比发现开了组件自动初始话的工程里面heap的初始化被移到了rt_hw_board_init()里面。
所以目前还是暂时采用默认的(未开启组件自动初始话),用的我上面的方式注册了网卡,然后自己添加下面几个组件的初始话:

#ifdef RT_USING_FINSH
/* init finsh */
finsh_system_init();
#endif

#ifdef RT_USING_ULOG
ulog_console_backend_init();
#endif
#ifdef RT_USING_SAL
sal_init();
#endif
rt_work_sys_workqueue_initial();


添加了examples里面的tcpserver到工程,通过msh启动TCP server,log记录如下,但是TCP server却怎么都连不上。是不是还是漏了什么初始化?

\ | /
- RT - Thread Operating System

\ | /
- RT - Thread Operating System
/ | \ 3.1.3 build Aug 15 2019
2006 - 2019 Copyright by rt-thread team
found part[0], begin: 4194304, size: 3.652GB
SD Card init OK
File System initialized!
ETH FullDuplex
ETH speed 100M
BIST pass
lwIP-2.0.2 initialized!
TCP/IP initialized!
rtc is not configured
please configure with set_date and set_time
01-01 00:00:00 I/sal.skt init: Socket Abstraction Layer initialize success.

msh />tcpserver -p 10011
01-01 00:00:17 I/TCP tcp_serv:
TCPServer Waiting for client on port 10011...


后面有添加了mqtt组件测试(都是通过Env生成的工程),但是也总是过不去,log如下:
01-01 00:00:51 D/mqtt.sample mqtt0: inter mqtt_connect_callback!

01-01 00:00:51 D/mqtt mqtt0: ipv4 address port: 1883

01-01 00:00:51 D/mqtt mqtt0: HOST = 'pq6ytz5.mqtt.iot.gz.baidubce.com'

msh />
msh />01-01 00:00:58 E/mqtt mqtt0: getaddrinfo err: 202 'pq6ytz5.mqtt.iot.gz.baidubce.com'

01-01 00:00:58 E/mqtt mqtt0: resolve uri err

01-01 00:00:58 E/mqtt mqtt0: Net connect error(-1).

01-01 00:00:58 D/mqtt.sample mqtt0: inter mqtt_offline_callback!


这个HOST是我自己注册的百度云的,肯定是可以用的
学长啊啊啊
学长啊啊啊 2019-09-04
This guy hasn't written anything yet
楼主,我也遇到这个问题。而且我发现 eth_device_init_with_flag 这个函数都没有被执行到。不知这个函数应该添加在哪里执行?
Lee_Z
Lee_Z 2020-06-10
This guy hasn't written anything yet
楼主问题解决了么

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
1.6k

发布
问题

分享
好友

手机
浏览

扫码手机浏览